Python實(shí)現(xiàn)簡(jiǎn)單的文本相似度分析操作詳解
本文實(shí)例講述了Python實(shí)現(xiàn)簡(jiǎn)單的文本相似度分析操作。分享給大家供大家參考,具體如下:
學(xué)習(xí)目標(biāo):
1.利用gensim包分析文檔相似度
2.使用jieba進(jìn)行中文分詞
3.了解TF-IDF模型
環(huán)境:
Python 3.6.0 |Anaconda 4.3.1 (64-bit)
工具:
jupyter notebook
注:為了簡(jiǎn)化問(wèn)題,本文沒(méi)有剔除停用詞“stop-word”。實(shí)際應(yīng)用中應(yīng)該要剔除停用詞。
首先引入分詞API庫(kù)jieba、文本相似度庫(kù)gensim
import jieba from gensim import corpora,models,similarities
以下doc0-doc7是幾個(gè)最簡(jiǎn)單的文檔,我們可以稱(chēng)之為目標(biāo)文檔,本文就是分析doc_test(測(cè)試文檔)與以上8個(gè)文檔的相似度。
doc0 = "我不喜歡上海"
doc1 = "上海是一個(gè)好地方"
doc2 = "北京是一個(gè)好地方"
doc3 = "上海好吃的在哪里"
doc4 = "上海好玩的在哪里"
doc5 = "上海是好地方"
doc6 = "上海路和上海人"
doc7 = "喜歡小吃"
doc_test="我喜歡上海的小吃"
分詞
首先,為了簡(jiǎn)化操作,把目標(biāo)文檔放到一個(gè)列表all_doc中。
all_doc = [] all_doc.append(doc0) all_doc.append(doc1) all_doc.append(doc2) all_doc.append(doc3) all_doc.append(doc4) all_doc.append(doc5) all_doc.append(doc6) all_doc.append(doc7)
以下對(duì)目標(biāo)文檔進(jìn)行分詞,并且保存在列表all_doc_list中
all_doc_list = [] for doc in all_doc: doc_list = [word for word in jieba.cut(doc)] all_doc_list.append(doc_list)
把分詞后形成的列表顯示出來(lái):
print(all_doc_list)
[['我', '不', '喜歡', '上海'],
['上海', '是', '一個(gè)', '好', '地方'],
['北京', '是', '一個(gè)', '好', '地方'],
['上海', '好吃', '的', '在', '哪里'],
['上海', '好玩', '的', '在', '哪里'],
['上海', '是', '好', '地方'],
['上海', '路', '和', '上海', '人'],
['喜歡', '小吃']]
以下把測(cè)試文檔也進(jìn)行分詞,并保存在列表doc_test_list中
doc_test_list = [word for word in jieba.cut(doc_test)] doc_test_list
['我', '喜歡', '上海', '的', '小吃']
制作語(yǔ)料庫(kù)
首先用dictionary方法獲取詞袋(bag-of-words)
dictionary = corpora.Dictionary(all_doc_list)
詞袋中用數(shù)字對(duì)所有詞進(jìn)行了編號(hào)
dictionary.keys()
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
編號(hào)與詞之間的對(duì)應(yīng)關(guān)系
dictionary.token2id
{'一個(gè)': 4,
'上海': 0,
'不': 1,
'人': 14,
'北京': 8,
'和': 15,
'哪里': 9,
'喜歡': 2,
'在': 10,
'地方': 5,
'好': 6,
'好吃': 11,
'好玩': 13,
'小吃': 17,
'我': 3,
'是': 7,
'的': 12,
'路': 16}
以下使用doc2bow制作語(yǔ)料庫(kù)
corpus = [dictionary.doc2bow(doc) for doc in all_doc_list]
語(yǔ)料庫(kù)如下。語(yǔ)料庫(kù)是一組向量,向量中的元素是一個(gè)二元組(編號(hào)、頻次數(shù)),對(duì)應(yīng)分詞后的文檔中的每一個(gè)詞。
[[(0, 1), (1, 1), (2, 1), (3, 1)],
[(0, 1), (4, 1), (5, 1), (6, 1), (7, 1)],
[(4, 1), (5, 1), (6, 1), (7, 1), (8, 1)],
[(0, 1), (9, 1), (10, 1), (11, 1), (12, 1)],
[(0, 1), (9, 1), (10, 1), (12, 1), (13, 1)],
[(0, 1), (5, 1), (6, 1), (7, 1)],
[(0, 2), (14, 1), (15, 1), (16, 1)],
[(2, 1), (17, 1)]]
以下用同樣的方法,把測(cè)試文檔也轉(zhuǎn)換為二元組的向量
doc_test_vec = dictionary.doc2bow(doc_test_list) doc_test_vec
[(0, 1), (2, 1), (3, 1), (12, 1), (17, 1)]
相似度分析
使用TF-IDF模型對(duì)語(yǔ)料庫(kù)建模
tfidf = models.TfidfModel(corpus)
獲取測(cè)試文檔中,每個(gè)詞的TF-IDF值
tfidf[doc_test_vec]
[(0, 0.08112725037593049),
(2, 0.3909393754390612),
(3, 0.5864090631585919),
(12, 0.3909393754390612),
(17, 0.5864090631585919)]
對(duì)每個(gè)目標(biāo)文檔,分析測(cè)試文檔的相似度
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys())) sim = index[tfidf[doc_test_vec]] sim
array([ 0.54680777, 0.01055349, 0. , 0.17724207, 0.17724207,
0.01354522, 0.01279765, 0.70477605], dtype=float32)
根據(jù)相似度排序
sorted(enumerate(sim), key=lambda item: -item[1])
[(7, 0.70477605),
(0, 0.54680777),
(3, 0.17724207),
(4, 0.17724207),
(5, 0.013545224),
(6, 0.01279765),
(1, 0.010553493),
(2, 0.0)]
從分析結(jié)果來(lái)看,測(cè)試文檔與doc7相似度最高,其次是doc0,與doc2的相似度為零。大家可以根據(jù)TF-IDF的原理,看看是否符合預(yù)期。
最后總結(jié)一下文本相似度分析的步驟:
1、讀取文檔
2、對(duì)要計(jì)算的多篇文檔進(jìn)行分詞
3、對(duì)文檔進(jìn)行整理成指定格式,方便后續(xù)進(jìn)行計(jì)算
4、計(jì)算出詞語(yǔ)的詞頻
5、【可選】對(duì)詞頻低的詞語(yǔ)進(jìn)行過(guò)濾
6、建立語(yǔ)料庫(kù)詞典
7、加載要對(duì)比的文檔
8、將要對(duì)比的文檔通過(guò)doc2bow轉(zhuǎn)化為詞袋模型
9、對(duì)詞袋模型進(jìn)行進(jìn)一步處理,得到新語(yǔ)料庫(kù)
10、將新語(yǔ)料庫(kù)通過(guò)tfidfmodel進(jìn)行處理,得到tfidf
11、通過(guò)token2id得到特征數(shù)
12、稀疏矩陣相似度,從而建立索引
13、得到最終相似度結(jié)果
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
wxpython中利用線程防止假死的實(shí)現(xiàn)方法
上午抽空學(xué)習(xí)了一下在wxpython中啟用線程的方法,將GUI和功能的執(zhí)行分開(kāi),果然程序運(yùn)行起來(lái)杠杠滴。因?yàn)槲夷莻€(gè)軟件的代碼暫時(shí)不能公開(kāi),這里專(zhuān)門(mén)寫(xiě)個(gè)小程序,作為今天的筆記吧2014-08-08Pandas||過(guò)濾缺失數(shù)據(jù)||pd.dropna()函數(shù)的用法說(shuō)明
這篇文章主要介紹了Pandas||過(guò)濾缺失數(shù)據(jù)||pd.dropna()函數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05TensorFlow卷積神經(jīng)網(wǎng)絡(luò)之使用訓(xùn)練好的模型識(shí)別貓狗圖片
今天小編就為大家分享一篇關(guān)于TensorFlow卷積神經(jīng)網(wǎng)絡(luò)之使用訓(xùn)練好的模型識(shí)別貓狗圖片,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03使用python模塊plotdigitizer摳取論文圖片中的數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了使用python模塊plotdigitizer摳取論文圖片中的數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Python類(lèi)和對(duì)象的定義與實(shí)際應(yīng)用案例分析
這篇文章主要介紹了Python類(lèi)和對(duì)象的定義與實(shí)際應(yīng)用,結(jié)合三個(gè)具體案例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類(lèi)與對(duì)象的定義、應(yīng)用、設(shè)計(jì)模式等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Python利用pandas和matplotlib實(shí)現(xiàn)繪制圓環(huán)圖
在可視化的過(guò)程中,圓環(huán)圖是一種常用的方式,特別適合于展示各類(lèi)別占比情況,本文將介紹如何使用 Python中的 pandas 和 matplotlib 庫(kù),來(lái)制作一個(gè)店鋪銷(xiāo)量占比的圓環(huán)圖,需要的可以參考下2023-11-11python基礎(chǔ)教程之五種數(shù)據(jù)類(lèi)型詳解
這篇文章主要介紹了python基礎(chǔ)教程之五種數(shù)據(jù)類(lèi)型詳解的相關(guān)資料,這里對(duì)Python 的數(shù)據(jù)類(lèi)型進(jìn)行了詳細(xì)介紹,需要的朋友可以參考下2017-01-01