在前面的小节中,我们学习了词袋模型、词频以及逆文档频率。不过在构建词袋模型之前,最重要的一步就是——通过去除所有不需要的字符对文本数据进行清洗。为了说明此步骤的重要性,我们先展示一下经过重排后数据集中第一个文档的最后50个字符:
正如我们所见,文本中包含HTML标记、标点符号以及其他非字母字符。HTML标记并未包含很多有用语义,标点符号可以在某些NLP语境中提供有用及附加信息。不过,为了简单起见,我们将去除标点符号,只保留表情符号,如":)",因为它们在情感分析中通常是有用的。为了完成此任务,我们将使用Python的正则表达式(regex)库:re,代码如下:
通过代码中的第一个正则表达式<[^>]*>,我们试图移除电影评论中所有的HTML标记。虽然许多程序员通常建议不要使用正则表达式解析HTML,但这个正则表达式足以清理此特定数据集。在移除了HTML标记后,我们使用稍微复杂的正则表达式寻找表情符号,并将其临时存储在emoticons中。接下来,我们通过正则表达式[/W]+删除文本中所有的非单词字符,将文本转换为小写字母,最后将emoticons中临时存储的表情符号追加在经过处理的文档字符串后。此外,为了保证表情符号的一致,我们还删除了表情符号中代表鼻子的字符(-)。
虽然正则表达式为我们提供了一种在字符串中搜索特定字符的方便且有效的方法,但掌握它会有一个相对陡峭的学习曲线,而对正则表达式的讨论也超出了本书的范围。不过,读者可以通过谷歌开发者门户找到相关的入门教程:https://developers.google.com/edu/python/regular-expressions,或者查看Python中re模块的官方文档:https://docs.python.org/3.4/library/re.html。
尽管将表情符号追加到经过清洗的文档字符串的最后,看上去不是最简洁的方法,但是当词袋模型中所有的符号都由单个单词组成时,单词的顺序并不重要。在对文档划分成条目、单词及符号做进一步讨论之前,先来确认一下预处理操作是否能正常工作:
最后,由于我们将在下一节中反复使用在此经过清洗的文本数据,现在通过preprocessor函数移除DataFrame中所有的电影评论信息: