在做语言模型的时候需要对文本做一些预处理,将文本分成一行一句的形式,并标上开始符和结束符。
1.句子切分
可以按照句号,问号,感叹号,进行切分。
然后从未到头扫描一遍,将不是以大写字母开头的拼接到上一句上(对于类似于S. R这类的人名无法处理)
text=re.sub('\. ',' SSS ',text)
text=re.sub('! ',' SSS ',text)
text=re.sub('\? ',' SSS ',text)
sentencelist=text.split('SSS')
sentencelist=[sentence.strip() for sentence in sentencelist]
numofsentence=len(sentencelist)
for num in range(1,numofsentence-1):
if (sentencelist[-num]!='' and sentencelist[-num][0]>='A' and sentencelist[-num][0]<='Z'):
continue
else:
sentencelist[-num-1]= sentencelist[-num-1]+sentencelist[-num]
sentencelist[-num]=''
2.把所有的数字替换成一个特殊的字符,例如 N 。
1中有一个问题,就是会把引号里面的文本句子给切分。
可以在进行第一步之前,先把引号中的内容替换掉,切分完之后再替换回来。这个就有点麻烦,因为还可能出现引号套引号的状况。标点去不去掉对语言模型有什么影响呢?不清楚,可以试一下。我做的拼写纠错的任务里面,标点不去,效果会好些。
原来nltk已经实现了分句,分词,参见http://blog.csdn.net/baidu_27438681/article/details/60468848
nltk 也没有解决 引号 之内的句号如何处理的问题。
是否并不重要?