利用sklearn計算文字相似性

sherri_du發表於2016-08-03

 

利用sklearn計算文字相似性,並將文字之間的相似度矩陣儲存到檔案當中。這裡提取文字TF-IDF特徵值進行文字的相似性計算。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/python  
# -*- coding: utf-8 -*-
import numpy
import os
import sys
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
reload(sys)
#sys.setdefaultencoding('utf8')了 網易 杭研 大廈","小明 碩士 畢業 與 中國 科學院","我 愛 北京 天安門"]
trainfile = open("C:\\Users\\hd\\Desktop\\docs.txt","r") #不同的documents用換行符隔開
traincorpus = trainfile.readlines()
 
#corpus=["我 來到 北京 清華大學","我 他 來到
trainfile.close()
corpus = traincorpus;
     
vectorizer=CountVectorizer()#該類會將文字中的詞語轉換為詞頻矩陣,矩陣元素a[i][j] 表示j詞在i類文字下的詞頻
tfidf_vectorizer = TfidfVectorizer(max_df=0.95, min_df=2, #max_features=n_features,
                                   stop_words='english')
transformer=TfidfTransformer()#該類會統計每個詞語的tf-idf權值
tfidf=transformer.fit_transform(tfidf_vectorizer.fit_transform(corpus))#第一個fit_transform是計算tf-idf,第二個fit_transform是將文字轉為詞頻矩陣
word=tfidf_vectorizer.get_feature_names()#獲取詞袋模型中的所有詞語
weight=tfidf.toarray()#將tf-idf矩陣抽取出來,元素a[i][j]表示j詞在i類文字中的tf-idf權重
f = open("C:\\Users\\hd\\Desktop\\tif.txt","w+")
for i in range(len(weight)):#列印每類文字的tf-idf詞語權重,第一個for遍歷所有文字,第二個for便利某一類文字下的詞語權重
#         print u"-------這裡輸出第",i,u"類文字的詞語tf-idf權重------"
    f.write(str(i+1)+"\t")
    for j in range(len(word)):
        if(weight[i][j]>0): f.write(str(j+1) + ":" + str(weight[i][j]) + " ")
    f.write("\n")
    print i
f.close()
f = open("C:\\Users\\hd\\Desktop\\dictionary.txt","w+")
for i in range(len(word)):
    f.write(str(i) + "\t" + word[i].encode("utf-8") + "\n")
f.close()
 
SimMatrix = (tfidf * tfidf.T).A
print SimMatrix[1,3] #"第一篇與第4篇的相似度"
 
numpy.savetxt("C:\\Users\\hd\\Desktop\\SimMatrix.csv", SimMatrix, delimiter=",") #儲存相似度矩陣

  


相關文章