NLP|用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")

检验效果
NLP|用python进行精细中文分句(基于正则表达式),HarvestText(文本挖掘和预处理工具)
文章图片


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>   ' ' 清洗后:'' 繁体字转简体 原: 心碎誰買單 清洗后: 心碎谁买单

【NLP|用python进行精细中文分句(基于正则表达式),HarvestText(文本挖掘和预处理工具)】

    推荐阅读