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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【TF-IDF】传统方法TF-IDF解决短文本相似度问题

發(fā)布時(shí)間:2025/3/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【TF-IDF】传统方法TF-IDF解决短文本相似度问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

機(jī)器學(xué)習(xí)算法與自然語言處理出品

@公眾號原創(chuàng)專欄作者 劉聰NLP

學(xué)校 |?中國藥科大學(xué) 藥學(xué)信息學(xué)碩士

知乎專欄 | 自然語言處理相關(guān)論文

前幾天寫了一篇短文本相似度算法研究的文章,不過里面介紹的方法基本上都是基于詞向量生成句子向量的方法。今天在這里就介紹一下傳統(tǒng)算法TF-IDF是如何計(jì)算短文本相似度的。

TF-IDF是英文Term Frequency–Inverse Document Frequency的縮寫,中文叫做詞頻-逆文檔頻率。

那么,TF-IDF是怎么產(chǎn)生的?又是從何而來呢?

在一個(gè)文本中,當(dāng)一個(gè)詞匯出現(xiàn)很多次時(shí),我們往往認(rèn)為這個(gè)詞是重要的,可以代表該文本。但是事實(shí)不是這樣的,比如:“的”這個(gè)詞,雖然在一個(gè)文本中出現(xiàn)很多次,但是它依然沒有什么實(shí)際意義。而人們想要給文本中每個(gè)詞在語義表達(dá)中,賦予一定的權(quán)重,就出現(xiàn)了TF-IDF算法。

它由TF(詞頻)和IDF(逆文檔頻率)組成,其中,TF(詞頻)計(jì)算如下:

理論上,詞匯出現(xiàn)的次數(shù)就應(yīng)該是詞匯的頻率。我們這里除以文本詞匯總個(gè)數(shù),是為了排除文本長度的影響,獲取到該詞在文本中的相對重要程度。

IDF(逆文檔頻率)計(jì)算如下:

上面我們說過,有一些雖然在一個(gè)文本中出現(xiàn)很多次,但是它依然沒有什么實(shí)際意義,比如:“的”。而IDF逆文檔頻率是衡量該詞匯是否可以充分表示該文本的參數(shù)。IDF值越大,說明包含該詞匯的文本越少,則該詞匯越能夠代表該文本。

TF-IDF則是由TF和IDF相乘得到,如下:

它的含義是,如果一個(gè)詞,在該文本中出現(xiàn)次數(shù)越多,而在其他文本中出現(xiàn)很少時(shí),則該詞匯越能夠表示該文本的信息。

實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。講完理論之后,我來看看具體任務(wù)上,我們要如何去使用TF-IDF。上一篇短文本相似度算法研究?文章中,我們舉過這樣一個(gè)場景,在問答系統(tǒng)任務(wù)(問答機(jī)器人)中,我們往往會(huì)人為地配置一些常用并且描述清晰的問題及其對應(yīng)的回答,我們將這些配置好的問題稱之為“標(biāo)準(zhǔn)問”。當(dāng)用戶進(jìn)行提問時(shí),常常將用戶的問題與所有配置好的標(biāo)準(zhǔn)問進(jìn)行相似度計(jì)算,找出與用戶問題最相似的標(biāo)準(zhǔn)問,并返回其答案給用戶,這樣就完成了一次問答操作。

根據(jù)上述例子,我們進(jìn)行coding,TF-IDF類定義具體如下:

import numpy as np class TF_IDF_Model(object):def __init__(self, documents_list):self.documents_list = documents_listself.documents_number = len(documents_list)self.tf = []self.idf = {}self.init()def init(self):df = {}for document in self.documents_list:temp = {}for word in document:temp[word] = temp.get(word, 0) + 1/len(document)self.tf.append(temp)for key in temp.keys():df[key] = df.get(key, 0) + 1for key, value in df.items():self.idf[key] = np.log(self.documents_number / (value + 1))def get_score(self, index, query):score = 0.0for q in query:if q not in self.tf[index]:continuescore += self.tf[index][q] * self.idf[q]return scoredef get_documents_score(self, query):score_list = []for i in range(self.documents_number):score_list.append(self.get_score(i, query))return score_list

其中,documents_list 表示需要輸入的文本列表,內(nèi)部每個(gè)文本需要事先分好詞;documents_number表示文本總個(gè)數(shù);tf 用于存儲(chǔ)每個(gè)文本中每個(gè)詞的詞頻;idf用于存儲(chǔ)每個(gè)詞匯的逆文檔頻率;init函數(shù)是類初始化函數(shù),用于求解文本集合中的tf和idf變量;get_score函數(shù)是獲取一個(gè)文本與文本列表中一個(gè)文本的tf-idf相似度值;get_documents_score函數(shù)是獲取一個(gè)文本與文本列表中所有文本的tf-idf相似度值。

定義好的TF-IDF類如何去使用呢?具體如下:

首先,給出文本集合,也就是我們上文場景中提到的“標(biāo)準(zhǔn)問”庫;

