Python+gensim實(shí)現(xiàn)文本相似度分析詳解
1、gensim使用流程
2、代碼實(shí)現(xiàn)
from jieba import lcut from gensim.similarities import SparseMatrixSimilarity from gensim.corpora import Dictionary from gensim.models import TfidfModel # 文本集和搜索詞 texts = ['吃雞這里所謂的吃雞并不是真的吃雞,也不是諧音詞刺激的意思', '而是出自策略射擊游戲《絕地求生:大逃殺》里的臺(tái)詞', '我吃雞翅,你吃雞腿'] 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、相似度計(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))
打印結(jié)果
keyword 與 text1 相似度為:0.65
keyword 與 text2 相似度為:0.00
keyword 與 text3 相似度為:0.12
3、過程拆解
3.1、生成分詞列表
對(duì)文本集中的文本進(jìn)行 中文分詞,返回分詞列表
格式如下:
[‘word1’, ‘word2’, ‘word3’, …]
import jieba text = '七月七日長生殿,夜半無人私語時(shí)。' words = jieba.lcut(text) print(words)
[‘七月’, ‘七日’, ‘長生殿’, ‘,’, ‘夜半’, ‘無人’, ‘私語’, ‘時(shí)’, ‘。’]
3.2、基于文本集建立詞典,獲取特征數(shù)
- corpora.Dictionary:建立詞典
- len(dictionary.token2id):詞典中詞的個(gè)數(shù)
from gensim import corpora import jieba # 文本集 text1 = '堅(jiān)果果實(shí)' text2 = '堅(jiān)果實(shí)在好吃' 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é)果
文本集: [[‘堅(jiān)果’, ‘果實(shí)’], [‘堅(jiān)果’, ‘實(shí)在’, ‘好吃’]]
詞典: Dictionary(4 unique tokens: [‘堅(jiān)果’, ‘果實(shí)’, ‘好吃’, ‘實(shí)在’])
詞典特征數(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、將所有單詞取【集合】,并對(duì)每個(gè)單詞分配一個(gè)ID號(hào)
以 ['東京', '啊', '東京', '啊', '東京']
為例
對(duì)單詞分配ID: 東京
→ 0
; 啊
→ 4
變成: [0, 4, 0, 4, 0]
2、轉(zhuǎn)換成 稀疏向量
0有 3
個(gè),即表示為( 0, 3
)
4有 2
個(gè),即表示為( 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)計(jì)方法,用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語料庫中的其中一份文件的重要程度
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、相似度計(jì)算
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)) # 相似度計(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文本相似度分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)之函數(shù)基本用法與進(jìn)階詳解
這篇文章主要介紹了Python基礎(chǔ)之函數(shù)基本用法與進(jìn)階,結(jié)合實(shí)例形式總結(jié)分析了Python函數(shù)的定義、參數(shù)、返回值及遞歸等相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01淺談python元素如何去重,去重后如何保持原來元素的順序不變
這篇文章主要介紹了淺談python元素如何去重,去重后如何保持原來元素的順序不變?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02python linecache 處理固定格式文本數(shù)據(jù)的方法
今天小編就為大家分享一篇python linecache 處理固定格式文本數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01教你怎么用python實(shí)現(xiàn)字符串轉(zhuǎn)日期
今天教各位小伙伴怎么用python實(shí)現(xiàn)字符串轉(zhuǎn)日期,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴很有幫助,需要的朋友可以參考下2021-05-05python實(shí)現(xiàn)計(jì)算資源圖標(biāo)crc值的方法
這篇文章主要介紹了python實(shí)現(xiàn)計(jì)算資源圖標(biāo)crc值的方法,通過解析資源文件找到icon的數(shù)據(jù),從而實(shí)現(xiàn)該功能,需要的朋友可以參考下2014-10-10Python通過for循環(huán)理解迭代器和生成器實(shí)例詳解
這篇文章主要介紹了Python通過for循環(huán)理解迭代器和生成器,結(jié)合實(shí)例形式詳細(xì)分析了迭代器和生成器的概念、原理、使用方法及相關(guān)操作技巧,需要的朋友可以參考下2019-02-02python接口自動(dòng)化測試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法
這篇文章主要介紹了python接口自動(dòng)化測試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04