自然語言處理 關鍵詞提取之TFIDF方法

2021-10-14 16:31:44 字數 3822 閱讀 6685

tf-idf(terms frequency-inverse document frequency)主要思想:如果某個單詞在一篇文章**現的頻率高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類

詞頻(term frequency, tf),即乙個詞條在文字**現的頻率。逆向檔案頻率(inverse document frequency, idf),總檔案數除以包含該詞條的檔案數,再取對數。包含詞條的文件越少,則 idf 越大,則說明詞條有很好的區分能力。

tf-idf 即 tf, idf 的乘積,乙個詞條個特定檔案**現頻率越高,且包含它的檔案個數越少,則對應的 tf-idf 值越大。 tf-idf 傾向於過濾掉常見的詞語,比如在多個檔案**現但頻率較低的詞語。

對於一段話,首先我們使用jieba.cut()進行分詞。然後通過停用詞字典移除停用詞。每乙個詞的詞頻我們也很容易計算得到(_calculate())。如果我們將這段話看成乙個文件,那麼所有詞的 idf 都一樣,我們無法得到有用的資訊,因此我們需要用於**訓練好的 idf 表 (get_idf())。

idf 檔案**於 jieba 元件。

import os

import math

import sys

import operator

import smart_open

import jieba

import jieba.posseg as pseg

from jieba import analyse

from typing import list

from collections import counter

defget_idf

(local_file:

str=

'idf.txt')-

>

dict

:# use pre-train idf

idf =

dict

(l.split(

' ')

for l in

open

(local_file,

'r')

.read(

).splitlines())

idf[

'median_value']=

sorted

(idf.values())

[len

(idf)//2

]return idf

defget_stopwords()

->

set:

stop_words =

set(

)with smart_open.

open

('','r'

)as f:

stop_words =

set(l.strip(

)for l in f.readlines())

return stop_words

def_calculate

(m: list, all_words: list)

-> list:

stop_words = get_stopwords(

) c = counter(k for k in m if k not

in stop_words)

_sum =

sum(c.values())

freq =

idf = get_idf(

)for k, v in c.items():

tf = v / _sum

tfidf = tf *

float

(idf.get(k, idf[

'median_value'])

) freq[k]

= tfidf

sorted_freq =

sorted

(freq.items(),

key=operator.itemgetter(1)

, reverse=

true

)return sorted_freq

defget_tfidf

(document_list: list)

-> list:

cuts =

map(jieba.cut, document_list)

matrix =

list

(list

(c)for c in cuts)

all_words =

[set

(m)for m in matrix]

res =

for m in matrix:

)# print(matrix, all_words)

return res

if __name__ ==

"__main__"

: s =

"中華人民共和國是工人階級領導的、以工農聯盟為基礎的人民民主**的社會主義國家。社會主義制度是中華人民共和國的根本制度。中國共產黨領導是中國特色社會主義最本質的特徵。禁止任何組織或者個人破壞社會主義制度。"

get_tfidf(s.split(

"\n"

))

輸出結果:

[

('社會主義', 1.01966138628), (

'制度', 0.6200307024732), (

'中華人民共和國', 0.5080433847592), (

'領導', 0.42051995590479996), (

'工農聯盟', 0.41159038957200006), (

'民主**', 0.3936093856572), (

'工人階級', 0.321939006888), (

'本質', 0.277727211244), (

'禁止', 0.2727251633048), (

'中國共產黨', 0.2678611343976), (

'特色', 0.2619551113168), (

'破壞', 0.2444158108508), (

'特徵', 0.2282247984432), (

'人民', 0.2083745240132), (

'組織', 0.1948072762768), (

'基礎', 0.19052922422080001), (

'國家', 0.1600178156864), (

'中國', 0.1210928274664)

]

這種情況下需要實現自己的分詞器,中文分詞主要分為兩個類別:

基於詞典分詞演算法。也稱字串匹配分詞演算法。該演算法是按照一定的策略將待匹配的字串和乙個已建立好的「充分大的」詞典中的詞進行匹配,若找到某個詞條,則說明匹配成功,識別了該詞。常見的基於詞典的分詞演算法分為以下幾種:正向最大匹配法逆向最大匹配法雙向匹配分詞法等。

基於統計的機器學習演算法。常用演算法包括hmm、crf、svm、深度學習等演算法,比如 stanford、hanlp 分詞工具是基於 crf 演算法,基本思路是對漢字進行標註訓練,不僅考慮了詞語出現的頻率,還考慮上下文,具備較好的學習能力,因此其對歧義詞和未登入詞的識別都具有良好的效果。

常見的分詞器都是使用機器學習演算法和詞典相結合,一方面能夠提高分詞準確率,另一方面能夠改善領域適應性。

自然語言處理 TF IDF演算法提取關鍵詞

這個標題看上去好像很複雜,其實我要談的是乙個很簡單的問題。這個問題涉及到資料探勘 文字處理 資訊檢索等很多計算機前沿領域,但是出乎意料的是,有乙個非常簡單的經典演算法,可以給出令人相當滿意的結果。它簡單到都不需要高等數學,普通人只用10分鐘就可以理解,這就是我今天想要介紹的tf idf演算法。乙個容...

自然語言處理 TF IDF演算法提取關鍵詞

這個標題看上去好像很複雜,其實我要談的是乙個很簡單的問題。這個問題涉及到資料探勘 文字處理 資訊檢索等很多計算機前沿領域,但是出乎意料的是,有乙個非常簡單的經典演算法,可以給出令人相當滿意的結果。它簡單到都不需要高等數學,普通人只用10分鐘就可以理解,這就是我今天想要介紹的tf idf演算法。乙個容...

自然語言處理之關鍵詞提取TF IDF

1 公式 計算詞頻tf 考慮到文章有長短之分,為了便於不同文章的比較,進行 詞頻 標準化。或者 計算反文件頻率idf import osimport math import operator filepath h data allfiles allfiles doc word dict i 0 統計...