document_list = ["行政機(jī)關(guān)強(qiáng)行解除行政協(xié)議造成損失,如何索取賠償?","借錢給朋友到期不還得什么時(shí)候可以起訴?怎么起訴?","我在微信上被騙了,請問被騙多少錢才可以立案?","公民對于選舉委員會(huì)對選民的資格申訴的處理決定不服,能不能去法院起訴嗎?","有人走私兩萬元,怎么處置他?","法律上餐具、飲具集中消毒服務(wù)單位的責(zé)任是不是對消毒餐具、飲具進(jìn)行檢驗(yàn)?"]

然后,我們對其進(jìn)行分詞操作;

import jieba document_list = [list(jieba.cut(doc)) for doc in document_list]

得到結(jié)果如下:

[['行政', '機(jī)關(guān)', '強(qiáng)行', '解除', '行政', '協(xié)議', '造成', '損失', ',', '如何', '索取', '賠償', '?'], ['借錢', '給', '朋友', '到期', '不', '還', '得', '什么', '時(shí)候', '可以', '起訴', '?', '怎么', '起訴', '?'], ['我', '在', '微信', '上', '被', '騙', '了', ',', '請問', '被', '騙', '多少', '錢', '才', '可以', '立案', '?'], ['公民', '對于', '選舉', '委員會(huì)', '對', '選民', '的', '資格', '申訴', '的', '處理', '決定', '不服', ',', '能', '不能', '去', '法院', '起訴', '嗎', '?'], ['有人', '走私', '兩萬元', ',', '怎么', '處置', '他', '?'], ['法律', '上', '餐具', '、', '飲具', '集中', '消毒', '服務(wù)', '單位', '的', '責(zé)任', '是不是', '對', '消毒', '餐具', '、', '飲具', '進(jìn)行', '檢驗(yàn)', '?']]

接下來,我們實(shí)例化TF-IDF類,生成一個(gè)對象;

tf_idf_model = TF_IDF_Model(document_list)

通過參數(shù)調(diào)用,觀察示例化的對象中documents_list ,documents_number,tf 和idf變量具體存儲(chǔ)了什么;

print(tf_idf_model.documents_list) print(tf_idf_model.documents_number) print(tf_idf_model.tf) print(tf_idf_model.idf)

結(jié)果如下:

