Python处理中文文本

author:Ernest

使用Python处理文本是件十分有趣的任务,通过某些操作,你可以自由地获取到你所需要的内容,下面就来看看怎么做吧。

要求

1.选择一部长度合适的小说,中文、英文或其他语种皆可,长度不低于5万字。
2.首先对文本进行词(字)频统计,中文可以进行分词统计词频,或不分词统计字频,英文要求统计词频并考虑词语的大小写等价性。
3.按照词频顺序列出所有的词及其出现次数;
4.绘制排序-数量曲线,验证Zipf-Law(可以用第三方软件绘图)。
5.利用正则表达式查找文件中的某种特定模式,对这种模式进行提取分析。要求提取出的内容有一定的复杂性(多种匹配结果),提取的数量不低于20个。

开始处理

1.读取文本

这里我们选择《自律胜于纪律》一书,资源上百度网盘
(链接:https://pan.baidu.com/s/15E4HiJZwtnOdv1Ql4tFlmQ 提取码:72jd )
Python打开文本的写法有两种,一种是直接使用open()方法,返回文件对象,使用完毕后要使用close()方法关闭文件对象;另一种是使用with open() as f写法,你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭,详看下方代码解释。

path = r'自律胜于纪律.txt'  # 要打开的文件,这里使用相对路径(关于Windows下使用相对路径和绝对路径的方法见下文)'''写法一'''
f = open(path, 'r')  # f即为open()方法返回的文件对象,后续对文件的一切操作都是基于这个对象
str = f.read()     # 读取文本
print(str)          # 对读取到的文本输出看一下效果
f.close()           # 关闭文件对象'''写法二'''
with open(path, 'r', encoding='utf8') as f:    # 此处已经打开文件并将 f 作为文件对象str = f.read()    # 读取文本
# 到这里时 f 文件对象已经不再使用,会自动关闭
print(str)          # 对读取到的文本输出看一下效果,这里只能操作 str ,不能再操作 f 对象
s = f.read()       # 报错!!!f 对象的作用域只能在上面的 with 块内

一般对文件进行各种操作都使用with open() as f写法,关键字with在不再需要访问文件后将其关闭,你当然可以使用open()close()来打开和关闭文件,但这样做时一方面如果程序存在bug导致close()没有执行,文件将不会关闭,这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损;另一方面如果在程序中过早地使用close(),你会发现需要使用文件时它已经关闭,这会导致更多的错误,并非在任何情况下你都能轻松确定关闭文件的恰当时机,但通过with关键字来操作,你完全可以将这个问题交给Python,你只管打开并使用它。

【关于绝对路径与相对路径】

假使文件位置如上图所示
使用绝对路径打开txt文件:

text = open("D:\\study\\Python\\TXT\\test.txt").read()
print(text)

使用相对路径打开txt文件:

text = open("..\\TXT\\test.txt").read()
print(text)

其中,使用双反斜杠(\)是因为Python中将反斜杠()作为转义字符,这里使用单反斜杠将会报错,而Linux与Mac OS则不必担心;相对路径中的两个点(…)表示返回此文件的上一级目录,一个点(.)表示此文件的所在目录。

2.分词并进行词频统计

中文分词使用jieba库进行,词频统计则直接对分词结果进行遍历统计即可。
jieba分词库的使用这里不作介绍,百度即可。

import jieba# 使用jieba分词
all_words = jieba.lcut(txt)
counts = {}
# 词频统计
for word in all_words:if len(word) == 1:continueelse:counts[word] = counts.get(word, 0) + 1
# 词频排序
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
sort_li = sorted(counts.values(), reverse=True)

得到词频统计的结果之后将其写入csv文件中,并且绘制排序-数量曲线,这里使用matplotlib库进行二维图像绘制。

import matplotlib.pyplot as plt# 将排序结果写入到csv文件中
pd.DataFrame(items).to_csv('自律胜于纪律.csv', encoding='utf-8_sig')
X = [i for i in range(len(sort_li))]
plt.plot(X, sort_li, 'r')
plt.xscale('log')
plt.yscale('log')
plt.xlabel('word number')
plt.ylabel('word frequency')
plt.title('Word Frequency Statistics')
plt.show()


这是输出到csv文件中的效果,共计出现11071个词。

这是绘制的排序-数量图,可以明显验证齐普夫定律(Zipf’s law),通过查看csv文件,词频在100以上的词仅有不到50个,占总词数的0.45%。

3.正则表达式匹配

使用正则表达式对小说中的内容进行提取,Python正则表达式的用法这里不作介绍,百度即可。
1.匹配小说中所有章节名

pat_chapter = '第\\d+章.{8}'   # 正则表达式
chapter = re.findall(pat_chapter, txt) # 使用findall()方法进行全文匹配
if chapter: # 如果成功匹配到for item in chapter:print(unicodedata.normalize('NFKC', item)) # 使用unicodedata将空格字符正常显示
else:print("匹配失败")
'''
输出如下:
第1章 自律是一种信仰
第2章 自律是一种自省
第3章 自律是一种自警
第4章 自律是一种素质
第5章 自律是一种自爱
第6章 自律是一种觉悟
第7章 管好自己的目标
第8章 管好自己的言行
第9章 管好自己的时间
第10章 管好自己的习惯
第11章 管好自己的情绪
第12章 管好自己的心态
第1章 自律是一种信仰
第2章 自律是一种自省
第3章 自律是一种自警
第4章 自律是一种素质
第5章 自律是一种自爱
第6章 自律是一种觉悟
第7章 管好自己的目标
第8章 管好自己的言行
第9章 管好自己的时间
第10章 管好自己的习惯
第11章 管好自己的情绪
第12章 管好自己的心态进程已结束,退出代码0
'''
#已匹配到文中全部章节名,符合要求

2.多个匹配
可以发现这样的匹配是可行的,但是如果想要一次性匹配多种、多个内容,但又想避免写出重复代码,这个时候字典的作用就体现出来了。

'''正则匹配'''
def selectSome(txt):# 匹配所有章节名pattens = {'所有章节名' : '第\\d+章.{8}','人名-罗纳德' : '.{3}罗纳德.{3}','所有出现的书籍' : '《[^》]*》','所有人物说的话' : '.{8}:“[^”]*”','所有引用但不是以冒号引出的第一人称说的话' : '[^:]“[^”]*”','所有顿号的词' : '[,。:?“][^,。:?]*、.*[,|。]{1}'}for key, value in pattens.items():print('=====================    下面是' + key + '  =====================')chapter = re.findall(value, txt)nums = 1if chapter:for item in chapter:print(str(nums) + '.  ' + unicodedata.normalize('NFKC', item))  # 使用unicodedata将空白字符正常显示nums += 1else:print("匹配失败")

这样只需要修改字典中的正则键值对即可实现一次性完成所有的匹配了,运行结果太长,这里不作展示,读者可自行运行代码体验。

总结及源码

上述操作涉及Python的基本语法、正则表达式的用法以及jieba、pandas、matplotlib、unicodedata等库的使用,难度系数不大,适宜练手熟悉各种函数的用法,读者可基于此再进行更多的操作练习。
创作不易,切勿侵权照搬。

源码

'''
Python实现文本处理
@author: Ernest
2021-6-3
'''
import jieba
import pandas as pd
import unicodedata
import matplotlib.pyplot as plt
import re'''词频统计'''
def word_freq(txt):# 使用jieba分词all_words = jieba.lcut(txt)counts = {}# 词频统计for word in all_words:if len(word) == 1:continueelse:counts[word] = counts.get(word, 0) + 1# 词频排序items = list(counts.items())items.sort(key=lambda x:x[1], reverse=True)sort_li = sorted(counts.values(), reverse=True)# 将排序结果写入到csv文件中pd.DataFrame(items).to_csv('自律胜于纪律.csv', encoding='utf-8_sig')# 绘制排序-数量曲线X = [i for i in range(len(sort_li))]plt.plot(X, sort_li, 'r')plt.xscale('log')plt.yscale('log')plt.xlabel('word number')plt.ylabel('word frequency')plt.title('Word Frequency Statistics')plt.show()'''正则匹配'''
def selectSome(txt):# 所有想要匹配的正则表达式pattens = {'所有章节名' : '第\\d+章.{8}','人名-罗纳德' : '.{3}罗纳德.{3}','所有出现的书籍' : '《[^》]*》','所有人物说的话' : '.{8}:“[^”]*”','所有引用但不是以冒号引出的第一人称说的话' : '[^:]“[^”]*”','所有顿号的词' : '[,。:?“][^,。:?]*、.*[,|。]{1}'}for key, value in pattens.items():print('=====================    下面是' + key + '  =====================')chapter = re.findall(value, txt)nums = 1if chapter:for item in chapter:print(str(nums) + '.  ' + unicodedata.normalize('NFKC', item))  # 使用unicodedata将空白字符正常显示nums += 1else:print("匹配失败")def main():# 读取文本with open(r'自律胜于纪律.txt', 'r', encoding='utf8') as TJ:txt = TJ.read()selectSome(txt)word_freq(txt)if __name__ == '__main__':main()

Python处理中文文本相关推荐

  1. python读入中文文本编码错误

    python读入中文文本编码错误 python读入中文txt文本: #coding:utf-8def readFile():fp = open('emotion_dict//neg//neg_all_ ...

  2. 如何使用python处理中文文本--近几个月的新闻数据分析社会热点并创造词云图

    使用python处理中文文本并创造词云图 1.前言 利用爬虫爬取网上新闻,评论,并从中分析最近社会热点,是数据科学,人工智能中的热点之一,其中在分析文本中使用词云图,看起来简洁明了,因为如下图出现频率 ...

  3. 基于Python实现中文文本关键词抽取的三种方法 课程报告+项目源码及数据

    资源下载地址:https://download.csdn.net/download/sheziqiong/85737856 资源下载地址:https://download.csdn.net/downl ...

  4. Python 任意中文文本生成词云 最终版本

    前叙 利用下面的代码你将可以将任意中文文本生成词云,其分词部分由jieba,NLPIR2016两个部分组成,生成词语由worldcloud负责,默认会自动发现文本中的20个新词并添加到词库中,当然你也 ...

  5. 使用python对中文文本进行分词

    何为中文分词,指的是将一个汉字序列切分成一个个单独的词. 这里我们推荐使用jieba分词,它是专门使用python语言开发的分词系统,占用资源较少,常识类文档的分词精度较高. 我们可以去网上下载jie ...

  6. [原创]python计算中文文本相似度神器

    介绍 最近因为工作需要,需要使用一个功能,就是中文文本相似度的计算.属于nlp领域的一个应用吧,这里找到一个非常好的包和大家分享.这个包叫sentence-transformers. 这里给大家介绍, ...

  7. python实现中文文本分句

    对于英文文本分句比较简单,只要根据终结符"."划分就好,中文文本分句看似很简单,但是实现时会遇到很多麻烦,尤其是处理社交媒体数据时,会遇到文本格式不规范等问题.下面代码针对一段一段 ...

  8. python打开中文文本utf-8用不了_关于Python文档读取UTF-8编码文件问题

    近来接到一个小项目,读取目标文件中每一行url,并逐个请求url,拿到想要的数据. #-*- coding:utf-8 -*- classIpUrlManager(object):def __init ...

  9. python读中文文本_python读取中文txt文本

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. select,epoll,poll比较
  2. c#中enum的用法小结
  3. 解决安装下载好的whl库包时,报错:zipfile.BadZipFile: File is not a zip file
  4. aida64 extreme 序列号_轻声问海关,规范申报错了谁负责?底料来源四川行不行?没有公式定价行不行?序列号是料号行不行?...
  5. leader选举的原理
  6. Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
  7. 引入ui组件_Vuejs, Semantic CSS前端框架fish-ui
  8. 发送邮件程序报错454 Authentication failed以及POP3和SMTP简介
  9. 利用hibernate中的SchemaExport生成数据表
  10. Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量
  11. Vue+Webpack使用规范
  12. directx9又更新了。
  13. hive启动debug问题
  14. (个人简历一)用纯html写个人简历
  15. 由矢量电子海图构建海底 TINDEM方法研究
  16. 21天学会Java之(Java SE第十二篇):多线程、Lambda表达式
  17. myeclipse6.5-8.5 激活码 秘钥 及使用
  18. 手写curry函数,实现函数柯里化
  19. 你要的技术干货我都总结好了
  20. ubuntu服务器设置定时自动开关机

热门文章

  1. 七大设计原则之开闭原则
  2. 【windows版本】 db2数据库安装与使用
  3. 【凸优化】关于 KKT 条件 及其最优性
  4. Postgis源码编译
  5. web表格CSS 属性
  6. 虚拟机中安装linux系统步骤
  7. Concepts:Overview
  8. 企业办公oa系统、医药OA办公后台管理、会议管理、用户管理、物料管理、活动管理、日常拜访、Axure医药内部管理平台、web端后台管理系统原型、医药OA系统、权限管理、Axure原型、rp原型
  9. 使用Python预测黄金AU9999收盘价
  10. feof()函数的文件操作