TFIDF計算


計算細節:參見知乎文章“sklearn-TfidfVectorizer徹底說清楚”

1.根據訓練集語料庫,計算出tfidf值

2.計算出測試語句每個詞語的tfidf值(只有當測試語句的詞語在訓練語料庫的dictionary中,測試語句的詞語才會計算tfidf值)

import jieba
from gensim import corpora, similarities, models
sentances = ['我愛你', '我喜歡他和他喜歡我', '他說今天空氣很清新']
test_sent = '我愛你們,我喜歡他'
text = [[word for word in jieba.cut(sentance)]for sentance in sentances]  # 1.把每個句子分詞
dictionary  = corpora.Dictionary(text)  # 2.把每個詞語建立索引,得到索引字典
print('dictionary=', dictionary)
for idx,word in dictionary.items():
    print(idx, word,end="\t")
print()
corpus = [dictionary.doc2bow(word_list) for word_list in text]  # 3.對每句話的每個詞語進行詞頻統計,得到詞頻統計過后的語料corpus
print("[dictionary.doc2bow(word_list) for word_list in text]")
for word_list in text:
    print('\t',word_list, end="\t")
    print(dictionary.doc2bow(word_list))
    
model = models.TfidfModel(corpus)  # 4. corpus輸入到TFIDF模型計算,model保存着有每句話中每個詞語的tfidf值
tfidf = model[corpus]  #  保存着每句話中每個詞語的tfidf值
print('tfidf=',tfidf)
for ele in tfidf:  
    print('\t',ele)

similarity =similarities.MatrixSimilarity(tfidf)  # 用於計算相似度,similarity的輸入參數是tfidf值
print('similarity=', similarity)
for ele in similarity:
    print('\t',ele)
    
test_word_list = [word for word in jieba.cut(test_sent)]
print('test_word_list=',test_word_list)
test_word_freq_count = dictionary.doc2bow(test_word_list)
print('test_word_freq_count=', test_word_freq_count)  # 因為是根據訓練數據得到的dictionary,測試語句只有部分詞語在訓練集中
test_tfidf = model[test_word_freq_count]
print('test_tfidf=', test_tfidf)

sim = similarity[test_tfidf]  # 獲得與所有句子的相似度,訓練集有三個句子,所以sim的長度為3
print("sim=",sim,sim.dtype)
max_sim = max(sim)
print('max_sim=', max_sim, end='\t')
max_index = list(sim).index(max_sim)
print('max_index=', max_index)
# 輸出
dictionary= Dictionary(10 unique tokens: ['我愛你', '', '', '喜歡', '']...)
0 我愛你    1 他    2 和    3 喜歡    4 我    5 今天    6 很    7 清新    8 空氣    9 說    
[dictionary.doc2bow(word_list) for word_list in text]
     ['我愛你']    [(0, 1)]
     ['', '喜歡', '', '', '', '喜歡', '']    [(1, 2), (2, 1), (3, 2), (4, 2)]
     ['', '', '今天', '空氣', '', '清新']    [(1, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]
tfidf= <gensim.interfaces.TransformedCorpus object at 0x000001DD8C472648>
     [(0, 1.0)]
     [(1, 0.23892106670040594), (2, 0.323679663983242), (3, 0.647359327966484), (4, 0.647359327966484)]
     [(1, 0.16284991207632715), (5, 0.44124367556640004), (6, 0.44124367556640004), (7, 0.44124367556640004), (8, 0.44124367556640004), (9, 0.44124367556640004)]
similarity= MatrixSimilarity<3 docs, 10 features>
     [1. 0. 0.]
     [0.         0.99999994 0.03890828]
     [0.         0.03890828 1.        ]
test_word_list= ['', '', '你們', '', '', '喜歡', '']
test_word_freq_count= [(1, 1), (3, 1), (4, 2)]
test_tfidf= [(1, 0.16284991207632712), (3, 0.44124367556640004), (4, 0.8824873511328001)]
sim= [0.        0.8958379 0.0265201] float32
max_sim= 0.8958379    max_index= 1

可以看到,測試語句與訓練語料庫中的第index=1條語句最相似.

tfidf如何表示一個句子:

加入一個句子有n個單詞,每個單詞計算出它的tfidf值,即每個單詞用一個標量表示,則句子的維度是1*n

如果是用embedding表示法,每個單詞用m維向量表示,句子的維度是m*n

 

保存和加載模型的方法:

保存詞典:

dictionary.save(DICT_PATH)

保存tfidf模型:model.save(MODEL_PATH)

保存相似度

similarity.save(SIMILARITY_PATH)

 

加載詞典:

dictionary = corpora.Dictionary.load('require_files/dictionary.dict')

加載模型

tfidf = models.TfidfModel.load("require_files/my_model.tfidf")

加載相似度

index=similarities.MatrixSimilarity.load('require_files/similarities.0')
————————————————
refference:https://blog.csdn.net/qq_33908388/article/details/94554309


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM