目錄
- 一、"文本詞頻統計"問題分析
- 1.1 問題分析
- 二、"Hamlet英文詞頻統計"執行個體講解
- 三、"《三國演義》人物出場統計"執行個體講解(上)
- 四、"《三國演義》人物出場統計"執行個體講解(下)
- 4.1 《三國演義》人物出場統計
- 五、"文本詞頻統計"舉一反三
- 5.1 應用問題的擴充
一、"文本詞頻統計"問題分析
1.1 問題分析
文本詞頻統計
- 需求:一篇文章,出現了哪些詞?哪些詞出現得最多?
- 該怎麼做呢?
英文文本 --> 中文文本
- 英文文本:Hamlet 分析詞頻
- 中文文本:《三國演義》 分析人物
二、"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 應用問題的擴充
- 《紅樓夢》、《西遊記》、《水浒傳》…
- 政府工作報告、科研論文、新聞報道 …
- 進一步呢? 未來還有詞雲…