python如何實(shí)現(xiàn)TF-IDF算法
概念
1.定義
TF-IDF(term frequency-inverse document frequency)
是一種用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術(shù),常用于挖掘文章中的關(guān)鍵詞。
2.特點(diǎn)
簡(jiǎn)單高效,用于最開始的文本數(shù)據(jù)清洗。
3.TF-IDF
(1)TF:詞頻
可以統(tǒng)計(jì)到停用詞,并把它們過(guò)濾,避免對(duì)結(jié)果造成影響。
e.g.:“的”、“了”、“是”等等
(2)IDF:逆文檔頻率
在詞的頻率相同時(shí),不同詞的重要性卻不同。IDF會(huì)給常見的詞較小的權(quán)重。
e.g.:假設(shè)“量化”和“系統(tǒng)”的詞頻相同,則重要性:“量化” > “系統(tǒng)”
4.實(shí)現(xiàn)方法
當(dāng)有TF和IDF后,將其相乘,能夠得到一個(gè)詞的TF-IDF的值。
某個(gè)詞在文章中的TF-IDF越大,那么它在文章中的重要性越高。
算法步驟
1.計(jì)算詞頻
詞頻 = 某個(gè)詞在文章中出現(xiàn)的次數(shù) / 文章的總次數(shù)
2.計(jì)算逆文檔的頻率
需要一個(gè)語(yǔ)料庫(kù)(corpus)來(lái)模擬語(yǔ)言的使用環(huán)境。
逆文檔頻率 = log(語(yǔ)料庫(kù)的文檔總數(shù) / (包含該詞的文檔數(shù) + 1))
3.計(jì)算TF-IDF
TF-IDF= TF × IDF
與一個(gè)詞在文檔中出現(xiàn)的次數(shù)成正比。
與該詞在整個(gè)語(yǔ)言中出現(xiàn)的次數(shù)成反比。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
簡(jiǎn)單高效,容易理解。
缺點(diǎn)
(1)詞頻衡量此的重要性不夠全面,有時(shí)重要的詞出現(xiàn)得不多
(2)無(wú)法體現(xiàn)位置信息=>無(wú)法體現(xiàn)該詞在上下文中的重要性=>用word2vec算法來(lái)支持
python實(shí)現(xiàn)TF-IDF算法
1.自己構(gòu)建語(yǔ)料庫(kù)
這個(gè)例子比較特殊,dataset既是語(yǔ)料庫(kù),可是我們要統(tǒng)計(jì)核心詞的對(duì)象。
# -*- coding: utf-8 -*-
from collections import defaultdict
import math
import operator
"""
函數(shù)說(shuō)明:創(chuàng)建數(shù)據(jù)樣本
Returns:
dataset - 實(shí)驗(yàn)樣本切分的詞條
classVec - 類別標(biāo)簽向量
"""
def loadDataSet():
dataset = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], # 切分的詞條
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'my'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
classVec = [0, 1, 0, 1, 0, 1] # 類別標(biāo)簽向量,1代表好,0代表不好
return dataset, classVec
"""
函數(shù)說(shuō)明:特征選擇TF-IDF算法
Parameters:
list_words:詞列表
Returns:
dict_feature_select:特征選擇詞字典
"""
#dataset:文件夾,word_list:某一個(gè)文件,word某個(gè)詞
def feature_select(dataset):
# 總詞頻統(tǒng)計(jì)
doc_frequency = defaultdict(int) #記錄每個(gè)詞出現(xiàn)的次數(shù),可以把它理解成一個(gè)可變長(zhǎng)度的list,只要你索引它,它就自動(dòng)擴(kuò)列
for file in dataset:
for word in file:
doc_frequency[word] += 1
# 計(jì)算每個(gè)詞的TF值
word_tf = {} # 存儲(chǔ)沒個(gè)詞的tf值
for i in doc_frequency:
word_tf[i] = doc_frequency[i] / sum(doc_frequency.values()) #sum(doc.frequency.values)
# 計(jì)算每個(gè)詞的IDF值
doc_num = len(dataset)
word_idf = {} # 存儲(chǔ)每個(gè)詞的idf值
word_doc = defaultdict(int) # 存儲(chǔ)包含該詞的文檔數(shù)
for word in doc_frequency:
for file in dataset:
if word in file:
word_doc[word] += 1
#word_doc和doc_frequency的區(qū)別是word_doc存儲(chǔ)的是包含這個(gè)詞的文檔數(shù),即如果一個(gè)文檔里有重復(fù)出現(xiàn)一個(gè)詞則word_doc < doc_frequency
for word in doc_frequency:
word_idf[word] = math.log(doc_num / (word_doc[word] + 1))
# 計(jì)算每個(gè)詞的TF*IDF的值
word_tf_idf = {}
for word in doc_frequency:
word_tf_idf[word] = word_tf[word] * word_idf[word]
# 對(duì)字典按值由大到小排序
dict_feature_select = sorted(word_tf_idf.items(), key=operator.itemgetter(1), reverse=True)
return dict_feature_select
if __name__ == '__main__':
data_list, label_list = loadDataSet() # 加載數(shù)據(jù)
features = feature_select(data_list) # 所有詞的TF-IDF值
print(features)
運(yùn)算結(jié)果:

