欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python如何實現(xiàn)TF-IDF算法

 更新時間:2023年11月28日 14:15:21   作者:芊欣欲  
這篇文章主要介紹了python如何實現(xiàn)TF-IDF算法問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

概念

1.定義

TF-IDF(term frequency-inverse document frequency)

是一種用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術(shù),常用于挖掘文章中的關(guān)鍵詞。

2.特點

簡單高效,用于最開始的文本數(shù)據(jù)清洗。

3.TF-IDF

(1)TF:詞頻

可以統(tǒng)計到停用詞,并把它們過濾,避免對結(jié)果造成影響。

e.g.:“的”、“了”、“是”等等

(2)IDF:逆文檔頻率

在詞的頻率相同時,不同詞的重要性卻不同。IDF會給常見的詞較小的權(quán)重。

e.g.:假設(shè)“量化”和“系統(tǒng)”的詞頻相同,則重要性:“量化” > “系統(tǒng)”

4.實現(xiàn)方法

當(dāng)有TF和IDF后,將其相乘,能夠得到一個詞的TF-IDF的值。

某個詞在文章中的TF-IDF越大,那么它在文章中的重要性越高。

算法步驟

1.計算詞頻

詞頻 = 某個詞在文章中出現(xiàn)的次數(shù) / 文章的總次數(shù)

2.計算逆文檔的頻率

需要一個語料庫(corpus)來模擬語言的使用環(huán)境。

逆文檔頻率 = log(語料庫的文檔總數(shù) / (包含該詞的文檔數(shù) + 1))

3.計算TF-IDF

TF-IDF= TF × IDF

與一個詞在文檔中出現(xiàn)的次數(shù)成正比。

與該詞在整個語言中出現(xiàn)的次數(shù)成反比。

優(yōu)缺點

優(yōu)點

簡單高效,容易理解。

缺點

(1)詞頻衡量此的重要性不夠全面,有時重要的詞出現(xiàn)得不多

(2)無法體現(xiàn)位置信息=>無法體現(xiàn)該詞在上下文中的重要性=>用word2vec算法來支持

python實現(xiàn)TF-IDF算法

1.自己構(gòu)建語料庫

這個例子比較特殊,dataset既是語料庫,可是我們要統(tǒng)計核心詞的對象。

# -*- coding: utf-8 -*-
from collections import defaultdict
import math
import operator

"""
函數(shù)說明:創(chuàng)建數(shù)據(jù)樣本
Returns:
    dataset - 實驗樣本切分的詞條
    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ù)說明:特征選擇TF-IDF算法
Parameters:
     list_words:詞列表
Returns:
     dict_feature_select:特征選擇詞字典
"""
#dataset:文件夾,word_list:某一個文件,word某個詞

def feature_select(dataset):
    # 總詞頻統(tǒng)計
    doc_frequency = defaultdict(int) #記錄每個詞出現(xiàn)的次數(shù),可以把它理解成一個可變長度的list,只要你索引它,它就自動擴列
    for file in dataset:
        for word in file:
            doc_frequency[word] += 1
    # 計算每個詞的TF值
    word_tf = {}  # 存儲沒個詞的tf值
    for i in doc_frequency:
        word_tf[i] = doc_frequency[i] / sum(doc_frequency.values()) #sum(doc.frequency.values)

    # 計算每個詞的IDF值
    doc_num = len(dataset)
    word_idf = {}  # 存儲每個詞的idf值
    word_doc = defaultdict(int)  # 存儲包含該詞的文檔數(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存儲的是包含這個詞的文檔數(shù),即如果一個文檔里有重復(fù)出現(xiàn)一個詞則word_doc < doc_frequency
    for word in doc_frequency:
        word_idf[word] = math.log(doc_num / (word_doc[word] + 1))

    # 計算每個詞的TF*IDF的值
    word_tf_idf = {}
    for word in doc_frequency:
        word_tf_idf[word] = word_tf[word] * word_idf[word]

    # 對字典按值由大到小排序
    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)

運算結(jié)果:

2.NLTK實現(xiàn)TF-IDF算法

由于我的電腦安裝了本地代理所以不能下載nltk的語料庫,這里只貼代碼供大家參考

from nltk.text import TextCollection
from nltk.tokenize import word_tokenize
 
#首先,構(gòu)建語料庫corpus
sents=['this is sentence one','this is sentence two','this is sentence three']
sents=[word_tokenize(sent) for sent in sents] #對每個句子進行分詞
print(sents)  #輸出分詞后的結(jié)果
corpus=TextCollection(sents)  #構(gòu)建語料庫
print(corpus)  #輸出語料庫
 
#計算語料庫中"one"的tf值
tf=corpus.tf('one',corpus)    # 1/12
print(tf)
 
#計算語料庫中"one"的idf值
idf=corpus.idf('one')      #log(3/1)
print(idf)
 
#計算語料庫中"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 主要 思想 是', '算法 一個 重要 特點 可以 脫離 語料庫 背景',
           '如果 一個 網(wǎng)頁 被 很多 其他 網(wǎng)頁 鏈接 說明 網(wǎng)頁 重要']
x_test = ['原始 文本 進行 標(biāo)記', '主要 思想']

