日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

文本相似度计算python lda_如何识别“答非所问”?使用gensim进行文本相似度计算...

發(fā)布時(shí)間:2024/4/19 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文本相似度计算python lda_如何识别“答非所问”?使用gensim进行文本相似度计算... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在文本處理中,比如商品評(píng)論挖掘,有時(shí)需要了解每個(gè)評(píng)論分別和商品的描述之間的相似度,以此衡量評(píng)論的客觀性。

評(píng)論和商品描述的相似度越高,說(shuō)明評(píng)論的用語(yǔ)比較官方,不帶太多感情色彩,比較注重描述商品的屬性和特性,角度更客觀。

再比如知乎、貼吧等問(wèn)答社區(qū)內(nèi)問(wèn)題下面有很多回復(fù)者,如何快速過(guò)濾掉與問(wèn)題無(wú)關(guān)的回答或者垃圾廣告??

那么Python 里面有計(jì)算文本相似度的程序包嗎,恭喜你,不僅有,而且很好很強(qiáng)大。

使用gensim進(jìn)行文本相似度計(jì)算

原理

1、文本相似度計(jì)算的需求始于搜索引擎。

搜索引擎需要計(jì)算“用戶查詢”和爬下來(lái)的眾多”網(wǎng)頁(yè)“之間的相似度,從而把最相似的排在最前返回給用戶。

2、主要使用的算法是tf-idf

tf:term frequency 詞頻

idf:inverse document frequency 倒文檔頻率

主要思想是:如果某個(gè)詞或短語(yǔ)在一篇文章中出現(xiàn)的頻率高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語(yǔ)具有很好的類別區(qū)分能力,適合用來(lái)分類。

第一步:把每個(gè)網(wǎng)頁(yè)文本分詞,成為詞包(bag of words)。

第三步:統(tǒng)計(jì)網(wǎng)頁(yè)(文檔)總數(shù)M。

第三步:統(tǒng)計(jì)第一個(gè)網(wǎng)頁(yè)詞數(shù)N,計(jì)算第一個(gè)網(wǎng)頁(yè)第一個(gè)詞在該網(wǎng)頁(yè)中出現(xiàn)的次數(shù)n,再找出該詞在所有文檔中出現(xiàn)的次數(shù)m。則該詞的tf-idf 為:n/N * 1/(m/M) (還有其它的歸一化公式,這里是最基本最直觀的公式)

第四步:重復(fù)第三步,計(jì)算出一個(gè)網(wǎng)頁(yè)所有詞的tf-idf 值。

第五步:重復(fù)第四步,計(jì)算出所有網(wǎng)頁(yè)每個(gè)詞的tf-idf 值。

3、處理用戶查詢

第一步:對(duì)用戶查詢進(jìn)行分詞。

第二步:根據(jù)網(wǎng)頁(yè)庫(kù)(文檔)的數(shù)據(jù),計(jì)算用戶查詢中每個(gè)詞的tf-idf 值。

4、相似度的計(jì)算

使用余弦相似度來(lái)計(jì)算用戶查詢和每個(gè)網(wǎng)頁(yè)之間的夾角。夾角越小,越相似。

學(xué)習(xí)目標(biāo):

利用gensim包分析文檔相似度

使用jieba進(jìn)行中文分詞

了解TF-IDF模型

注:為了簡(jiǎn)化問(wèn)題,本文沒(méi)有剔除停用詞“stop-word”。實(shí)際應(yīng)用中應(yīng)該要剔除停用詞。

安裝相關(guān)包

pip install jieba

pip install gensim

關(guān)于結(jié)巴分詞,這里推薦

https://github.com/WenDesi/zhcnSegment

已經(jīng)將主要功能封裝好,包括添加自定義語(yǔ)料,添加停用詞等,簡(jiǎn)單、易調(diào)用

首先引入分詞API庫(kù)jieba、文本相似度庫(kù)gensim

importjieba

fromgensimimportcorpora,models,similarities

以下doc0-doc7是幾個(gè)最簡(jiǎn)單的文檔,我們可以稱之為目標(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 = []fordoc in all_doc:

doc_list = [wordforwordin 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 = [wordforwordin 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)

fordocinall_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ù)建模。

gensim包提供了這幾個(gè)模型: TF-IDF、LSI 、LDA

因此我們直接拿來(lái)用就好

tfidf =models.TfidfModel(corpus)

#models.LsiModel()

#models.LdaModel()

獲取測(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ù)期。

原文發(fā)布時(shí)間為:2018-09-6

本文來(lái)自云棲社區(qū)合作伙伴“大數(shù)據(jù)挖掘DT機(jī)器學(xué)習(xí)”,了解相關(guān)信息可以關(guān)注“大數(shù)據(jù)挖掘DT機(jī)器學(xué)習(xí)”。

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的文本相似度计算python lda_如何识别“答非所问”?使用gensim进行文本相似度计算...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。