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 統計...