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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何识别“答非所问”?使用gensim进行文本相似度计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

再比如知乎、貼吧等問答社區內問題下面有很多回復者,如何快速過濾掉與問題無關的回答或者垃圾廣告??

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

使用gensim進行文本相似度計算

原理

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

搜索引擎需要計算“用戶查詢”和爬下來的眾多”網頁“之間的相似度,從而把最相似的排在最前返回給用戶。

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

tf:term frequency 詞頻

idf:inverse document frequency 倒文檔頻率

主要思想是:如果某個詞或短語在一篇文章中出現的頻率高,并且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。

第一步:把每個網頁文本分詞,成為詞包(bag of words)。

第三步:統計網頁(文檔)總數M。

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

第四步:重復第三步,計算出一個網頁所有詞的tf-idf 值。

第五步:重復第四步,計算出所有網頁每個詞的tf-idf 值。

3、處理用戶查詢

第一步:對用戶查詢進行分詞。

第二步:根據網頁庫(文檔)的數據,計算用戶查詢中每個詞的tf-idf 值。

4、相似度的計算

使用余弦相似度來計算用戶查詢和每個網頁之間的夾角。夾角越小,越相似。

學習目標:

  • 利用gensim包分析文檔相似度

  • 使用jieba進行中文分詞

  • 了解TF-IDF模型

  • 注:為了簡化問題,本文沒有剔除停用詞“stop-word”。實際應用中應該要剔除停用詞。

    安裝相關包

    pip install jieba

    pip install gensim

    關于結巴分詞,這里推薦

    https://github.com/WenDesi/zhcnSegment

    已經將主要功能封裝好,包括添加自定義語料,添加停用詞等,簡單、易調用

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

    import jieba from gensim import corpora,models,similarities

    以下doc0-doc7是幾個最簡單的文檔,我們可以稱之為目標文檔,本文就是分析doc_test(測試文檔)與以上8個文檔的相似度。

    doc0 = "我不喜歡上海"
    doc1 = "上海是一個好地方"
    doc2 = "北京是一個好地方"
    doc3 = "上海好吃的在哪里"
    doc4 = "上海好玩的在哪里"
    doc5 = "上海是好地方"
    doc6 = "上海路和上海人"
    doc7 = "喜歡小吃"
    doc_test="我喜歡上海的小吃"

    分詞

    首先,為了簡化操作,把目標文檔放到一個列表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)

    以下對目標文檔進行分詞,并且保存在列表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)

    把分詞后形成的列表顯示出來:

    print(all_doc_list)

    [[‘我’, ‘不’, ‘喜歡’, ‘上海’],
    [‘上海’, ‘是’, ‘一個’, ‘好’, ‘地方’],
    [‘北京’, ‘是’, ‘一個’, ‘好’, ‘地方’],
    [‘上海’, ‘好吃’, ‘的’, ‘在’, ‘哪里’],
    [‘上海’, ‘好玩’, ‘的’, ‘在’, ‘哪里’],
    [‘上海’, ‘是’, ‘好’, ‘地方’],
    [‘上海’, ‘路’, ‘和’, ‘上海’, ‘人’],
    [‘喜歡’, ‘小吃’]]

    以下把測試文檔也進行分詞,并保存在列表doc_test_list中

    doc_test_list = [word for word in jieba.cut(doc_test)] doc_test_list

    [‘我’, ‘喜歡’, ‘上海’, ‘的’, ‘小吃’]

    制作語料庫

    首先用dictionary方法獲取詞袋(bag-of-words)

    dictionary = corpora.Dictionary(all_doc_list)

    詞袋中用數字對所有詞進行了編號

    dictionary.keys()

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]

    編號與詞之間的對應關系

    dictionary.token2id

    {‘一個’: 4,
    ‘上海’: 0,
    ‘不’: 1,
    ‘人’: 14,
    ‘北京’: 8,
    ‘和’: 15,
    ‘哪里’: 9,
    ‘喜歡’: 2,
    ‘在’: 10,
    ‘地方’: 5,
    ‘好’: 6,
    ‘好吃’: 11,
    ‘好玩’: 13,
    ‘小吃’: 17,
    ‘我’: 3,
    ‘是’: 7,
    ‘的’: 12,
    ‘路’: 16}

    以下使用doc2bow制作語料庫

    corpus = [dictionary.doc2bow(doc) for doc in all_doc_list]

    語料庫如下。語料庫是一組向量,向量中的元素是一個二元組(編號、頻次數),對應分詞后的文檔中的每一個詞。

    [[(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)]]

    以下用同樣的方法,把測試文檔也轉換為二元組的向量

    doc_test_vec = dictionary.doc2bow(doc_test_list) doc_test_vec

    [(0, 1), (2, 1), (3, 1), (12, 1), (17, 1)]

    相似度分析

    使用TF-IDF模型對語料庫建模。

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

    因此我們直接拿來用就好


    tfidf = models.TfidfModel(corpus)

    #models.LsiModel()

    #models.LdaModel()

    獲取測試文檔中,每個詞的TF-IDF值

    tfidf[doc_test_vec]

    [(0, 0.08112725037593049),
    (2, 0.3909393754390612),
    (3, 0.5864090631585919),
    (12, 0.3909393754390612),
    (17, 0.5864090631585919)]

    對每個目標文檔,分析測試文檔的相似度

    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)

    根據相似度排序

    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)]

    從分析結果來看,測試文檔與doc7相似度最高,其次是doc0,與doc2的相似度為零。大家可以根據TF-IDF的原理,看看是否符合預期。


    原文發布時間為:2018-09-6

    本文來自云棲社區合作伙伴“大數據挖掘DT機器學習”,了解相關信息可以關注“大數據挖掘DT機器學習”。

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。