Python基于Gensim實(shí)現(xiàn)文本相似度/匹配/查重
Gensim是基于Python語(yǔ)言的自然語(yǔ)言處理庫(kù),用來(lái)主題建模、文本相似度等文本處理任務(wù)。
Gensim的工作流程包括:分詞、生成詞典、向量化、模型訓(xùn)練等。
LSI模型
import jieba
from gensim import corpora, models, similarities
# 文本數(shù)據(jù)集
data = ['張文宏談為何這個(gè)冬天總生病',
'“為什么這個(gè)冬天我們好像一直在生病?”張文宏這樣說(shuō)→']
# 分詞
token_list = []
for sentence in data:
tokens = [word for word in jieba.lcut(sentence)]
token_list.append(tokens)
print(token_list)
# 詞典,單詞映射唯一ID
dic = corpora.Dictionary(token_list)
# 文本轉(zhuǎn)化為文檔-詞袋(document-term)表示
corpus = [dic.doc2bow(doc) for doc in token_list]
print(corpus)
# 生成模型
lda_model = models.LsiModel(corpus, num_topics=2, id2word=dic)
# 主題及其詞匯
for topic in lda_model.print_topics():
print(topic)
# 索引
index = similarities.MatrixSimilarity(lda_model[corpus])
query = '為什么這個(gè)冬天我們好像一直在生病'
# 預(yù)處理
query_bow = dic.doc2bow(jieba.lcut(query))
# 相似性得分
sims = index[lda_model[query_bow]]
sims = sorted(enumerate(sims), key=lambda item: -item[1])
for document_id, similarity in sims:
print(document_id, similarity)
TFIDF
方案一
import jieba
from gensim import corpora, models, similarities
if __name__ == '__main__':
base_data = [
"好雨知時(shí)節(jié),當(dāng)春乃發(fā)生。隨風(fēng)潛入夜,潤(rùn)物細(xì)無(wú)聲。野徑云俱黑,江船火獨(dú)明。曉看紅濕處,花重錦官城。",
"君問(wèn)歸期未有期,巴山夜雨漲秋池。何當(dāng)共剪西窗燭,卻話巴山夜雨時(shí)。",
"莫聽穿林打葉聲,何妨吟嘯且徐行。竹杖芒鞋輕勝馬,誰(shuí)怕?一蓑煙雨任平生。料峭春風(fēng)吹酒醒,微冷,山頭斜照卻相迎?;厥紫騺?lái)蕭瑟處,歸去,也無(wú)風(fēng)雨也無(wú)晴。",
"天街小雨潤(rùn)如酥,草色遙看近卻無(wú)。最是一年春好處,絕勝煙柳滿皇都。",
"古木陰中系短篷,杖藜扶我過(guò)橋東。沾衣欲濕杏花雨,吹面不寒楊柳風(fēng)。",
"少年聽雨歌樓上。紅燭昏羅帳。壯年聽雨客舟中。江闊云低、斷雁叫西風(fēng)。 而今聽雨僧廬下。鬢已星星也。悲歡離合總無(wú)情。一任階前、點(diǎn)滴到天明。",
"雨里雞鳴一兩家,竹溪村路板橋斜。婦姑相喚浴蠶去,閑看中庭梔子花。",
"一夕輕雷落萬(wàn)絲,霽光浮瓦碧參差。有情芍藥含春淚,無(wú)力薔薇臥曉枝。"
]
# 1.將base_data中的數(shù)據(jù)進(jìn)行遍歷后分詞
base_items = [[i for i in jieba.lcut(item)] for item in base_data]
print(base_items)
# 2.生成詞典
dictionary = corpora.Dictionary(base_items)
# 3.通過(guò)doc2bow稀疏向量生成語(yǔ)料庫(kù)
corpus = [dictionary.doc2bow(item) for item in base_items]
# 4.通過(guò)TF模型算法,計(jì)算出tf值
tf = models.TfidfModel(corpus)
# 5.通過(guò)token2id得到特征數(shù)(字典里面的鍵的個(gè)數(shù))
num_features = len(dictionary.token2id.keys())
# 6.計(jì)算稀疏矩陣相似度,建立一個(gè)索引
index = similarities.MatrixSimilarity(tf[corpus], num_features=num_features)
# 7.處理測(cè)試數(shù)據(jù)
test_text = "風(fēng)雨凄凄,雞鳴喈喈。既見君子,云胡不夷。風(fēng)雨瀟瀟,雞鳴膠膠。既見君子,云胡不瘳。風(fēng)雨如晦,雞鳴不已。既見君子,云胡不喜。"
test_words = [word for word in jieba.cut(test_text)]
print(test_words)
# 8.新的稀疏向量
new_vec = dictionary.doc2bow(test_words)
# 9.算出相似度
sims = index[tf[new_vec]]
print(list(sims))方案二
from jieba import lcut
from gensim.similarities import SparseMatrixSimilarity
from gensim.corpora import Dictionary
from gensim.models import TfidfModel
# 文本集和搜索詞
texts = ['吃雞這里所謂的吃雞并不是真的吃雞,也不是諧音詞刺激的意思',
'而是出自策略射擊游戲《絕地求生:大逃殺》里的臺(tái)詞',
'我吃雞翅,你吃雞腿']
keyword = '玩過(guò)吃雞?今晚一起吃雞'
# 1、將【文本集】生成【分詞列表】
texts = [lcut(text) for text in texts]
# 2、基于文本集建立【詞典】,并獲得詞典特征數(shù)
dictionary = Dictionary(texts)
num_features = len(dictionary.token2id)
# 3.1、基于詞典,將【分詞列表集】轉(zhuǎn)換成【稀疏向量集】,稱作【語(yǔ)料庫(kù)】
corpus = [dictionary.doc2bow(text) for text in texts]
# 3.2、同理,用【詞典】把【搜索詞】也轉(zhuǎn)換為【稀疏向量】
kw_vector = dictionary.doc2bow(lcut(keyword))
# 4、創(chuàng)建【TF-IDF模型】,傳入【語(yǔ)料庫(kù)】來(lái)訓(xùn)練
tfidf = TfidfModel(corpus)
# 5、用訓(xùn)練好的【TF-IDF模型】處理【被檢索文本】和【搜索詞】
tf_texts = tfidf[corpus] # 此處將【語(yǔ)料庫(kù)】用作【被檢索文本】
tf_kw = tfidf[kw_vector]
# 6、相似度計(jì)算
sparse_matrix = SparseMatrixSimilarity(tf_texts, num_features)
similarities = sparse_matrix.get_similarities(tf_kw)
for e, s in enumerate(similarities, 1):
print('kw 與 text%d 相似度為:%.2f' % (e, s))方案三
from gensim import corpora, models, similarities
import jieba
text1 = '無(wú)痛人流并非無(wú)痛'
text2 = '北方人流浪到南方'
texts = [text1, text2]
keyword = '無(wú)痛人流'
texts = [jieba.lcut(text) for text in texts]
dictionary = corpora.Dictionary(texts)
num_features = len(dictionary.token2id)
corpus = [dictionary.doc2bow(text) for text in texts]
tfidf = models.TfidfModel(corpus)
new_vec = dictionary.doc2bow(jieba.lcut(keyword))
# 相似度計(jì)算
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features)
print('\nTF-IDF模型的稀疏向量集:')
for i in tfidf[corpus]:
print(i)
print('\nTF-IDF模型的keyword稀疏向量:')
print(tfidf[new_vec])
print('\n相似度計(jì)算:')
sim = index[tfidf[new_vec]]
for i in range(len(sim)):
print('第', i+1, '句話的相似度為:', sim[i])到此這篇關(guān)于Python基于Gensim實(shí)現(xiàn)文本相似度/匹配/查重的文章就介紹到這了,更多相關(guān)Python Gensim內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Python使用logging庫(kù)進(jìn)行有效日志管理的方法詳解
在開發(fā)大型軟件或處理復(fù)雜問(wèn)題時(shí),我們經(jīng)常需要一種方法來(lái)記錄和跟蹤程序的運(yùn)行狀態(tài),Python 提供了一個(gè)名為 logging 的標(biāo)準(zhǔn)庫(kù),可以幫助我們更好地完成這項(xiàng)任務(wù),在這篇文章中,我們將介紹如何使用 Python 的 logging 庫(kù)進(jìn)行日志記錄2023-06-06
Python繪制分段函數(shù)的實(shí)現(xiàn)示例
本文主要介紹了Python繪制分段函數(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
python如何爬取網(wǎng)站數(shù)據(jù)并進(jìn)行數(shù)據(jù)可視化
這篇文章主要介紹了python爬取拉勾網(wǎng)數(shù)據(jù)并進(jìn)行數(shù)據(jù)可視化,爬取拉勾網(wǎng)關(guān)于python職位相關(guān)的數(shù)據(jù)信息,并將爬取的數(shù)據(jù)已csv各式存入文件,然后對(duì)csv文件相關(guān)字段的數(shù)據(jù)進(jìn)行清洗,并對(duì)數(shù)據(jù)可視化展示,包括柱狀圖展示、直方圖展示,需要的朋友可以參考下2019-07-07
Python實(shí)戰(zhàn)之畫哆啦A夢(mèng)(超詳細(xì)步驟)
這篇文章主要介紹了Python實(shí)戰(zhàn)之畫哆啦A夢(mèng)(超詳細(xì)步驟),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
JSON文件及Python對(duì)JSON文件的讀寫操作
JSON和XML都是互聯(lián)網(wǎng)上數(shù)據(jù)交換的主要載體。這篇文章主要介紹了JSON文件及Python對(duì)JSON文件的讀寫操作,需要的朋友可以參考下2018-10-10
Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列詳解
這篇文章主要介紹了Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列,詳細(xì)分析了隊(duì)列的定義、功能與Python實(shí)現(xiàn)隊(duì)列的相關(guān)技巧,以及具體的用法,需要的朋友可以參考下2015-04-04
Pandas庫(kù)中dataframe.corr()函數(shù)的使用
dataframe.corr()是Pandas庫(kù)中的一個(gè)函數(shù),用于計(jì)算DataFrame中各列之間的相關(guān)系數(shù),本文主要介紹了Pandas庫(kù)中dataframe.corr()函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
python實(shí)現(xiàn)鄰接表轉(zhuǎn)鄰接矩陣
這篇文章主要介紹了python實(shí)現(xiàn)鄰接表轉(zhuǎn)鄰接矩陣,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

