天才幻想家 2020-08-03
自然语言处理是 AI 皇冠上的明珠,而语料预处理是自然语言处理的基础。
机器能跟人类交流吗?能像人类一样理解文本吗?这是大家对人工智能最初的想象。如今,NLP 技术可以充当人类和机器之间沟通的桥梁。环顾周围的生活,我们随时可以享受到 NLP 技术带来的便利,语音识别、机器翻译、问答系统等等。
这些技术看起来高深莫测,实则都有章可循。当你了解算法的底层原理后,你可能会恍然大悟,嗨!这也不是很难理解嘛。
现在你可以跟随本文,初探 NLP 技术的地基(语料预处理)是如何构建起来的。在之后的文章中,我们将循序渐进地介绍 NLP 中的特征提取以及最新算法解读。
语料,顾名思义就是我们平时所说的文本,带有文字描述性的文本都可以归类于语料。但这种原始文本无法直接用来训练模型,需要进行前期预处理。
语料预处理方法主要包括数据清洗、分词、词性标注、去停用词等。
语料清洗即保留语料中有用的数据,删除噪音数据。常见的清洗方式有:人工去重、对齐、删除、标注等。
以下面的文本为例。该文本不仅包含中文字符,还包括数字、英文字符、标点等非常规字符,这些都是无意义的信息,需要进行清洗。
像上述情况,清洗的方法主要是通过正则表达式。可以编写简短的 Python 小脚本来解决,代码如下:
清洗后的结果:
除了上述需要清洗的形式以外,噪音数据还包括文本重复、错误、缺失、异常等。清洗的方法包括手动处理,或者通过开发小工具、写个简短的小程序,这些方式都可以进行数据清洗。
分词
数据清洗完,就可以进行下一步工序:文本分词。文本分词,即将文本分成一个一个的词语。常用的分词方法有基于规则的、基于统计的分词方法,而统计的样本内容来自于一些标准的语料库。
例如这个句子:「小明住在朝阳区」,我们期望语料库统计后分词的结果是:「小明 / 住在 / 朝阳 / 区」,而不是「小明 / 住在 / 朝 / 阳区」。那么如何做到这一点呢?
从统计的角度,可以通过条件概率分布来解决。对于一个新的句子,我们可以通过计算各种分词方法对应的联合分布概率,找到最大概率对应的分词方法,即为最优分词。
到目前为止,研究者已经开发出许多分词实用小工具,这些工具使用都很简单。如果你对分词没有特殊需求,你可以直接使用这些分词工具。
多种分词工具一览。
词性标注
词性标注指为分词结果中的每个词标注正确的词性,即确定每个词是名词、动词、形容词或其他词性的过程。
词性标注有多个重要作用。
第一,消除歧义。一些词在不同语境或不同用法时表示不同的意思。比如在这两个句子「这只狗狗的名字叫开心」和「我今天很开心」中,「开心」就代表了不同的含义。我们可以通过词性标注进行区分。
第二,强化基于单词的特征。还是以上句为例,如果不进行词性标注,两个「开心」会被认为是同义词,词频为 2,这会在后续分析中引入误差。
此外,词性标注还具有标准化、词形还原,以及有效移除停用词的作用。
常用的词性标注方法有基于规则的、基于统计的算法,比如:最大熵词性标注、HMM 词性标注等。
接下来,我们看一个词性标注示例。大家也可以自己尝试:http://ictclas.nlpir.org/nlpir/
去停用词
我们人类在接受消息时,都会滤除无效信息,筛选有用信息。对于自然语言来说,去停用词是一种很明智的操作。
一篇文本,不管是中文还是英文,都有用来起连接作用的连词、虚词、语气词等无意义的词,比如「的」、「吧」、「但是」等等。这些词没有具体的含义,只是起到衔接句子以及增强语气的作用。这些词对文本分析也没有任何帮助,因此我们需要对分词后的数据做停用词处理。
但是我们应该谨慎决定该去除哪类停用词。
下图列出了一些常用的停用词表,你可以参照需求,选择要去除的停用词。
词频统计
词频统计即统计分词后文本的词频,目的是找出对文本影响最大的词汇,是文本挖掘的重要手段。统计这些词出现的频率可以帮助我们了解文章重点强调了什么,进而方便后续构建模型。
比如我们可以统计四大名著之一《红楼梦》中词频在前 28 的词语,结果如下: