自然语言处理(NLP)的应用领域非常广泛。例如,机器可以对电子邮件进行分类,判断其是否为垃圾邮件;分析用户回复的情感倾向,判断其是正面还是负面;搜索引擎也可以根据查询内容识别出用户的意图,从而提供更精准的搜索结果。
自然语言处理是我认为最吸引人的数据科学领域之一。机器能够以较高的准确性理解文本内容,这一现象既令人着迷,有时也令人感到一丝恐惧。
那么,自然语言处理在实际应用中是如何实现的呢?本文将介绍自然语言处理的基本概念,并重点讲解如何在Python中使用nltk库进行相关操作。
注意:为了运行下面的示例,你需要安装nltk库。如果没有安装,只需在命令行中运行pip install nltk,然后在Python环境中运行nltk.download(),再开始执行后续代码。
在将文本或句子送入机器前,通常需要对其进行简化处理。这一过程可以通过词语切分(Tokenization)和词形还原(Lemmatization)来实现。词语切分指的是将文本拆分为单词或单词组合;词形还原则是将某些单词转换为其基本形态,例如将复数单词转换为单数,将动词转换为其基本形式等。此外,在进行这些操作前,我们还会移除所有不具备实际意义的单词,即停用词。
我们来看一个具体的例子,以便更好地理解这些概念。
在进行词语切分时,选择合适的n-gram非常重要。n-gram指定了每次切分时所需的单词数量。大多数情况下,n-gram的值为1。然而,在商业应用中,如心情分析,可能需要考虑更多词组,比如“不开心”或“不喜欢”。这时,你可能需要调整n-gram的设置,并观察其对分析结果的影响。
在词语切分过程中,还需要注意一些细节,例如标点符号。通常情况下,标点符号被视为无信息量的内容,但有些情况下,例如文本中的数字,可能会保留标点符号。具体处理方式应根据实际情况而定。
以下代码展示了如何使用正则表达式标记符RegexpTokenizer进行词语切分。对于不熟悉正则表达式的读者来说,它是一种定义模式的字符序列。在RegexpTokenizer函数中,传入的参数决定了如何拆分文本。在正则表达式中,w+表示将长度大于或等于1的所有单词字符分组,并忽略空格和所有非单词字符(即标点符号)。
这段代码生成的令牌列表是:['Rome', 'was', 'founded', 'in', '753BC', 'by', 'its', 'first', 'king', 'Romulus']
这样,标点符号就消失了,效果不错!接下来,我们需要去除停用词。幸运的是,nltk库提供了多种语言的停用词列表。不过,根据具体情况,你可能需要自定义这个列表。例如,本文默认包含了某些停用词,但如果你在分析电影或音乐数据库时,可能希望保留这些词,因为它们在不同场景下有不同的含义。
经过处理后,新的令牌列表是:['Rome', 'founded', '753BC', 'first', 'king', 'Romulus']
这样,原本的10个单词减少到了6个。
接下来,我们来了解一下两种常用的词形还原工具:WordNetLemmatizer和PorterStemmer。这两种工具都能将单词转换为基本形态,但PorterStemmer更为激进。我们来看一个例子。
WordNetLemmatizer只对复数单词和其他特定情况有效。在这个例子中,单词并没有发生明显变化。另一方面,PorterStemmer会将复数单词、派生词、动词等转换为基本形态,并将所有单词转换为小写。
列表最终变成了:['rome', 'found', '753bc', 'first', 'king', 'romulu']
这样,所有单词都变成了小写,而且“found”变成了“find”,“Romulus”也失去了最后一个字母。
这些词形还原工具各有特点,具体使用哪种工具取决于具体情况。
在构建模型之前,有许多不同的方法可以从文本中提取和整理单词,这只是其中的一部分。在将文本输入机器学习模型之前,对文本进行清洗和简化是非常重要的步骤,以尽可能减少噪声。当处理大量的文本数据时,可以使用sklearn库中的CountVectorizer、TfidfVectorizer或HashingVectorizer等方法将原始文本转换为令牌计数矩阵,以便训练模型。
以上就是自然语言处理的一些基本概念及其应用示例。希望对你有所帮助。