本教程的目标是使您能够通过自然语言处理(NLP)的概念在Python中分析文本数据。您将首先学习如何将文本标记化为更小的块,将单词规范化为它们的词根形式,然后从文档中移除任何噪音以为进一步分析做准备。让我们开始吧!先决条件在本教程中,我们将使用Python的nltk库对文本执行所有NLP操作。在编写本教程时,我们使用的是nltk的3.4版本。要安装库,您可以在终端上使用pip命令:pipinstallnltk==3.4要检查系统上nltk的版本,您可以将库导入Python解释器并检查版本:importnltkprint(nltk.__version__)要执行本nltk教程中的某些操作,您可能需要下载特定资源。我们将在需要时描述每个资源。但是,如果您想避免在本教程后面下载个别资源并立即获取它们,请运行以下命令:python-mnltk.downloaderall第1步:转换为令牌计算机系统本身无法找到自然语言的含义。处理自然语言的第一步是将原始文本转换为标记。令牌是具有特定含义的连续字符的组合。如何将句子分解为标记取决于您。例如,一个简单的方法是用空格分割一个句子,把它分解成一个个单词。在NLTK库中,您可以使用word_tokenize()函数将字符串转换为标记。但是,您首先需要下载punkt资源。在终端中运行以下命令:nltk.download('punkt')接下来,您需要导入word_tokenizefromnltk.tokenize以使用它:fromnltk.tokenizeimportword_tokenizeprint(word_tokenize("Hi,thisisanicehotel."))代码的输出如下如下:['Hi',',','this','is','a','nice','hotel','.']你会注意到word_tokenize不只是根据空格分割字符串,它也分裂成令牌。是否要在分析中保留标点符号由您决定。第2步:将词转换为其基本形式在处理自然语言时,您经常会注意到同一个词的多种语法形式。例如,“go”、“going”和“gone”是同一个动词“go”的形式。虽然您的项目的必要性可能需要您以各种语法形式保留单词,但让我们讨论一种将同一单词的各种语法形式转换为其基本形式的方法。有两种技术可用于将单词转换为其词基。第一种技术是词干提取。词干提取是一种从单词中删除词缀的简单算法。NLTK有多种可用的词干提取算法。我们将在本教程中使用波特算法。我们从nltk.stem.porter的PorterStemmer开始。接下来,我们将词干分析器初始化为词干变量,然后使用.stem()方法找到词的基本形式:fromnltk.stem.porterimportPorterStemmer=PorterStemmer()print(stemmer.stem("going"))输出上面的代码是go。如果针对上面的其他形式的“go”运行词干分析器,您会注意到词干分析器返回相同的基本形式的“go”。然而,由于词干提取只是一种基于删除词缀的简单算法,因此当单词在语言中不常用时它会失败。例如,当您尝试对单词“constitutes”进行词干提取时,它给出了一个不直观的结果:print(stemmer.stem("constitutes"))您会注意到输出是“constitutes”。这个问题可以通过使用更复杂的方法来找到给定上下文中单词的基本形式来解决。这个过程称为词形还原。词形还原根据文本的上下文和词汇对单词进行归一化。在NLTK中,您可以使用WordNetLemmatizer类对句子进行词形还原。首先需要wordnet在Python终端从NLTK下载器下载资源:nltk.download('wordnet')下载后需要导入WordNetLemmatizer类并初始化:fromnltk.stem.wordnetimportWordNetLemmatizerlem=WordNetLemmatizer()来使用词形还原器,使用.lemmatize()方法。它有两个参数:单词和上下文。在我们的示例中,我们将使用“v”作为上下文。让我们在查看.lemmatize()方法的输出后进一步探索上下文:print(lem.lemmatize('constitutes','v'))转换为基本形式“constitute”。您还会注意到词形还原比词干化花费的时间更长,因为算法更复杂。让我们看看如何以编程方式确定.lemmatize()方法的第二个参数。NLTK有一个pos_tag()函数来帮助确定句子中单词的上下文。但是,您首先需要averaged_perceptron_tagger通过NLTK下载器下载资源:nltk.download('averaged_perceptron_tagger')接下来,导入pos_tag()函数并在句子上运行它:fromnltk.tagimportpos_tagsample="Hi,thisisanicehotel."print(pos_tag(word_tokenize(sample)))你会注意到输出是一个对列表。每对由一个标记及其标记组成,它表示标记在整个文本中的上下文。请注意,标点符号的标签本身就是:[('Hi','NNP'),(',',','),('this','DT'),('is','VBZ'),('a','DT'),('nice','JJ'),('hotel','NN'),('.','.')]你如何解码每个标记的上下文?这是所有标签及其在网络上的相应含义的完整列表。请注意,所有名词标签都以“N”开头,所有动词标签都以“V”开头。我们可以在方法的第二个参数中使用此信息。lemmatize():deflemmatize_tokens(stentence):lemmatizer=WordNetLemmatizer()lemmatized_tokens=[]forword,taginpos_tag(stentence):iftag.startswith('NN'):pos='n'eliftag.startswith('VB'):pos='v'else:pos='a'lemmatized_tokens.append(lemmatizer.lemmatize(word,pos))returnlemmatized_tokenssample="Legalauthorityconstitutesallmagistrates"print(lemmatize_tokens(word_tokenize(样本)))上面代码的输出如下:['Legal','authority','constitute','all','magistrate','.']这个输出应该是“constitutes”和“magistrates”已分开转换为“构成”和“地方法官”。第3步:数据清理准备数据的下一步是清理数据并删除对您的分析没有意义的任何内容。从广义上讲,我们会考虑从您的分析中删除标点符号和停用词。删除标点符号是一项相当容易的任务。库的标点符号对象字符串包含所有英文标点符号:importstringprint(string.punctuation)此代码片段的输出如下:'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'要从标记中删除标点符号,您只需运行:fortokenintokens:iftokeninstring.punctuation:#Dosomething接下来,我们将专注于删除停用词。停用词是语言中常用的词,例如“I”、“a”和“the”,在分析文本时对文本意义不大。因此,我们将从分析中删除停用词。首先,从NLTK下载器下载停用词资源:nltk.download('stopwords')下载完成后,从nltk.corpus导入停用词并使用.words()方法,将“English”作为参数。以下是179个英语停用词的列表:fromnltk.corpusimportstopwordsstop_words=stopwords.words('english')我们可以将词形还原示例与本节讨论的概念结合起来创建以下函数,clean_data()。此外,在比较它是否是停用词列表的一部分之前,我们将单词转换为小写。这样,如果停用词出现在句子的开头并且是大写的,我们仍然会捕获它:defclean_data(tokens,stop_words=()):cleaned_tokens=[]fortoken,taginpos_tag(tokens):iftag.startswith("NN"):pos='n'eliftag.startswith('VB'):pos='v'else:pos='a'lemmatizer=WordNetLemmatizer()token=lemmatizer.lemmatize(token,pos)iftokennotinstring.punctuationandtoken.lower()notinstop_words:cleaned_tokens.append(token)returncleaned_tokenssample="Thequickbrownfoxjumpsoverthelazydog".stop_words=stopwords.words('english')clean_data(word_tokenize(sample),stop_words)这个例子的输出如下:['quick','brown','fox','jump','lazy','dog']如您所见,标点符号和停用词已被删除。词频分布现在您已经熟悉了NLP中的基本清洗技术,让我们尝试找出文本中词的频率。在本练习中,我们将使用古腾堡免费提供的童话故事《老鼠、鸟和香肠》的文本。我们将这个童话故事的文本存储在一个字符串text中。首先,我们对其进行文本标记化,然后使用上面定义的clean_data函数对其进行清理:tokens=word_tokenize(text)cleaned_tokens=clean_data(tokens,stop_words=stop_words)要查找文本中单词的频率分布,可以使用FreqDistNLTK类.使用令牌作为参数初始化类。然后使用.most_common()方法查找最常见的术语。在这种情况下,让我们尝试找出前十项:fromnltkimportFreqDistfreq_dist=FreqDist(cleaned_tokens)freq_dist.most_common(10)以下是这个童话中最常见的十项:[('bird',15),('sausage',11),('mouse',8),('wood',7),('time',6),('long',5),('make',5),('fly',4),('fetch',4),('water',4)]不出所料,出现频率最高的三个词是童话故事中的三个主要人物。在分析文本时,单词的频率可能不是很重要。通常,NLP的下一步是生成一个统计量——TF-IDF(词频-逆向文档频率)——它表示一个词在文档列表中的重要性。结论在本教程中,我们初步了解了Python中的自然语言处理。我们将文本转换为标记,将单词转换为其基本形式,最后清理文本以删除对分析没有意义的任何部分。尽管我们在本教程中查看了简单的NLP任务,但还有更多技术需要探索。例如,我们可能想对文本数据进行主题建模,目的是找到文本可能谈论的共同主题。NLP中更复杂的任务是实施情感分析模型以确定任何文本背后的感受。
