1. 程式人生 > 實用技巧 >042 例項10-文字詞頻統計

042 例項10-文字詞頻統計

目錄

一、"文字詞頻統計"問題分析

1.1 問題分析

文字詞頻統計

  • 需求:一篇文章,出現了哪些詞?哪些詞出現得最多?
  • 該怎麼做呢?

英文文字 --> 中文文字

  • 英文文字:Hamlet 分析詞頻

想要《Hamlet》文字的同學可以加我微信:chenyoudea

  • 中文文字:《三國演義》 分析人物

想要《三國演義》文字的同學可以加我微信:chenyoudea

二、"Hamlet英文詞頻統計"例項講解

  • 文字去噪及歸一化
  • 使用字典表達詞頻
# CalHamletV1.py


def getText():
    txt = open("hamlet.txt", "r").read()
    txt = txt.lower()
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
        txt = txt.replace(ch, " ")
    return txt


hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for
word in words: counts[word] = counts.get(word, 0) + 1 items = list(counts.items()) items.sort(key=lambda x: x[1], reverse=True) for i in range(10): word, count = items[i] print("{0:<10}{1:>5}".format(word, count))
the         948
and         855
to          650
of          581
you         494
a 468 my 447 i 443 in 373 hamlet 361
  • 執行結果由大到小排序
  • 觀察單詞出現次數

三、"《三國演義》人物出場統計"例項講解(上)

  • 中文文字分詞
  • 使用字典表達詞頻
# CalThreeKingdomsV1.py

import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {}
for word in words:
    if len(word) == 1:
        continue
    else:
        counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(15):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/mh/krrg51957cqgl0rhgnwyylvc0000gn/T/jieba.cache
Loading model cost 1.030 seconds.
Prefix dict has been built succesfully.


曹操          953
孔明          836
將軍          772
卻說          656
玄德          585
關公          510
丞相          491
二人          469
不可          440
荊州          425
玄德曰         390
孔明曰         390
不能          384
如此          378
張飛          358

四、"《三國演義》人物出場統計"例項講解(下)

4.1 《三國演義》人物出場統計

將詞頻與人物相關聯,面向問題

詞頻統計 --> 人物統計

#CalThreeKingdomsV2.py
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {"將軍", "卻說", "荊州", "二人", "不可", "不能", "如此"}
words = jieba.lcut(txt)
counts = {}
for word in words:
    if len(word) == 1:
        continue
    elif word == "諸葛亮" or word == "孔明曰":
        rword = "孔明"
    elif word == "關公" or word == "雲長":
        rword = "關羽"
    elif word == "玄德" or word == "玄德曰":
        rword = "劉備"
    elif word == "孟德" or word == "丞相":
        rword = "曹操"
    else:
        rword = word
    counts[rword] = counts.get(rword, 0) + 1
for word in excludes:
    del counts[word]
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(10):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))
曹操         1451
孔明         1383
劉備         1252
關羽          784
張飛          358
商議          344
如何          338
主公          331
軍士          317
呂布          300
  • 中文文字分詞

  • 使用字典表達詞頻

  • 擴充套件程式解決問題

  • 根據結果進一步優化

隆重發布《三國演義》人物出場順序前20:曹操、孔明、劉備、關羽、張飛、呂布、趙雲、孫權、司馬懿、周瑜、袁紹、馬超、魏延、黃忠、姜維、馬岱、龐德、孟獲、劉表、夏侯惇

五、"文字詞頻統計"舉一反三

5.1 應用問題的擴充套件

  • 《紅樓夢》、《西遊記》、《水滸傳》…
  • 政府工作報告、科研論文、新聞報道 …
  • 進一步呢? 未來還有詞雲…