让我们开始吧!
先决条件
在本教程中,我们将使用 Python 的nltk库对文本执行所有 NLP 操作。在编写本教程时,我们使用的是 3.4 版本的nltk. 要安装库,您可以pip在终端上使用命令:
pip install nltk==3.4
要检查系统中有哪个版本nltk,可以将库导入 Python 解释器并检查版本:
import nltk
print(nltk.version)
要执行nltk本教程中的某些操作,您可能需要下载特定资源。我们将在需要时描述每个资源。
但是,如果您想避免在教程后面下载单个资源并立即获取它们,请运行以下命令:
python -m nltk.downloader all
第 1 步:转换为代币
计算机系统本身无法在自然语言中找到意义。处理自然语言的第一步是将原始文本转换为标记。记号是连续字符的组合,具有一定的含义。由您决定如何将句子分解为标记。例如,一个简单的方法是用空格分割一个句子以将其分解为单个单词。
在 NLTK 库中,您可以使用该word_tokenize()函数将字符串转换为标记。但是,您首先需要下载punkt资源。在终端中运行以下命令:
nltk.download('punkt')
接下来,您需要导入word_tokenizefromnltk.tokenize才能使用它:
from nltk.tokenize import word_tokenize
print(word_tokenize("Hi, this is a nice hotel."))
代码的输出如下:
['Hi', ',', 'this', 'is', 'a', 'nice', 'hotel', '.']
您会注意到,word_tokenize它不仅根据空格简单地拆分字符串,而且还将标点符号拆分为标记。如果您想在分析中保留标点符号,这取决于您。
第 2 步:将单词转换为其基本形式
在处理自然语言时,您经常会注意到同一个词有多种语法形式。例如,“go”、“going”和“gone”是同一个动词“go”的形式。
虽然项目的必要性可能要求您保留各种语法形式的单词,但让我们讨论一种将同一单词的各种语法形式转换为其基本形式的方法。您可以使用两种技术将单词转换为其基础。
第一种技术是词干。词干提取是一种从单词中删除词缀的简单算法。NLTK中有多种词干提取算法可供使用。我们将在本教程中使用 Porter 算法。
我们首先PorterStemmer从nltk.stem.porter. 接下来,我们将词干分析器初始化为stemmer变量,然后使用该.stem()方法找到一个单词的基本形式:
from nltk.stem.porter import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem("going"))
上面代码的输出是go. 如果您为上述其他形式的“go”运行词干分析器,您会注意到词干分析器返回相同的基本形式“go”。但是,由于词干提取只是一种基于去除词缀的简单算法,因此当词在语言中不太常用时,它就会失败。
例如,当您尝试对单词“构成”进行词干分析时,它会给出不直观的结果:
print(stemmer.stem("constitutes"))
您会注意到输出是“构成”。
这个问题通过转向一种更复杂的方法来解决给定上下文中单词的基本形式。该过程称为词形还原。词形还原根据文本的上下文和词汇对单词进行规范化。在 NLTK 中,您可以使用WordNetLemmatizer类对句子进行词形还原。
首先,您需要wordnet从 Python 终端中的 NLTK 下载器下载资源:
nltk.download('wordnet')
下载后,您需要导入WordNetLemmatizer该类并对其进行初始化:
from nltk.stem.wordnet import WordNetLemmatizer
lem = WordNetLemmatizer()
要使用词形还原器,请使用.lemmatize()方法。它需要两个参数:单词和上下文。在我们的示例中,我们将使用“v”作为上下文。在查看方法的输出之后,让我们进一步探索上下文.lemmatize():
print(lem.lemmatize('constitutes', 'v'))
您会注意到该.lemmatize()方法正确地将单词“构成”转换为其基本形式“构成”。您还会注意到词形还原比词干提取花费的时间更长,因为算法更复杂。
.lemmatize()让我们检查如何以编程方式确定方法的第二个参数。NLTK 具有pos_tag()帮助确定句子中单词上下文的功能。但是,您首先需要averaged_perceptron_tagger通过 NLTK 下载器下载资源:
nltk.download('averaged_perceptron_tagger')
接下来,导入pos_tag()函数并在一句话上运行:
from nltk.tag import pos_tag
sample = "Hi, this is a nice hotel."
print(pos_tag(word_tokenize(sample)))
您会注意到输出是对的列表。每对都由一个标记及其标记组成,它表示整个文本中标记的上下文。请注意,标点符号的标签本身就是:
[('Hi', 'NNP'),
(',', ','),
('this', 'DT'),
('is', 'VBZ'),
('a', 'DT'),
('nice', 'JJ'),
('hotel', 'NN'),
('.', '.')]
你如何解码每个令牌的上下文?以下是Web 上所有标签及其对应含义的完整列表。请注意,所有名词的标签都以“N”开头,所有动词的标签都以“V”开头。我们可以在.lemmatize()方法的第二个参数中使用此信息:
def lemmatize_tokens(stentence):
lemmatizer = WordNetLemmatizer()
lemmatized_tokens = []
for word, tag in pos_tag(stentence):
if tag.startswith('NN'):
pos = 'n'
elif tag.startswith('VB'):
pos = 'v'
else:
pos = 'a'
lemmatized_tokens.append(lemmatizer.lemmatize(word, pos))
return lemmatized_tokens
sample = "Legal authority constitutes all magistrates."
print(lemmatize_tokens(word_tokenize(sample)))
上面代码的输出如下:
['Legal', 'authority', 'constitute', 'all', 'magistrate', '.']
该输出是预期的,其中“构成”和“地方法官”已分别转换为“构成”和“地方法官”。
第三步:数据清理
准备数据的下一步是清理数据并删除任何不会对您的分析增加意义的内容。从广义上讲,我们将着眼于从您的分析中删除标点符号和停用词。
删除标点符号是一项相当容易的任务。该库的punctuation对象string包含所有英文标点符号:
import string
print(string.punctuation)
此代码段的输出如下:
'!"#$%&</span>'()*+,-./:;<=>?@[</span></span>]^_`{|}~'
为了从标记中删除标点符号,您可以简单地运行以下命令:
for token in tokens:
if token in string.punctuation:
# Do something
接下来,我们将专注于删除停用词。停用词是语言中的常用词,如“I”、“a”和“the”,在分析文本时对文本的意义不大。因此,我们将从分析中删除停用词。首先,stopwords从 NLTK 下载器下载资源:
nltk.download('stopwords')
stopwords下载完成后,导入nltk.corpus并使用.words()以“english”为参数的方法。这是英语中 179 个停用词的列表:
文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传