当前位置:   article > 正文

NLTK自然语言处理简介_基于自然语言工具包nltk的文本挖掘实验

基于自然语言工具包nltk的文本挖掘实验

目录

安装

文本分类

结论


自然语言工具包(NLTK)提供了许多用于对文本内容执行自然语言处理(NLP)和机器学习分析的功能。我们将通过一个情感分析示例来演示其文本分类功能。

这是我们学习Python系列及其在机器学习和AI中的使用的第六个模块。在上一篇中,我们讨论了使用OpenCV进行图像识别。现在让我们看一下自然语言工具包(NLTK)可以做什么。

安装

可以使用Anaconda安装NTLK

conda install nltk

或使用pip,通过在Jupyter Notebook单元中运行此命令:

!pip install --upgrade nltk

如果以下Python代码正确运行,则安装成功:

import nltk

NLTK附带了许多您可以下载的数据(语料库、语法、模型等)。只需运行以下Python命令即可显示一个交互式下载窗口:

ntlk.download()

对于此模块,您需要安装停用词语料库。下载后,创建一个名为NLTK_DATA的环境变量,该变量包含下载目录的路径(如果您进行集中安装,则不需要此变量;有关安装数据的完整指南,请参考文档)。

文本分类

对文本进行分类意味着为其分配标签。可以通过多种方式对文本进行分类,例如,通过情感分析(积极/消极[/中性]),垃圾邮件分类(垃圾邮件/非垃圾邮件),文档主题等等。

在本模块中,我们将使用大型电影评论数据集浏览文本分类示例,该数据集提供25,000个电影评论(正片和负片)进行培训,并提供相同数量的测试片。

NLTK提供了朴素贝叶斯分类器来处理机器学习工作。我们的工作主要是编写一个从文本中提取功能的函数。分类器使用这些功能执行分类。

我们的函数称为功能提取器,它以字符串(文本)作为参数,并返回将功能名称映射到其值的字典,称为功能集

对于电影评论,我们的功能将是前N字(不包括停用词)。因此,特征提取器将返回以这N单词为键的特征集,并以布尔值指示其存在或不存在作为值。

第一步是浏览评论,存储所有单词(停用词除外),并找到最常用的单词。

首先,此辅助函数获取文本并输出其不间断字词:

  1. import nltk
  2. import nltk.sentiment.util
  3. from nltk.corpus import stopwords
  4. import nltk.sentiment.util
  5. stop = set(stopwords.words("english"))
  6. def extract_words_from_text(text):
  7. tokens = nltk.word_tokenize(text)
  8. tokens_neg_marked = nltk.sentiment.util.mark_negation(tokens)
  9. return [t for t in tokens_neg_marked
  10. if t.replace("_NEG", "").isalnum() and
  11. t.replace("_NEG", "") not in stop]

word_tokenize 将文本拆分为标记列表(仍保留标点符号)。

mark_negation标记与_NEG取反之后的标记。因此,例如,I did not enjoy this.,在标记和标记否定之后变为:

["I", "did", "not", "enjoy_NEG", "this_NEG", "."]

最后一行删除所有停用词(包括否定词)和标点符号。文本中仍然有许多无用的词,例如“I”“This”,但是这种过滤足以满足我们的演示要求。

接下来,我们构造一个从审阅文件中读取的所有单词的列表。我们会保留一个单独的肯定和否定单词列表,以确保在我们选择最重要的单词时保持平衡。(我也对它进行了测试,但没有将单词列表分开,然后发现大多数肯定评论都归为否定。)同时,我们还可以创建所有肯定评论和所有否定评论的列表。

  1. import os
  2. positive_files = os.listdir("aclImdb/train/pos")
  3. negative_files = os.listdir("aclImdb/train/neg")
  4. positive_words = []
  5. negative_words = []
  6. positive_reviews = []
  7. negative_reviews = []
  8. for pos_file in positive_files:
  9. with open("aclImdb/train/pos/" + pos_file, "r") as f:
  10. txt = f.read().replace("<br />", " ")
  11. positive_reviews.append(txt)
  12. positive_words.extend(extract_words_from_text(txt))
  13. for neg_file in negative_files:
  14. with open("aclImdb/train/neg/" + neg_file, "r") as f:
  15. txt = f.read().replace("<br />", " ")
  16. negative_reviews.append(txt)
  17. negative_words.extend(extract_words_from_text(txt))

