在撸《机器学习实战》这本书的时候, 在“基于概率论的分类方法:朴素贝叶斯”这一个章节中发现了作者在谈到切分文本的一些处理原则,记下来可以作为一些初学者的文本处理参考。
本文的实现的方式均为Python
- 对于一个文本字符串,可以用string.split( )方法进行切分:
>>> mySent = 'This book is the best on Python or M.L. I have ever laid eyes upon. '
>>> mySent.split()
['This', 'book', 'is', 'the', 'best', 'on', 'Python', 'or', 'M.L.', 'I', 'have', 'ever', 'laid', 'eyes', 'upon.']
可以看到切分的效果还是不错的,但是标点符号却被当成了词的一部分。我们可以使用正则表达式
来切分句子,切分的规则是除单词,数字外的任意字符串。
>>> import re
>>> regEx = re.compile('\\W*')
>>> listOfTokens = regEx.split(mySent)
>>> listOfTokens
['This', 'book', 'is', 'the', 'best', 'on', 'Python', 'or', 'M', 'L', 'I', 'have', 'ever', 'laid', 'eyes', 'upon', '']
还有一点毛病,需要将里面的字符串也去除,可以计算每个字符串的长度并且返回长度大于0即可
。
>>> [tok for tok in listOfTokens if len(tok) > 0]
['This', 'book', 'is', 'the', 'best', 'on', 'Python', 'or', 'M', 'L', 'I', 'have', 'ever', 'laid', 'eyes', 'upon']
最后,我们在词袋模型中希望每个单词的形式都是统一的,不希望出现大小写的情况,因此可以用Python内嵌的.lower()或者.upper()方法。
>>> [tok.lower() for tok in listOfTokens if len(tok) > 0]
['this', 'book', 'is', 'the', 'best', 'on', 'python', 'or', 'm', 'l', 'i', 'have', 'ever', 'laid', 'eyes', 'upon']
参考文献:Peter Harrington, Machine Learning in Action. 人民邮电出版社. pp. 65, 2013.6