TF-IDF 文字探勘 — 以NBA Ptt鄉民回文為例

JT
4 min readMar 26, 2018

--

TF-IDF 為一種文字探勘處理的工具,主要用為資訊檢索、文字探勘等做為權重或是Feature selection

TF-IDF 主要的概念核心有兩個,TF 及 IDF (感覺好像在講廢話:P)

1. TF 詞頻 (Term Frequency):
是指某一個文字在某一個文件中所出現的頻率。
可用式子表示為 tf(t,d): t詞在d文件中出現的頻率。
例如:十萬 / 青年 / 十萬 / 肝, 十萬出現了2次,總共有3個字詞,
因次tf(t,d) = 2/3 = 0.66666。

2. IDF 逆向文件頻率 (Inverse Document Frequent):
定義為文件數除以某特定文字有被多少文件所提及的數量取log
可用式字表示為 idf(t,D) = log (D/dt)
(D為文件總數,dt為提及t文字的文件數量)
例如:總共有10個文件,其中有5個文件提及“十萬“,
則IDF為 log(10/5) = 0.3。

最後權重就可以用 TF * IDF = Weight
主要可以用以找到頻詞高,且在各個文件中較為獨特的文字

TF * IDF function | https://goo.gl/6nNyza

接下來,我們就用ptt NBA版來做個範例,來看看鄉民的力量:P

Source : https://goo.gl/UUzrRA

資料範圍: 2018 / 3月 的十個page的文章

#取得留言範例
nba_list = requests.get('https://www.ptt.cc/bbs/NBA/M.1521952601.A.99E.html',verify=False)
NBA_soup = BeautifulSoup(nba_list.text)
title_name = NBA_soup('title')[0].text
for i in NBA_soup.select('.push-content'):
print(title_name[:-18],',',i.text[1:])

最後將文章幾留言分成三個文章大類,LBJ , KD , Curry三大類文章,並將留言利用jieba斷詞,但jieba並沒有分得很好,應該還是需要一下字典去做。

可發現, jieba被沒有斷得很乾淨,且留言蠻多垃圾的XD

接下來利用,sklearn package 可進行快速的tf idf的運算

#tf idf運算範例
from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(df_all)
tf_idf = pd.DataFrame(tfidf.toarray()).set_index(df_all.index)

最後可進行重要詞的分析:

  • LBJ 重要性較高的字詞 -> 體能球、皇帝、咳嗽、電話 ….等 (挑一下比較有趣的關鍵字XD)
  • Curry重要性較高的字詞 -> 傷退、受傷、曇花、渣渣 (可能最近多次受傷)
  • KD重要性較高的字詞 -> 背骨、二弟、下季 (笑噴,可能已經在討論下一季要去哪一個球隊)
證明一下,真的是背骨

Summary一下,TF-IDF真的是一個蠻好的工具,且運算快速,缺點是僅以詞頻衡量重要性。以上為TF-IDF簡單的介紹 , 感謝~

--

--