因为有很多文件,所以运行此代码可能要花一些时间。

然后,我们只保留肯定和否定单词列表中的前N单词(在此示例中为2000个单词),并将它们组合在一起。

  1. N = 2000
  2. freq_pos = nltk.FreqDist(positive_words)
  3. top_word_counts_pos = sorted(freq_pos.items(), key=lambda kv: kv[1], reverse=True)[:N]
  4. top_words_pos = [twc[0] for twc in top_word_counts_pos]
  5. freq_neg = nltk.FreqDist(negative_words)
  6. top_word_counts_neg = sorted(freq_neg.items(), key=lambda kv: kv[1], reverse=True)[:N]
  7. top_words_neg = [twc[0] for twc in top_word_counts_neg]
  8. top_words = list(set(top_words_pos + top_words_neg))

现在我们可以编写一个特征提取器。如前所述,它应返回一个字典,其中每个高位单词均作为键,True或者False作为值,取决于单词是否在文本中出现。

  1. def extract_features(text):
  2. text_words = extract_words_from_text(text)
  3. return { w: w in text_words for w in top_words }

然后,我们创建一个训练集,并将其输入到朴素贝叶斯分类器中。训练集应该是一个元组列表,其中每个元组的第一个元素是功能集,第二个元素是标签。

training = [(extract_features(review), "pos") for review in positive_reviews] + [(extract_features(review), "neg") for review in negative_reviews]

上面的行消耗大量RAM,并且速度很慢,因此您可能需要使用一部分评论,而只需要查看一部分评论列表。

训练分类器很简单:

classifier = nltk.NaiveBayesClassifier.train(training)

要立即对评论进行分类,请在新功能集上使用classify方法:

print(classifier.classify(extract_features("Your review goes here.")))

如果要查看每个标签的概率,请改用prob_classify

  1. def get_prob_dist(text):
  2. prob_dist = classifier.prob_classify(extract_features(text))
  3. return { "pos": prob_dist.prob("pos"), "neg": prob_dist.prob("neg") }
  4. print(get_prob_dist("Your review goes here."))

分类器具有基于测试集确定模型准确性的内置方法。该测试集的形状与训练集相同。电影评论数据集具有一个单独的目录,其中包含可用于此目的的评论。

  1. test_positive = os.listdir("aclImdb/test/pos")[:2500]
  2. test_negative = os.listdir("aclImdb/test/neg")[:2500]
  3. test = []
  4. for pos_file in test_positive:
  5. with open("aclImdb/test/pos/" + pos_file, "r") as f:
  6. txt = f.read().replace("<br />", " ")
  7. test.append((extract_features(txt), "pos"))
  8. for neg_file in test_negative:
  9. with open("aclImdb/test/neg/" + neg_file, "r") as f:
  10. txt = f.read().replace("<br />", " ")
  11. test.append((extract_features(txt), "neg"))
  12. print(nltk.classify.accuracy(classifier, test))

使用N = 2000,在训练集中有5000条正面评论和5000条负面评论,使用此代码,我的准确率约为85%。

结论

在本模块中,我们研究了NLTK在文本分类中的工作原理,并使用情感分析进行了演示。您可以将其以相同的方式用于其他分类,包括具有两个以上标签的分类。

接下来的模块,我们将看看Keras

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/346333?site
推荐阅读
相关标签
  

闽ICP备14008679号