jupyter_文本特征抽取_2预处理(归一化、停用词、词根处理)

#本Notebook讲解向量归一化问题、停用词、词根
#作者:thirsd
#归一化。对于同一文章重复多次后,根据直观理解,相似度应该是相同的,但直接欧式距离,导致特征比原文章相似度降低,因为欧式距离增加。
#停用词。很多文章中of most等词汇特征缺乏明显性,去除这些无意义的词汇能减低维度,提升效率;并避免影响总体特征
#词根词。对于apple和apples,go\goes\went同一词根,对文本的语义是相近的

####################################归一化#####################################################

#1.1 问题描述
from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer(min_df=1)
#列出所有的帖子
posts=["How to format my disk","hard disk format at","How to format my disk How to format my disk How to format my disk"]
#对于帖子进行词袋转化
x=vectorizer.fit_transform(posts)
print("feature_name:%s" % vectorizer.get_feature_names())

#获取样本数和特征个数
num_samples,num_features=x.shape


#针对新帖子的向量化
newpost="how to format my computer's disk"
new_post_vec=vectorizer.transform([newpost])

#定义文章向量相似度,采用词频向量的欧式距离
import scipy as sp
def dist_raw(v1,v2):
    delta=v1-v2
    return sp.linalg.norm(delta)

feature_name:[u'at', u'disk', u'format', u'hard', u'how', u'my', u'to']



#计算 new_post同所有帖子的欧式距离(dist_raw),记录最相近的一个
import sys
best_doc=None
best_dist=sys.maxint
best_i=None
for i in range(0,num_samples):
    post=posts[i]
    if post==newpost:
        continue
    post_vec=x.getrow(i)
    print("post_vec's shape:%s, new_post_vec's shape:%s" %(post_vec.shape,new_post_vec.shape))
    dist=dist_raw(post_vec.toarray(),new_post_vec.toarray())
    print "=== Post %i with dist=%.2f: %s" %(i,dist,post)
    if dist

你可能感兴趣的:(jupyter_文本特征抽取_2预处理(归一化、停用词、词根处理))