前言:
神秘力量出现,博主转投NLP领域,干起了文本类型数据处理和识别。由于博主之前一直在视频、图像领域挖坑对NLP这一块儿相当无知,所以,那么,就从最简单的拆分句子开始吧。
背景:
为什么要拆分句子?对于大段的文本,一般情况下都是多个句子合在一起的,如果把它们当成一句语来处理,即作为RNN网络的一条数据有些太“长”,所以我们要对长文本进行切分使其尽可能的“短”,但是为了保持句子意思的完整性又不能随便切分必须按照一定的规则,最简单的是按照 “。?!.” 等中文或英文中常用的句子结束符号。(如有特殊情况特殊处理)
实现:
这个切分实现起来很简单,烦恼点在如何用 python 处理这些文本数据。总所周知,文本数据是字符串类型(string,str)对于 .txt 类型的文件可以直接通过 open() 然后 read() 读取整个文本的内容,然后对于读取到的文本数据可以直接通过正则表达式进行切分。
import re
re.split('[。?!]',text)
这种切分方式对大部分中文和英文文本都适用,但是对于如日文、韩语等语言则不适用,需要别的切分规则,另外如果需要对切分后的文本做进一步的处理,或者直接对原文本做一些处理,推荐一个优秀的package:NLTK pip install nltk。安装时选择download all 即下载所有的文件,成功后会生成一个nltk_data文件,在其中的 tokenizers 的punkt中显示直接支持的语言类型,很遗憾 汉语和日语都不在此列,但是别慌,作为一个成熟以及广受好评的自然语言处理包,不能说不行。
NLTK 内置了一些语言如English、German、Greek等的切分规则,意思就是你可以不用知道这些语言都是以哪种符号结尾,直接调用NLTK的方法就可以完成切分过程,那么如果要处理支持之外的语言呢?NLTK是支持正则表达式的,又回到最初的起点,记忆中。。。
# 对于直接支持的语言
import nltk
from nltk import sent_tokenize
sentences = sent_tokenize(text)
# 对于不直接支持的语言
from nltk import RegexpTokenizer
tokenizer = RegexpTokenizer(".*?[各种奇葩的符号]")
sentences = tokenizer.tokenize(text)
到此,一切看上去都很完美,世界和平,社会和谐,然而事情又怎么会这么简单。文本类型的数据又岂止 .txt 一种格式,你仿佛忘记了大名鼎鼎的 .docx 家族。
pip install docx 不解释。
docx 文本中主要有两大类,纯文本,以及纯表格,至于表格和文本纠缠不清的,对不起,我不会。
纯表格文本
from docx import Document
document = Document('path_to_docx')
tables = document.tables
rows = tables.rows
cells = rows.cells
paragraphs = cells.paragraphs
text = paragraphs.text
简洁明了,通俗易懂,建议好好看文档。
纯文本就省事多了
paragraphs = document.paragraphs
text = paragraphs.text
这里给出一个简单的通过正则表达式切分的例子。
import re
import csv
path = "クリスマス・イーヴ.txt"
with open(path, encoding="utf8", errors='ignore') as f:
words = f.read()
#print(words)
def txtSplit(artical):
sequencelist = re.split('[。?!]',artical)
print(len(sequencelist))
#print(sequencelist)
return sequencelist
def save2txt(sequenceList):
with open("クリスマス・イーヴ1.txt",'w') as f:
for i in range(len(sequenceList)):
f.write(sequenceList[i])
def save2csv(sequenceList):
with open('スリーピー・ホローの伝説.csv', mode='w') as result:
result_writer = csv.writer(result,delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
for i in range(len(sequenceList)):
result_writer.writerow(sequenceList[i])
if __name__ == '__main__':
sequ = txtSplit(words)
save2txt(sequ)
建议不要直接写入csv格式,可以操作看一下效果。另外,基于NLTK、docx等库的代码,可以下载超值大礼包,包含《nltk cook book》。