# 該類會將文本中的詞語轉(zhuǎn)換為詞頻矩陣,矩陣元素a[i][j] 表示j詞在i類文本下的詞頻
vectorizer = CountVectorizer(max_features=10) #列數(shù)為10
# 該類會統(tǒng)計每個詞語的tf-idf權(quán)值
tf_idf_transformer = TfidfTransformer()
# 將文本轉(zhuǎn)為詞頻矩陣并計算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
# 將tf-idf矩陣抽取出來,元素a[i][j]表示j詞在i類文本中的tf-idf權(quán)重
x_train_weight = tf_idf.toarray()

# 對測試集進行tf-idf權(quán)重計算
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray()  # 測試集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實現(xiàn)tf-idf

import jieba.analyse
 
text='關(guān)鍵詞是能夠表達文檔中心內(nèi)容的詞語,常用于計算機系統(tǒng)標(biāo)引論文內(nèi)容特征、
信息檢索、系統(tǒng)匯集以供讀者檢閱。關(guān)鍵詞提取是文本挖掘領(lǐng)域的一個分支,是文本檢索、
文檔比較、摘要生成、文檔分類和聚類等文本挖掘研究的基礎(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 為返回幾個 TF/IDF 權(quán)重最大的關(guān)鍵詞,默認(rèn)值為 20
  • withWeight 為是否一并返回關(guān)鍵詞權(quán)重值,默認(rèn)值為 False
  • allowPOS 僅包括指定詞性的詞,默認(rèn)值為空,即不篩選

運行結(jié)果:

(安裝不了就pip install jieba; conda install jieba; pip3 install jieba;都嘗試一邊,我用pip3安裝才成功的,如果還不成功可以去jieba官網(wǎng)手動下載后自行配置到anaconda環(huán)境)

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • django 2.0更新的10條注意事項總結(jié)

    django 2.0更新的10條注意事項總結(jié)

    Django 是 Python Web 開發(fā)最常用的框架之一,跟進它的最新變化絕對是必須的。下面這篇文章主要給大家介紹了關(guān)于django 2.0更新的10條注意事項,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中

    python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中

    這篇文章主要介紹了python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python實現(xiàn)簡單猜單詞游戲

    python實現(xiàn)簡單猜單詞游戲

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)簡單猜單詞游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Python文件讀寫w+和r+區(qū)別解析

    Python文件讀寫w+和r+區(qū)別解析

    這篇文章主要介紹了Python文件讀寫w+和r+區(qū)別解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Python+OpenCV 實現(xiàn)圖片無損旋轉(zhuǎn)90°且無黑邊

    Python+OpenCV 實現(xiàn)圖片無損旋轉(zhuǎn)90°且無黑邊

    今天小編就為大家分享一篇Python+OpenCV 實現(xiàn)圖片無損旋轉(zhuǎn)90°且無黑邊,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python跨文件全局變量的實現(xiàn)方法示例

    Python跨文件全局變量的實現(xiàn)方法示例

    我們在使用Python編寫應(yīng)用的時候,有時候會遇到多個文件之間傳遞同一個全局變量的情況。所以下面這篇文章主要給大家介紹了關(guān)于Python跨文件全局變量的實現(xiàn)方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • Python數(shù)據(jù)列表中的空補0的問題解決

    Python數(shù)據(jù)列表中的空補0的問題解決

    在Python中,如果你有一個包含空值的數(shù)據(jù)列表,你可以使用列表推導(dǎo)式或循環(huán)將這些空值替換為0,本文就來介紹一下如何解決,感興趣的可以了解一下
    2024-03-03
  • Python實現(xiàn)排序算法、查找算法和圖遍歷算法實例

    Python實現(xiàn)排序算法、查找算法和圖遍歷算法實例

    這篇文章主要介紹了Python實現(xiàn)排序算法、查找算法和圖遍歷算法實例,排序算法、查找算法和圖遍歷算法是計算機科學(xué)中常見且重要的算法。它們在數(shù)據(jù)處理、搜索和圖結(jié)構(gòu)等領(lǐng)域發(fā)揮著關(guān)鍵作用,需要的朋友可以參考下
    2023-08-08
  • Python中FastAPI項目使用 Annotated的參數(shù)設(shè)計的處理方案

    Python中FastAPI項目使用 Annotated的參數(shù)設(shè)計的處理方案

    FastAPI 是一個非常現(xiàn)代化和高效的框架,非常適合用于構(gòu)建高性能的 API,FastAPI 是一個用于構(gòu)建 API 的現(xiàn)代、快速(高性能)web 框架,基于 Python 類型提示,這篇文章主要介紹了Python中FastAPI項目使用 Annotated的參數(shù)設(shè)計,需要的朋友可以參考下
    2024-08-08
  • Python中選擇排序的實現(xiàn)與優(yōu)化

    Python中選擇排序的實現(xiàn)與優(yōu)化

    選擇排序(Selection?Sort)是一種簡單但有效的排序算法,本文將詳細(xì)介紹選擇排序算法的原理和實現(xiàn),并提供相關(guān)的Python代碼示例,需要的可以參考一下
    2023-06-06

最新評論