documents_list: [['行政', '機(jī)關(guān)', '強(qiáng)行', '解除', '行政', '協(xié)議', '造成', '損失', ',', '如何', '索取', '賠償', '?'], ['借錢', '給', '朋友', '到期', '不', '還', '得', '什么', '時(shí)候', '可以', '起訴', '?', '怎么', '起訴', '?'], ['我', '在', '微信', '上', '被', '騙', '了', ',', '請問', '被', '騙', '多少', '錢', '才', '可以', '立案', '?'], ['公民', '對于', '選舉', '委員會(huì)', '對', '選民', '的', '資格', '申訴', '的', '處理', '決定', '不服', ',', '能', '不能', '去', '法院', '起訴', '嗎', '?'], ['有人', '走私', '兩萬元', ',', '怎么', '處置', '他', '?'], ['法律', '上', '餐具', '、', '飲具', '集中', '消毒', '服務(wù)', '單位', '的', '責(zé)任', '是不是', '對', '消毒', '餐具', '、', '飲具', '進(jìn)行', '檢驗(yàn)', '?']] documents_number: 6 tf: [{'行政': 0.15384615384615385, '機(jī)關(guān)': 0.07692307692307693, '強(qiáng)行': 0.07692307692307693, '解除': 0.07692307692307693, '協(xié)議': 0.07692307692307693, '造成': 0.07692307692307693, '損失': 0.07692307692307693, ',': 0.07692307692307693, '如何': 0.07692307692307693, '索取': 0.07692307692307693, '賠償': 0.07692307692307693, '?': 0.07692307692307693}, {'借錢': 0.06666666666666667, '給': 0.06666666666666667, '朋友': 0.06666666666666667, '到期': 0.06666666666666667, '不': 0.06666666666666667, '還': 0.06666666666666667, '得': 0.06666666666666667, '什么': 0.06666666666666667, '時(shí)候': 0.06666666666666667, '可以': 0.06666666666666667, '起訴': 0.13333333333333333, '?': 0.13333333333333333, '怎么': 0.06666666666666667}, {'我': 0.058823529411764705, '在': 0.058823529411764705, '微信': 0.058823529411764705, '上': 0.058823529411764705, '被': 0.11764705882352941, '騙': 0.11764705882352941, '了': 0.058823529411764705, ',': 0.058823529411764705, '請問': 0.058823529411764705, '多少': 0.058823529411764705, '錢': 0.058823529411764705, '才': 0.058823529411764705, '可以': 0.058823529411764705, '立案': 0.058823529411764705, '?': 0.058823529411764705}, {'公民': 0.047619047619047616, '對于': 0.047619047619047616, '選舉': 0.047619047619047616, '委員會(huì)': 0.047619047619047616, '對': 0.047619047619047616, '選民': 0.047619047619047616, '的': 0.09523809523809523, '資格': 0.047619047619047616, '申訴': 0.047619047619047616, '處理': 0.047619047619047616, '決定': 0.047619047619047616, '不服': 0.047619047619047616, ',': 0.047619047619047616, '能': 0.047619047619047616, '不能': 0.047619047619047616, '去': 0.047619047619047616, '法院': 0.047619047619047616, '起訴': 0.047619047619047616, '嗎': 0.047619047619047616, '?': 0.047619047619047616}, {'有人': 0.125, '走私': 0.125, '兩萬元': 0.125, ',': 0.125, '怎么': 0.125, '處置': 0.125, '他': 0.125, '?': 0.125}, {'法律': 0.05, '上': 0.05, '餐具': 0.1, '、': 0.1, '飲具': 0.1, '集中': 0.05, '消毒': 0.1, '服務(wù)': 0.05, '單位': 0.05, '的': 0.05, '責(zé)任': 0.05, '是不是': 0.05, '對': 0.05, '進(jìn)行': 0.05, '檢驗(yàn)': 0.05, '?': 0.05}] idf: {'行政': 1.0986122886681098, '機(jī)關(guān)': 1.0986122886681098, '強(qiáng)行': 1.0986122886681098, '解除': 1.0986122886681098, '協(xié)議': 1.0986122886681098, '造成': 1.0986122886681098, '損失': 1.0986122886681098, ',': 0.1823215567939546, '如何': 1.0986122886681098, '索取': 1.0986122886681098, '賠償': 1.0986122886681098, '?': -0.15415067982725836, '借錢': 1.0986122886681098, '給': 1.0986122886681098, '朋友': 1.0986122886681098, '到期': 1.0986122886681098, '不': 1.0986122886681098, '還': 1.0986122886681098, '得': 1.0986122886681098, '什么': 1.0986122886681098, '時(shí)候': 1.0986122886681098, '可以': 0.6931471805599453, '起訴': 0.6931471805599453, '怎么': 0.6931471805599453, '我': 1.0986122886681098, '在': 1.0986122886681098, '微信': 1.0986122886681098, '上': 0.6931471805599453, '被': 1.0986122886681098, '騙': 1.0986122886681098, '了': 1.0986122886681098, '請問': 1.0986122886681098, '多少': 1.0986122886681098, '錢': 1.0986122886681098, '才': 1.0986122886681098, '立案': 1.0986122886681098, '公民': 1.0986122886681098, '對于': 1.0986122886681098, '選舉': 1.0986122886681098, '委員會(huì)': 1.0986122886681098, '對': 0.6931471805599453, '選民': 1.0986122886681098, '的': 0.6931471805599453, '資格': 1.0986122886681098, '申訴': 1.0986122886681098, '處理': 1.0986122886681098, '決定': 1.0986122886681098, '不服': 1.0986122886681098, '能': 1.0986122886681098, '不能': 1.0986122886681098, '去': 1.0986122886681098, '法院': 1.0986122886681098, '嗎': 1.0986122886681098, '有人': 1.0986122886681098, '走私': 1.0986122886681098, '兩萬元': 1.0986122886681098, '處置': 1.0986122886681098, '他': 1.0986122886681098, '法律': 1.0986122886681098, '餐具': 1.0986122886681098, '、': 1.0986122886681098, '飲具': 1.0986122886681098, '集中': 1.0986122886681098, '消毒': 1.0986122886681098, '服務(wù)': 1.0986122886681098, '單位': 1.0986122886681098, '責(zé)任': 1.0986122886681098, '是不是': 1.0986122886681098, '進(jìn)行': 1.0986122886681098, '檢驗(yàn)': 1.0986122886681098}

最后,我們給出一個(gè)用戶問題,通過tf-idf算法,計(jì)算出“標(biāo)準(zhǔn)問”庫中所有標(biāo)準(zhǔn)問的相似度值;

query = "走私了兩萬元,在法律上應(yīng)該怎么量刑?" query = list(jieba.cut(query)) scores = tf_idf_model.get_documents_score(query)

結(jié)果如下:

[0.002167, 0.025656, 0.171679, 0.001341, 0.364818, 0.081880]

通過結(jié)果我們可以發(fā)現(xiàn),第五個(gè)標(biāo)準(zhǔn)問“有人走私兩萬元,怎么處置他?”與用戶問題“走私了兩萬元,在法律上應(yīng)該怎么量刑?”最為相似,符合我們的預(yù)期。

TF-IDF算法,計(jì)算較快,理解起來也比較簡單;但是存在著缺點(diǎn),相較于使用詞向量生成句子向量的方法,由于它只考慮詞頻的因素,沒有體現(xiàn)出詞匯在文中上下文的地位,因此不能夠很好的突出語義信息,會(huì)造成相似度結(jié)果不理想的情況。

以上,就是本人對TF-IDF算法的總結(jié),有錯(cuò)誤地方還希望指出,歡迎大家交流。

代碼可見:https://github.com/liucongg/ZhiHu_Code/blob/master/tf_idf_code/

往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,請回復(fù)“知識(shí)星球”喜歡文章,點(diǎn)個(gè)在看

總結(jié)

以上是生活随笔為你收集整理的【TF-IDF】传统方法TF-IDF解决短文本相似度问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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