一、文本词频统计
# CalHamletV1.py
def getText():
txt = open("C:/Users/520/Desktop/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 1137
and 963
to 734
of 668
i 537
a 527
you 523
my 513
hamlet 450
in 434
# CalThreeKingdoms.py
import jieba
txt = open("C:/Users/520/Desktop/三国演义.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(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
输出:《三国演义》词频统计
曹操 953
孔明 836
将军 772
却说 656
玄德 585
关公 510
丞相 491
二人 469
不可 440
荆州 425
# CalThreeKingdoms.py
import jieba
txt = open("C:/Users/520/Desktop/三国演义.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(10):
word, count = items[i]
print("{0:10}{1:>5}".format(word, count))
输出:
曹操 953
孔明 836
将军 772
却说 656
玄德 585
关公 510
丞相 491
二人 469
不可 440
荆州 425
可以看到,在统计中一些并不是人名,比如“将军”、“却说”;有些是同一人,比如“丞相”和“曹操”,“孔明”和“诸葛亮”,进一步优化程序:
# CalThreeKingdomV2.py
import jieba
txt = open("C:/Users/520/Desktop/三国演义.txt", "r", encoding="utf-8").read()
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
excludes = {
"将军", "却说", "荆州", "二人", "不可", "不能", "如此"}
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("{:10}{:>5}".format(word, count))
输出:
曹操 1451
孔明 1383
刘备 1252
关羽 784
张飞 358
商议 344
如何 338
主公 331
军士 317
吕布 300
二、软文的诗词风
- 为便于手机阅读,很多软文经常会使用一种一种“诗词风”,通过将正常排版的文章切分成短句并重新排版。
- 软文的诗词风将原有文章根据标点符号重新切分成短句并居中排版,对小屏幕阅读十分有利。
txt = '''
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
'''
linewidth = 30 # 预定的输出宽度
def lineSplit(line):
seps = [",", "!", "?", "。", "、"]
for sep in seps:
line = line.replace(sep, "\n")
return line.split("\n")
def linePrint(line):
global linewidth
print(line.center(linewidth, chr(12288)))
# Unicode12288是汉字中的空格,与英文空格不同,这个空格与汉字同宽
newlines = lineSplit(txt)
for newline in newlines:
linePrint(newline)
输出:
人生得意须尽欢,莫使金樽空对月
天生我材必有用,千金散尽还复来
txt = '''三国演义 上卷
罗贯中
滚滚长江东逝水,浪花淘尽英雄。是非成败转头空。青山依旧在,几度夕阳红。
白发渔樵江渚上,惯看秋月春风。一壶浊酒喜相逢。古今多少事,都付笑谈中。
--调寄《临江仙》
第一回 宴桃园豪杰三结义 斩黄巾英雄首立功
话说天下大势,分久必合,合久必分。周末七国分争,并入于秦。及秦灭之后,楚、汉分争,又并入于汉。汉朝自高祖斩白蛇而起义,一统天下,
后来光武中兴,传至献帝,遂分为三国。推其致乱之由,殆始于桓、灵二帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,大将军窦武、
太傅陈蕃共相辅佐。时有宦官曹节等弄权,窦武、陈蕃谋诛之,机事不密,反为所害,中涓自此愈横。
建宁二年四月望日,帝御温德殿。方升座,殿角狂风骤起。只见一条大青蛇,从梁上飞将下来,蟠于椅上。
'''
linewidth = 30
def lineSplit(line):
seps = [",", "。", "!", "?", "、"]
for sep in seps:
line = line.replace(sep, "\n")
return line.split("\n")
def linePrint(line):
global linewidth
for i in line:
print(i.center(linewidth, chr(12288)))
newline = lineSplit(txt)
linePrint(newline)
输出:(可以看出《三国演义》很喜欢用较短的句子)
三国演义 上卷
罗贯中
滚滚长江东逝水
浪花淘尽英雄
是非成败转头空
青山依旧在
几度夕阳红
白发渔樵江渚上
惯看秋月春风
一壶浊酒喜相逢
古今多少事
都付笑谈中
--调寄《临江仙》
第一回 宴桃园豪杰三结义 斩黄巾英雄首立功
话说天下大势
分久必合
合久必分
周末七国分争
并入于秦
及秦灭之后
楚
汉分争
又并入于汉
汉朝自高祖斩白蛇而起义
一统天下
后来光武中兴
传至献帝
遂分为三国
推其致乱之由
殆始于桓
灵二帝
桓帝禁锢善类
崇信宦官
及桓帝崩
灵帝即位
大将军窦武
太傅陈蕃共相辅佐
时有宦官曹节等弄权
窦武
陈蕃谋诛之
机事不密
反为所害
中涓自此愈横
建宁二年四月望日
帝御温德殿
方升座
殿角狂风骤起
只见一条大青蛇
从梁上飞将下来
蟠于椅上
txt = '''微风拂动着女贞路两旁整洁的树篱,街道在漆黑的天空下寂静无声,一尘不染,谁也不会想到这里会发生骇人听闻的事情。
哈利·波特在毯子包里翻了个身,但他并没有醒。他的一只小手正好放在那封信旁边。他还在继续沉睡,一点也不知道他很特殊,
不知道他名气很大,不知道再过几小时,等德思礼太太打开大门放奶瓶时,他会被她的尖叫声吵醒;更不会知道,在未来的几个星期,
他表哥达力会对他连捅带戳,连掐带拧……他也不可能知道,就在此刻,全国的人都在秘密聚会,
人们高举酒杯悄声说:“祝福大难不死的孩子——哈利·波特!”
'''
linewidth = 30
def lineSplit(line):
seps = [",", "。", "!", "、", "?"]
for sep in seps:
line = line.replace(sep, "\n")
return line.split("\n")
def linePrint(line):
global linewidth
for i in line:
print(i.center(linewidth, chr(12288)))
newline = lineSplit(txt)
linePrint(newline)
输出:
微风拂动着女贞路两旁整洁的树篱
街道在漆黑的天空下寂静无声
一尘不染
谁也不会想到这里会发生骇人听闻的事情
哈利·波特在毯子包里翻了个身
但他并没有醒
他的一只小手正好放在那封信旁边
他还在继续沉睡
一点也不知道他很特殊
不知道他名气很大
不知道再过几小时
等德思礼太太打开大门放奶瓶时
他会被她的尖叫声吵醒;更不会知道
在未来的几个星期
他表哥达力会对他连捅带戳
连掐带拧……他也不可能知道
就在此刻
全国的人都在秘密聚会
人们高举酒杯悄声说:“祝福大难不死的孩子——哈利·波特
”
从结果来看,《哈利波特》更喜欢用长句子,当每句长度超过变量linewidth后,显示效果并不好。这需要修改函数lineprint(),当一个短句字数超过限制时,分行居中显示。
def linePrint(line):
global linewidth
for i in line:
while len(i) > linewidth:
print(i[0:linewidth])
i = i[linewidth:]
print(i.center(linewidth, chr(12288)))
PS: source, python123