2.NLTK實(shí)現(xiàn)TF-IDF算法
由于我的電腦安裝了本地代理所以不能下載nltk的語(yǔ)料庫(kù),這里只貼代碼供大家參考
from nltk.text import TextCollection
from nltk.tokenize import word_tokenize
#首先,構(gòu)建語(yǔ)料庫(kù)corpus
sents=['this is sentence one','this is sentence two','this is sentence three']
sents=[word_tokenize(sent) for sent in sents] #對(duì)每個(gè)句子進(jìn)行分詞
print(sents) #輸出分詞后的結(jié)果
corpus=TextCollection(sents) #構(gòu)建語(yǔ)料庫(kù)
print(corpus) #輸出語(yǔ)料庫(kù)
#計(jì)算語(yǔ)料庫(kù)中"one"的tf值
tf=corpus.tf('one',corpus) # 1/12
print(tf)
#計(jì)算語(yǔ)料庫(kù)中"one"的idf值
idf=corpus.idf('one') #log(3/1)
print(idf)
#計(jì)算語(yǔ)料庫(kù)中"one"的tf-idf值
tf_idf=corpus.tf_idf('one',corpus)
print(tf_idf)
3.利用sklearn做tf-idf
import sklearn
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
x_train = ['TF-IDF 主要 思想 是', '算法 一個(gè) 重要 特點(diǎn) 可以 脫離 語(yǔ)料庫(kù) 背景',
'如果 一個(gè) 網(wǎng)頁(yè) 被 很多 其他 網(wǎng)頁(yè) 鏈接 說(shuō)明 網(wǎng)頁(yè) 重要']
x_test = ['原始 文本 進(jìn)行 標(biāo)記', '主要 思想']
# 該類會(huì)將文本中的詞語(yǔ)轉(zhuǎn)換為詞頻矩陣,矩陣元素a[i][j] 表示j詞在i類文本下的詞頻
vectorizer = CountVectorizer(max_features=10) #列數(shù)為10
# 該類會(huì)統(tǒng)計(jì)每個(gè)詞語(yǔ)的tf-idf權(quán)值
tf_idf_transformer = TfidfTransformer()
# 將文本轉(zhuǎn)為詞頻矩陣并計(jì)算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
# 將tf-idf矩陣抽取出來(lái),元素a[i][j]表示j詞在i類文本中的tf-idf權(quán)重
x_train_weight = tf_idf.toarray()
# 對(duì)測(cè)試集進(jìn)行tf-idf權(quán)重計(jì)算
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray() # 測(cè)試集TF-IDF權(quán)重矩陣
print('vectorizer.fit_transform(x_train) : ')
print(vectorizer.fit_transform(x_train))
print('輸出x_train文本向量:')
print(x_train_weight)
print('輸出x_test文本向量:')
print(x_test_weight)


4.利用Jieba實(shí)現(xiàn)tf-idf
import jieba.analyse text='關(guān)鍵詞是能夠表達(dá)文檔中心內(nèi)容的詞語(yǔ),常用于計(jì)算機(jī)系統(tǒng)標(biāo)引論文內(nèi)容特征、 信息檢索、系統(tǒng)匯集以供讀者檢閱。關(guān)鍵詞提取是文本挖掘領(lǐng)域的一個(gè)分支,是文本檢索、 文檔比較、摘要生成、文檔分類和聚類等文本挖掘研究的基礎(chǔ)性工作' keywords=jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=()) print(keywords)
注:
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence為待提取的文本topK為返回幾個(gè) TF/IDF 權(quán)重最大的關(guān)鍵詞,默認(rèn)值為 20withWeight為是否一并返回關(guān)鍵詞權(quán)重值,默認(rèn)值為 FalseallowPOS僅包括指定詞性的詞,默認(rèn)值為空,即不篩選
運(yùn)行結(jié)果:

(安裝不了就pip install jieba; conda install jieba; pip3 install jieba;都嘗試一邊,我用pip3安裝才成功的,如果還不成功可以去jieba官網(wǎng)手動(dòng)下載后自行配置到anaconda環(huán)境)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python+opencv+caffe+攝像頭做目標(biāo)檢測(cè)的實(shí)例代碼
今天小編就為大家分享一篇python+opencv+caffe+攝像頭做目標(biāo)檢測(cè)的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Python pygame 動(dòng)畫游戲循環(huán)游戲時(shí)鐘實(shí)現(xiàn)原理
這篇文章主要為大家介紹了Python pygame 動(dòng)畫游戲循環(huán)游戲時(shí)鐘實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
pip已經(jīng)安裝好第三方庫(kù)但pycharm中import時(shí)還是標(biāo)紅的解決方案
這篇文章主要介紹了python中pip已經(jīng)安裝好第三方庫(kù)但pycharm中import時(shí)還是標(biāo)紅的問題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
python基于socket實(shí)現(xiàn)的UDP及TCP通訊功能示例
這篇文章主要介紹了python基于socket實(shí)現(xiàn)的UDP及TCP通訊功能,結(jié)合實(shí)例形式分析了基于Python socket模塊的UDP及TCP通信相關(guān)客戶端、服務(wù)器端實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11
卷積神經(jīng)網(wǎng)絡(luò)CharCNN實(shí)現(xiàn)中文情感分類任務(wù)
這篇文章主要為大家介紹了卷積神經(jīng)網(wǎng)絡(luò)CharCNN實(shí)現(xiàn)中文情感分類任務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
PyTorch2.9鏡像部署實(shí)測(cè)三大國(guó)內(nèi)源速度
本文介紹了如何在星圖GPU平臺(tái)上自動(dòng)化部署PyTorch 2.9鏡像,快速搭建開箱即用的深度學(xué)習(xí)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04

