用python进行精细中文分句(基于正则表达式),HarvestText:文本挖掘和预处理工具
1.用python进行精细中文分句(基于正则表达式)
中文分句,乍一看是一个挺简单的工作,一般我们只要找到一个【。!?】这类的典型断句符断开就可以了吗。
对于简单的文本这个做法是已经可行了(比如我看到这篇文章里有个简洁的实现方法
自然语言处理学习3:中文分句re.split(),jieba分词和词频统计FreqDist_zhuzuwei的博客-CSDN博客_jieba 分句
NLTK使用笔记,NLTK是常用的Python自然语言处理库
然而当我处理小说文本时,发现了这种思路的漏洞:
- 对于有双引号的句子,分句结果应该延后到双引号结束后,比如:
今天上午,我去“秘密基地”了。
- 省略号也是常见的句子分隔符,然而它超过了一个字符,用re.split()的方法就略有不便。
所以,这里我提供一个更加精细的解决方法,可以解决上面的问题:
# 版本为python3,如果为python2需要在字符串前面加上u
import re
def cut_sent(para):
para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para) # 单字符断句符
para = re.sub('(\.{6})([^”’])', r"\1\n\2", para) # 英文省略号
para = re.sub('(\…{2})([^”’])', r"\1\n\2", para) # 中文省略号
para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para)
# 如果双引号前有终止符,那么双引号才是句子的终点,把分句符\n放到双引号后,注意前面的几句都小心保留了双引号
para = para.rstrip() # 段尾如果有多余的\n就去掉它
# 很多规则中会考虑分号;,但是这里我把它忽略不计,破折号、英文双引号等同样忽略,需要的再做些简单调整即可。
return para.split("\n")
检验效果
2. HarvestText:文本挖掘和预处理工具
HarvestText是一个专注无(弱)监督方法,能够整合领域知识(如类型,别名)对特定领域文本进行简单高效地处理和分析的库。适用于许多文本预处理和初步探索性分析任务,在小说分析,网络文本,专业文献等领域都有潜在应用价值。
处理数据时,除了分句可能还要先清洗特殊的数据格式,
如微博,HTML代码,URL,Email等,
某大佬!将一批常用的数据预处理和清洗操作都整合进了开发的HarvestText库
github(https://github.com/blmoistawinde/HarvestText)
码云:https://gitee.com/dingding962285595/HarvestText
使用文档:Welcome to HarvestText’s documentation! — HarvestText 0.8.1.7 documentation
2.1 文本清洗例子:
print("各种清洗文本")
ht0 = HarvestText()
# 默认的设置可用于清洗微博文本
text1 = "回复@钱旭明QXM:[嘻嘻][嘻嘻] //@钱旭明QXM:杨大哥[good][good]"
print("清洗微博【@和表情符等】")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1))
# URL的清理
text1 = "【#赵薇#:正筹备下一部电影 但不是青春片....http://t.cn/8FLopdQ"
print("清洗网址URL")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, remove_url=True))
# 清洗邮箱
text1 = "我的邮箱是abc@demo.com,欢迎联系"
print("清洗邮箱")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, email=True))
# 处理URL转义字符
text1 = "www.%E4%B8%AD%E6%96%87%20and%20space.com"
print("URL转正常字符")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, norm_url=True, remove_url=False))
text1 = "www.中文 and space.com"
print("正常字符转URL[含有中文和空格的request需要注意]")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, to_url=True, remove_url=False))
# 处理HTML转义字符
text1 = "<a c> ''"
print("HTML转正常字符")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, norm_html=True))
# 繁体字转简体
text1 = "心碎誰買單"
print("繁体字转简体")
print("原:", text1)
print("清洗后:", ht0.clean_text(text1, t2s=True))
结果
各种清洗文本
清洗微博【@和表情符等】
原: 回复@钱旭明QXM:[嘻嘻][嘻嘻] //@钱旭明QXM:杨大哥[good][good]
清洗后: 杨大哥
清洗网址URL
原: 【#赵薇#:正筹备下一部电影 但不是青春片....http://t.cn/8FLopdQ
清洗后: 【#赵薇#:正筹备下一部电影 但不是青春片....
清洗邮箱
原: 我的邮箱是abc@demo.com,欢迎联系
清洗后: 我的邮箱是,欢迎联系
URL转正常字符
原: www.%E4%B8%AD%E6%96%87%20and%20space.com
清洗后: www.中文 and space.com
正常字符转URL[含有中文和空格的request需要注意]
原: www.中文 and space.com
清洗后: www.%E4%B8%AD%E6%96%87%20and%20space.com
HTML转正常字符
原: <a c> ''
清洗后: <a c> ''
繁体字转简体
原: 心碎誰買單
清洗后: 心碎谁买单