Python TF IDF 比較文字相似度

2021-08-28 00:23:16 字數 3109 閱讀 5539

**部分

# -*- coding: utf-8 -*-

# import codecs

import jieba.posseg as pseg

from gensim import corpora, models, similarities

# from hotelmatcher.constant import *

class

tfidf

:""" tf-idf模型比較文字相似度類 """

# 停用詞

stop_words =

['酒店'

,'旅館'

]# 結巴分詞後的停用詞性

# [標點符號、連詞、助詞、副詞、介詞、時語素、『的』、數詞、方位詞、代詞]

stop_flag =

['x'

,'c'

,'u'

,'d'

,'p'

,'t'

,'uj'

,'m'

,'f'

,'r'

]def

__init__

(self)

:# self.ensure_stop_words()

pass

""" def ensure_stop_words(self):

# 停用詞

if self.stop_words is none:

stop_file = path_doc + 'stopwords.txt'

stop_words = codecs.open(stop_file, 'r', encoding='utf8').readlines()

self.stop_words = [w.strip() for w in stop_words]

"""deftext2words

(self, text:

str)

->

list

:""" 對一段文字分詞、去停用詞 """

result =

words = pseg.cut(text)

for word, flag in words:

if word not

in self.stop_words and flag not

in self.stop_flag:

return result

defsimilarity_compare

(self, compare_doc:

str, refer_doc:

list)-

>

tuple

:"""

比較相似度

:param compare_doc: 待比對的文件

:param refer_doc: 基準文件

:return: tuple

"""# 語料庫

refer_words =

placeholder_count =

0for refer_word in refer_doc:

words = self.text2words(refer_word)

if words:

else

:# 確保順序

placeholder_count +=

1'placeholder'

+str

(placeholder_count)))

# 建立語料庫詞袋模型

dictionary = corpora.dictionary(refer_words)

doc_vectors =

[dictionary.doc2bow(word)

for word in refer_words]

# 建立語料庫 tf-idf 模型

tf_idf = models.tfidfmodel(doc_vectors)

tf_idf_vectors = tf_idf[doc_vectors]

compare_vectors = dictionary.doc2bow(self.text2words(compare_doc)

) index = similarities.matrixsimilarity(tf_idf_vectors, num_features=

len(dictionary)

) sims = index[compare_vectors]

# 對結果按相似度由高到低排序

sims =

sorted

(list

(enumerate

(sims)

), key=

lambda x: x[1]

, reverse=

true

)"""

index = similarities.matrixsimilarity(tf_idf_vectors, num_features=len(dictionary), num_best=1)

# 對結果按相似度由高到低排序

sims = index[compare_vectors]

"""return sims[0]

if __name__ ==

'__main__'

: tfidf = tfidf(

) test =

'月亮海灘旅館'

refers =

titles =

list

(refers.keys())

similarity = tfidf.similarity_compare(test, titles)

msg =

"測試酒店 '%s' 和參照酒店中的 '%s' 最相似,相似度為 %f,對應酒店id為:%s" \

%(test, titles[similarity[0]

], similarity[1]

, refers[titles[similarity[0]

]][0

][0]

)print

(msg)

結果展示

文字比較演算法的實現

這段時間很忙,呵呵,沒時間寫blog。前兩天看了乙個文字比較的演算法,演算法的思路我就不多說了,主要說下我的實現。演算法參考 文字比較演算法剖析 1 如何確定最大匹配率 文字比較演算法剖析 2 如何確定最優匹配路徑 我的實現步驟是 1 計算出所有可行的路徑 如下圖中,n l,r 所在的位置如果該位置...

Linux文字比較命令 diff

diff 命令 diff 命令是 linux上非常重要的工具,用於比較檔案的內容,特別是比較兩個版本不同的檔案以找到改動的地方。diff在命令列中列印每乙個行的改動。最新版本的diff還支援二進位制檔案。diff程式的輸出被稱為補丁 patch 因為linux系統中還有乙個patch程式,可以根據d...

Linux文字比較命令 diff

diff 命令 diff 命令是 linux上非常重要的工具,用於比較檔案的內容,特別是比較兩個版本不同的檔案以找到改動的地方。diff在命令列中列印每乙個行的改動。最新版本的diff還支援二進位制檔案。diff程式的輸出被稱為補丁 patch 因為linux系統中還有乙個patch程式,可以根據d...