Python+gensim實現(xiàn)文本相似度分析詳解
1、gensim使用流程

2、代碼實現(xiàn)
from jieba import lcut
from gensim.similarities import SparseMatrixSimilarity
from gensim.corpora import Dictionary
from gensim.models import TfidfModel
# 文本集和搜索詞
texts = ['吃雞這里所謂的吃雞并不是真的吃雞,也不是諧音詞刺激的意思',
'而是出自策略射擊游戲《絕地求生:大逃殺》里的臺詞',
'我吃雞翅,你吃雞腿']
keyword = '玩過吃雞?今晚一起吃雞'
# 1、將【文本集】生成【分詞列表】
texts = [lcut(text) for text in texts]
# 2、基于文本集建立【詞典】,并獲得詞典特征數(shù)
dictionary = Dictionary(texts)
num_features = len(dictionary.token2id)
# 3.1、基于詞典,將【分詞列表集】轉(zhuǎn)換成【稀疏向量集】,稱作【語料庫】
corpus = [dictionary.doc2bow(text) for text in texts]
# 3.2、同理,用【詞典】把【搜索詞】也轉(zhuǎn)換為【稀疏向量】
kw_vector = dictionary.doc2bow(lcut(keyword))
# 4、創(chuàng)建【TF-IDF模型】,傳入【語料庫】來訓(xùn)練
tfidf = TfidfModel(corpus)
# 5、用訓(xùn)練好的【TF-IDF模型】處理【被檢索文本】和【搜索詞】
tf_texts = tfidf[corpus] # 此處將【語料庫】用作【被檢索文本】
tf_kw = tfidf[kw_vector]
# 6、相似度計算
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))打印結(jié)果
keyword 與 text1 相似度為:0.65
keyword 與 text2 相似度為:0.00
keyword 與 text3 相似度為:0.12
3、過程拆解
3.1、生成分詞列表
對文本集中的文本進(jìn)行 中文分詞,返回分詞列表
格式如下:
[‘word1’, ‘word2’, ‘word3’, …]
import jieba text = '七月七日長生殿,夜半無人私語時。' words = jieba.lcut(text) print(words)
[‘七月’, ‘七日’, ‘長生殿’, ‘,’, ‘夜半’, ‘無人’, ‘私語’, ‘時’, ‘。’]
3.2、基于文本集建立詞典,獲取特征數(shù)
- corpora.Dictionary:建立詞典
- len(dictionary.token2id):詞典中詞的個數(shù)
from gensim import corpora
import jieba
# 文本集
text1 = '堅果果實'
text2 = '堅果實在好吃'
texts = [text1, text2]
# 將文本集生成分詞列表
texts = [jieba.lcut(text) for text in texts]
print('文本集:', texts)
# 基于文本集建立詞典
dictionary = corpora.Dictionary(texts)
print('詞典:', dictionary)
# 提取詞典特征數(shù)
feature_cnt = len(dictionary.token2id)
print('詞典特征數(shù):%d' % feature_cnt)打印結(jié)果
文本集: [[‘堅果’, ‘果實’], [‘堅果’, ‘實在’, ‘好吃’]]
詞典: Dictionary(4 unique tokens: [‘堅果’, ‘果實’, ‘好吃’, ‘實在’])
詞典特征數(shù):4
3.3、基于詞典建立語料庫
語料庫即存放稀疏向量的列表
from gensim import corpora
import jieba
text1 = '來東京吃東京菜'
text2 = '東京啊東京啊東京'
texts = [text1, text2]
texts = [jieba.lcut(text) for text in texts]
dictionary = corpora.Dictionary(texts)
print('詞典(字典):', dictionary.token2id)
# 基于詞典建立新的【語料庫】
corpus = [dictionary.doc2bow(text) for text in texts]
print('語料庫:', corpus)打印結(jié)果
詞典(字典): {‘東京’: 0, ‘吃’: 1, ‘來’: 2, ‘菜’: 3, ‘啊’: 4}
語料庫: [[(0, 2), (1, 1), (2, 1), (3, 1)], [(0, 3), (4, 2)]]
3.3.1、doc2bow函數(shù)
1、將所有單詞取【集合】,并對每個單詞分配一個ID號
以 ['東京', '啊', '東京', '啊', '東京']為例
對單詞分配ID: 東京→ 0; 啊→ 4
變成: [0, 4, 0, 4, 0]
2、轉(zhuǎn)換成 稀疏向量
0有 3個,即表示為( 0, 3)
4有 2個,即表示為( 4, 2)
最終結(jié)果:[( 0, 3), ( 4, 2)]
3.3.2、搜索詞也轉(zhuǎn)成稀疏向量
from gensim import corpora import jieba text1 = '南方醫(yī)院無痛人流' text2 = '北方人流落南方' texts = [text1, text2] texts = [jieba.lcut(text) for text in texts] dictionary = corpora.Dictionary(texts) # 用【詞典】把【搜索詞】也轉(zhuǎn)換為【稀疏向量】 keyword = '無痛人流' kw_vector = dictionary.doc2bow(jieba.lcut(keyword)) print(kw_vector)
[(0, 1), (3, 1)]
3.4、用語料庫訓(xùn)練TF-IDF模型
- TF-IDF是一種統(tǒng)計方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度
from gensim import corpora, models, similarities import jieba text1 = '南方醫(yī)院無痛人流' text2 = '北方人流浪到南方' texts = [text1, text2] texts = [jieba.lcut(text) for text in texts] dictionary = corpora.Dictionary(texts) feature_cnt = len(dictionary.token2id.keys()) corpus = [dictionary.doc2bow(text) for text in texts] # 用語料庫來訓(xùn)練TF-IDF模型 tfidf = models.TfidfModel(corpus) print(tfidf) TfidfModel(num_docs=2, num_nnz=9)
3.5、相似度計算
from gensim import corpora, models, similarities
import jieba
text1 = '無痛人流并非無痛'
text2 = '北方人流浪到南方'
texts = [text1, text2]
keyword = '無痛人流'
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))
# 相似度計算
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相似度計算:')
sim = index[tfidf[new_vec]]
for i in range(len(sim)):
print('第', i+1, '句話的相似度為:', sim[i])
- 注釋

