自然语言处理(NLP)的应用领域非常广泛,例如,它可以用来识别垃圾邮件、判断用户回复的情感倾向,以及根据搜索查询提供个性化的搜索结果。
自然语言处理是我认为最有趣的数据科学领域之一。机器能够以较高的准确性理解和解析文本内容,这一点既令人着迷,又有时令人感到不可思议。
那么,自然语言处理在实际中是如何运作的呢?本文将介绍自然语言处理的基本概念,并重点讲解如何在Python中使用nltk包实现这些功能。
首先,你需要安装nltk库。如果你还没有安装,可以在命令行中运行pip install nltk,然后在Python环境中运行nltk.download()。
无论文本或句子输入机器,都需要进行预处理,主要包括词语切分和词形还原。词语切分即将文本分解成单词或单词组合;词形还原则是将单词转换为其基本形式,例如将复数单词转换为单数,将动词转换为其原形等。此外,还需要移除所有不具备实际意义的停用词。
让我们通过一个具体的例子来更好地理解这些概念。
在进行词语切分时,需要选择合适的ngram值。ngram值决定了每次切分时包含的单词数量。通常情况下,默认值为1,但在某些场景下,比如分析情绪时,可能需要考虑连续的两个或多个单词,如“不开心”或“不喜欢”,因为这些短语可能影响文本的情感分析结果。
在词语切分过程中,还需要注意标点符号的处理。一般情况下,标点符号被认为不携带信息量,可以忽略。但在某些情况下,如文本中包含有意义的数字时,则需要保留这些标点符号。
下面展示了一个使用正则表达式标记器(RegexpTokenizer)的例子。正则表达式是一种由字符组成的模式,用于定义文本的结构。通过不同的参数设置,正则表达式可以实现对文本的不同切分效果。例如,w+表示匹配长度至少为1的所有单词字符,忽略空格和标点符号。
```python import nltk from nltk.tokenize import RegexpTokenizer
text = "Rome was founded in 753BC by its first king, Romulus." tokenizer = RegexpTokenizer(r'w+') tokens = tokenizer.tokenize(text) ```
执行上述代码后,生成的令牌列表为:
['Rome', 'was', 'founded', 'in', '753BC', 'by', 'its', 'first', 'king', 'Romulus']
可以看到,标点符号已经消失,只剩下有意义的单词。
接下来,我们需要从令牌中移除停用词。幸运的是,nltk库提供了多种语言的停用词列表。然而,对于特定应用场景,你可能需要自定义停用词列表。例如,如果在分析电影或音乐数据库时,某些停用词可能需要保留,因为它们可能对分析结果产生影响。
```python from nltk.corpus import stopwords
stopwords = set(stopwords.words('english')) cleantokens = [word for word in tokens if word.lower() not in stop_words] ```
执行上述代码后,清理后的令牌列表为:
['Rome', 'founded', '753BC', 'first', 'king', 'Romulus']
我们从原来的10个单词减少到了6个单词,接下来进入词形还原阶段。我们测试了两种不同的词形还原工具:WordNetLemmatizer和PorterStemmer。WordNetLemmatizer主要用于处理复数和一些特殊情况,而PorterStemmer则更加激进,不仅处理复数和派生词,还处理动词的时态变化,并将所有单词转换为小写。
```python from nltk.stem import WordNetLemmatizer, PorterStemmer
lemmatizer = WordNetLemmatizer() porter_stemmer = PorterStemmer()
lemmatizedtokens = [lemmatizer.lemmatize(word) for word in cleantokens] stemmedtokens = [porterstemmer.stem(word) for word in clean_tokens] ```
执行上述代码后,WordNetLemmatizer处理后的令牌列表为:
['rome', 'founded', '753bc', 'first', 'king', 'romulu']
PorterStemmer处理后的令牌列表为:
['rome', 'found', '753bc', 'first', 'king', 'romul']
在这两种处理方法中,PorterStemmer将单词进行了更多的简化,如将“found”变为“find”,将“Romulus”变为“romul”。
在进行建模前,还有许多方法可以用来整理和组织文本中的词汇。这些方法仅仅是众多选项中的一部分。在将文本输入机器学习模型之前,必须对其进行清洗和简化,以尽可能地减少噪声。当分析大量的文本数据时,可以借助sklearn库中的方法(如CountVectorizer、TfidfVectorizer或HashingVectorizer)将原始文本转换为令牌计数矩阵,以便进行模型训练。