Python项目实践:文本词频统计、软文的诗词风

一、文本词频统计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 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

猜你喜欢

转载自blog.csdn.net/weixin_47008635/article/details/113834539