到此這篇關(guān)于Python+gensim實現(xiàn)文本相似度分析詳解的文章就介紹到這了,更多相關(guān)Python文本相似度分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)之函數(shù)基本用法與進(jìn)階詳解
這篇文章主要介紹了Python基礎(chǔ)之函數(shù)基本用法與進(jìn)階,結(jié)合實例形式總結(jié)分析了Python函數(shù)的定義、參數(shù)、返回值及遞歸等相關(guān)使用技巧與操作注意事項,需要的朋友可以參考下2020-01-01
淺談python元素如何去重,去重后如何保持原來元素的順序不變
這篇文章主要介紹了淺談python元素如何去重,去重后如何保持原來元素的順序不變?具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
python linecache 處理固定格式文本數(shù)據(jù)的方法
今天小編就為大家分享一篇python linecache 處理固定格式文本數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
教你怎么用python實現(xiàn)字符串轉(zhuǎn)日期
今天教各位小伙伴怎么用python實現(xiàn)字符串轉(zhuǎn)日期,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴很有幫助,需要的朋友可以參考下2021-05-05
python實現(xiàn)計算資源圖標(biāo)crc值的方法
這篇文章主要介紹了python實現(xiàn)計算資源圖標(biāo)crc值的方法,通過解析資源文件找到icon的數(shù)據(jù),從而實現(xiàn)該功能,需要的朋友可以參考下2014-10-10
Python通過for循環(huán)理解迭代器和生成器實例詳解
這篇文章主要介紹了Python通過for循環(huán)理解迭代器和生成器,結(jié)合實例形式詳細(xì)分析了迭代器和生成器的概念、原理、使用方法及相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
python接口自動化測試之接口數(shù)據(jù)依賴的實現(xiàn)方法
這篇文章主要介紹了python接口自動化測試之接口數(shù)據(jù)依賴的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04

