当今世界,大量数据是非结构化的,例如社交媒体评论、浏览历史和客户反馈等文本数据。面对海量文本数据却不知从何下手分析?Python 的自然语言处理 (NLP) 技术可以助您一臂之力!
本教程旨在指导您运用 NLP 的核心概念,使用 Python 分析文本数据。我们将学习如何将文本分解成更小的单元(词元化),将单词规范化为词干形式(词干提取和词形还原),以及如何清理文档以准备进一步分析。
让我们开始吧!
FreqDist
类查找单词频率。这对于查找文本中常用的术语非常有用。本教程将使用 Python 的 NLTK 库对文本执行所有 NLP 操作。撰写本教程时,我们使用的是 NLTK 3.4 版本。您可以使用终端上的 pip 命令安装该库:
pip install nltk==3.4
要检查系统中安装的 NLTK 版本,可以将库导入 Python 解释器并检查版本:
import nltk print(nltk.__version__)
在本教程中,为了执行 NLTK 中的某些操作,您可能需要下载特定的资源。我们将在需要时对每个资源进行描述。
但是,如果您想避免在教程后期逐个下载资源,可以现在一次性下载所有资源:
python -m nltk.downloader all
计算机系统无法自行理解自然语言。处理自然语言的第一步是将原始文本转换为词元。词元是具有某种意义的连续字符的组合。如何将句子分解成词元取决于您自己。例如,一种简单的方法是按空格分割句子以将其分解成单个单词。
在 NLTK 库中,您可以使用 word_tokenize()
函数将字符串转换为词元。但是,您首先需要下载 punkt 资源。在终端中运行以下命令:
nltk.download('punkt')
接下来,您需要从 nltk.tokenize
导入 word_tokenize
以使用它:
from nltk.tokenize import word_tokenize print(word_tokenize("Hi, this is a nice hotel."))
代码的输出如下:
pip install nltk==3.4
您会注意到,word_tokenize
不仅仅是基于空格分割字符串,还会将标点符号也分离成词元。保留或去除标点符号取决于您的分析需求。
在处理自然语言时,您经常会注意到同一个单词存在各种语法形式。例如,“go”、“going”和“gone”都是同一个动词“go”的不同形式。
虽然您的项目可能需要保留单词的各种语法形式,但让我们讨论一种将同一个单词的不同语法形式转换为其词干形式的方法。您可以使用两种技术将单词转换为其词干形式。
第一种技术是词干提取。词干提取是一种简单的算法,它去除单词的词缀。NLTK 中有多种可用的词干提取算法。在本教程中,我们将使用 Porter 算法。
我们首先从 nltk.stem.porter
导入 PorterStemmer
。接下来,我们将词干提取器初始化为 stemmer
变量,然后使用 .stem()
方法查找单词的词干形式:
import nltk print(nltk.__version__)
上面代码的输出是 go。如果您对上面描述的“go”的其他形式运行词干提取器,您会注意到词干提取器返回相同的词干形式“go”。但是,由于词干提取只是一个基于去除单词词缀的简单算法,因此当单词在语言中使用频率较低时,它会失效。
例如,当您尝试对单词“constitutes”使用词干提取器时,它会给出不直观的結果:
python -m nltk.downloader all
您会注意到输出是“constitut”。
这个问题可以通过采用更复杂的方法来解决,该方法是在给定的上下文中查找单词的词干形式。这个过程称为词形还原。词形还原根据文本的上下文和词汇表将单词规范化。在 NLTK 中,您可以使用 WordNetLemmatizer
类对句子进行词形还原。
首先,您需要从 NLTK 下载器在 Python 终端下载 wordnet 资源:
nltk.download('punkt')
下载完成后,您需要导入 WordNetLemmatizer
类并对其进行初始化:
from nltk.tokenize import word_tokenize print(word_tokenize("Hi, this is a nice hotel."))
要使用词形还原器,请使用 .lemmatize()
方法。它接受两个参数:单词和上下文。在我们的示例中,我们将使用“v”作为上下文。在查看 .lemmatize()
方法的输出后,我们将进一步探讨上下文:
<code>['Hi', ',', 'this', 'is', 'a', 'nice', 'hotel', '.']</code>
您会注意到,.lemmatize()
方法正确地将单词“constitutes”转换为其词干形式“constitute”。您还会注意到,词形还原比词干提取花费的时间更长,因为该算法更复杂。
让我们检查如何以编程方式确定 .lemmatize()
方法的第二个参数。NLTK 有一个 pos_tag()
函数,它有助于确定句子中单词的上下文。但是,您首先需要通过 NLTK 下载器下载 averaged_perceptron_tagger
资源:
pip install nltk==3.4
接下来,导入 pos_tag()
函数并在句子上运行它:
import nltk print(nltk.__version__)
您会注意到,输出是一个对列表。每一对都包含一个词元及其标签,该标签表示词元在整个文本中的上下文。请注意,标点符号的标签就是它本身:
python -m nltk.downloader all
如何解码每个词元的上下文?以下是网络上所有标签及其相应含义的完整列表。请注意,所有名词的标签都以“N”开头,所有动词的标签都以“V”开头。我们可以在 .lemmatize()
方法的第二个参数中使用此信息:
nltk.download('punkt')
上面代码的输出如下:
from nltk.tokenize import word_tokenize print(word_tokenize("Hi, this is a nice hotel."))
此输出符合预期,“constitutes”和“magistrates”分别转换为“constitute”和“magistrate”。
准备数据的下一步是清理数据并去除任何不会为您的分析增加意义的内容。总的来说,我们将研究如何从分析中去除标点符号和停用词。
去除标点符号是一项相当简单的任务。string
库的 punctuation
对象包含英语中的所有标点符号:
<code>['Hi', ',', 'this', 'is', 'a', 'nice', 'hotel', '.']</code>
此代码片段的输出如下:
from nltk.stem.porter import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("going"))
为了从词元中去除标点符号,您可以简单地运行以下代码:
print(stemmer.stem("constitutes"))
接下来,我们将重点介绍如何去除停用词。停用词是语言中常用的词,例如“I”、“a”和“the”,在分析文本时,这些词几乎不提供任何意义。因此,我们将从分析中去除停用词。首先,从 NLTK 下载器下载 stopwords 资源:
nltk.download('wordnet')
下载完成后,从 nltk.corpus
导入 stopwords
并使用 words()
方法,其中“english”作为参数。这是一个包含英语中 179 个停用词的列表:
from nltk.stem.wordnet import WordNetLemmatizer lem = WordNetLemmatizer()
我们可以将词形还原示例与本节中讨论的概念结合起来,创建以下函数 clean_data()
。此外,在比较单词是否属于停用词列表的一部分之前,我们将将其转换为小写。这样,如果停用词出现在句首并大写,我们仍然可以捕获它:
print(lem.lemmatize('constitutes', 'v'))
此示例的输出如下:
nltk.download('averaged_perceptron_tagger')
如您所见,标点符号和停用词已被去除。
现在您已经熟悉了 NLP 中的基本清理技术,让我们尝试查找文本中单词的频率。在本练习中,我们将使用童话故事《老鼠、鸟和香肠》的文本,该文本可在古腾堡项目上免费获得。我们将把这个童话故事的文本存储在一个字符串 text
中。
首先,我们对 text
进行词元化,然后使用上面定义的函数 clean_data
对其进行清理:
pip install nltk==3.4
要查找文本中单词的频率分布,可以使用 NLTK 的 FreqDist
类。使用词元作为参数初始化该类。然后使用 .most_common()
方法查找常用术语。在本例中,让我们尝试查找前十个术语:
import nltk print(nltk.__version__)
以下是这个童话故事中出现频率最高的十个术语:
python -m nltk.downloader all
不出所料,三个最常见的术语是童话故事中的三个主要人物。
在分析文本时,单词的频率可能并不重要。通常,NLP 的下一步是生成统计数据——TF-IDF(词频-逆文档频率)——它表示单词在一组文档中的重要性。
在本教程中,我们初步了解了 Python 中的自然语言处理。我们将文本转换为词元,将单词转换为其词干形式,最后清理文本以去除任何不会为分析增加意义的部分。
虽然在本教程中我们研究了简单的 NLP 任务,但还有许多其他技术需要探索。例如,我们可能希望对文本数据执行主题建模,其目标是查找文本可能讨论的共同主题。NLP 中一项更复杂的任务是实现情感分析模型以确定任何文本背后的情感。
有任何意见或问题?请随时在 Twitter 上联系我。
自然语言处理 (NLP) 和自然语言理解 (NLU) 是人工智能的两个子领域,经常被混淆。NLP 是一种更广泛的概念,它包含所有用于使用自然语言与计算机交互的方法。这包括理解和生成人类语言。另一方面,NLU 是 NLP 的一个子集,专门处理理解方面。它涉及使用算法以有价值的方式理解和解释人类语言。
提高 NLP 模型的准确性涉及多种策略。首先,您可以使用更多训练数据。您的模型拥有的学习数据越多,其性能就越好。其次,考虑使用不同的 NLP 技术。例如,如果您使用的是词袋 (BoW),您可能需要尝试词频-逆文档频率 (TF-IDF) 或 Word2Vec。最后,微调模型的参数也可以带来显著改进。
NLP 在现实世界中具有广泛的应用。这些包括语言翻译、情感分析、聊天机器人、Siri 和 Alexa 等语音助手、文本摘要和电子邮件垃圾邮件检测。
词元化是将文本分解成单个单词或词元的过程。这是 NLP 中的一个关键步骤,因为它允许模型理解和分析文本。在 Python 中,您可以使用 NLTK 库的 word_tokenize
函数来执行词元化。
停用词是常用词,在 NLP 的预处理阶段经常被过滤掉,因为它们不包含太多有意义的信息。示例包括“is”、“the”、“and”等。去除这些词可以帮助提高 NLP 模型的性能。
由于语法、句法和词汇的差异,在 NLP 中处理多种语言可能具有挑战性。但是,Python 的 NLTK 库支持多种语言。您还可以使用像 langdetect
这样的语言检测库来识别文本的语言,然后再对其进行处理。
词干提取和词形还原是用于将单词简化为其词干或词根形式的技术。它们之间的主要区别在于,词干提取经常会创建不存在的单词,而词形还原则将单词简化为其语言上正确的词根形式。
情感分析涉及确定文本中表达的情感。这可以使用各种 NLP 技术来完成。例如,您可以使用 Python 中的 TextBlob 库轻松执行情感分析。
n 元语法是给定文本或语音样本中 n 个连续项目的连续序列。它们用于 NLP 来预测序列中的下一个项目。例如,在二元语法 (n=2) 中,您考虑单词对进行分析或预测。
文本分类涉及将文本分类到预定义的类别中。这可以使用各种 NLP 技术和机器学习算法来完成。例如,您可以使用词袋或 TF-IDF 进行特征提取,然后将这些特征输入机器学习模型进行分类。
以上是开始使用Python的自然语言处理的详细内容。更多信息请关注PHP中文网其他相关文章!