本文概述
- 文字分析和NLP
- 比较文本分析, NLP和文本挖掘
- 使用NLTK的文本分析操作
- 情绪分析
- 文字分类
- 使用文本分类执行情感分析
- 总结
文本分析在当今的在线世界中有许多应用程序。通过分析Twitter上的推文, 我们可以发现趋势新闻和人们对特定事件的反应。亚马逊可以了解用户的反馈或对特定产品的评论。 BookMyShow可以发现人们对电影的看法。 YouTube还可以分析和理解视频中人们的观点。
在本教程中, 你将涵盖以下主题:
- 文字分析和NLP
- 比较文本分析, NLP和文本挖掘
- 使用NLTK的文本分析操作
- 代币化
- 停用词
- 词法归一化, 例如词干和词法分解
- POS标签
- 情绪分析
- 文字分类
- 使用文本分类执行情感分析
NLP使计算机能够以自然方式与人互动。它可以帮助计算机理解人类语言并从中获得意义。 NLP适用于从语音识别, 语言翻译, 文档分类到信息提取的若干问题。分析电影评论是在电影评论上演示一个简单的NLP词袋模型的经典示例之一。
比较文本分析, NLP和文本挖掘 文本挖掘也称为文本分析。文本挖掘是探索大量文本数据并查找模式的过程。文本挖掘处理文本本身, 而NLP处理基础元数据。查找单词的频率计数, 句子的长度, 特定单词的存在/不存在被称为文本挖掘。自然语言处理是文本挖掘的组成部分之一。 NLP有助于识别情绪, 在句子中找到实体以及博客/文章的类别。文本挖掘是用于文本分析的预处理数据。在文本分析中, 统计和机器学习算法用于对信息进行分类。
使用NLTK的文本分析操作 NLTK是一个功能强大的Python软件包, 提供了一组多种自然语言算法。它是免费的, 开源的, 易于使用的, 庞大的社区并且有据可查。 NLTK由最常用的算法组成, 例如标记化, 词性标记, 词干, 情感分析, 主题细分和命名实体识别。 NLTK帮助计算机分析, 预处理和理解书面文本。
!pip install nltk
Requirement already satisfied: nltk in /home/northout/anaconda2/lib/python2.7/site-packagesRequirement already satisfied: six in /home/northout/anaconda2/lib/python2.7/site-packages (from nltk)[33mYou are using pip version 9.0.1, however version 10.0.1 is available.You should consider upgrading via the 'pip install --upgrade pip' command.[0m
#Loading NLTKimport nltk
代币化
标记化是文本分析的第一步。将文本段落分解为较小的块(例如单词或句子)的过程称为标记化。令牌是为句子或段落构建模块的单个实体。
句子标记化 句子标记器将文本段落分解为句子。
from nltk.tokenize import sent_tokenizetext="""Hello Mr. Smith, how are you doing today? The weather is great, and city is awesome.The sky is pinkish-blue. You shouldn't eat cardboard"""tokenized_text=sent_tokenize(text)print(tokenized_text)
['Hello Mr. Smith, how are you doing today?', 'The weather is great, and city is awesome.', 'The sky is pinkish-blue.', "You shouldn't eat cardboard"]
在这里, 给定的文本被标记为句子。
词标记化 Word分词器将文本段落分解为单词。
from nltk.tokenize import word_tokenizetokenized_word=word_tokenize(text)print(tokenized_word)
['Hello', 'Mr.', 'Smith', ', ', 'how', 'are', 'you', 'doing', 'today', '?', 'The', 'weather', 'is', 'great', ', ', 'and', 'city', 'is', 'awesome', '.', 'The', 'sky', 'is', 'pinkish-blue', '.', 'You', 'should', "n't", 'eat', 'cardboard']
频率分布
from nltk.probability import FreqDistfdist = FreqDist(tokenized_word)print(fdist)
<
FreqDist with 25 samples and 30 outcomes>
fdist.most_common(2)
[('is', 3), (', ', 2)]
# Frequency Distribution Plotimport matplotlib.pyplot as pltfdist.plot(30, cumulative=False)plt.show()
文章图片
停用词
停用词在文本中被视为噪音。文本可能包含停用词, 例如is, am, are, this, a, an, the等。
在用于删除停用词的NLTK中, 你需要创建停用词列表并从这些单词中过滤出标记列表。
from nltk.corpus import stopwordsstop_words=set(stopwords.words("english"))print(stop_words)
{'their', 'then', 'not', 'ma', 'here', 'other', 'won', 'up', 'weren', 'being', 'we', 'those', 'an', 'them', 'which', 'him', 'so', 'yourselves', 'what', 'own', 'has', 'should', 'above', 'in', 'myself', 'against', 'that', 'before', 't', 'just', 'into', 'about', 'most', 'd', 'where', 'our', 'or', 'such', 'ours', 'of', 'doesn', 'further', 'needn', 'now', 'some', 'too', 'hasn', 'more', 'the', 'yours', 'her', 'below', 'same', 'how', 'very', 'is', 'did', 'you', 'his', 'when', 'few', 'does', 'down', 'yourself', 'i', 'do', 'both', 'shan', 'have', 'itself', 'shouldn', 'through', 'themselves', 'o', 'didn', 've', 'm', 'off', 'out', 'but', 'and', 'doing', 'any', 'nor', 'over', 'had', 'because', 'himself', 'theirs', 'me', 'by', 'she', 'whom', 'hers', 're', 'hadn', 'who', 'he', 'my', 'if', 'will', 'are', 'why', 'from', 'am', 'with', 'been', 'its', 'ourselves', 'ain', 'couldn', 'a', 'aren', 'under', 'll', 'on', 'y', 'can', 'they', 'than', 'after', 'wouldn', 'each', 'once', 'mightn', 'for', 'this', 'these', 's', 'only', 'haven', 'having', 'all', 'don', 'it', 'there', 'until', 'again', 'to', 'while', 'be', 'no', 'during', 'herself', 'as', 'mustn', 'between', 'was', 'at', 'your', 'were', 'isn', 'wasn'}
删除停用词
filtered_sent=[]for w in tokenized_sent:if w not in stop_words:filtered_sent.append(w)print("Tokenized Sentence:", tokenized_sent)print("Filterd Sentence:", filtered_sent)
Tokenized Sentence: ['Hello', 'Mr.', 'Smith', ', ', 'how', 'are', 'you', 'doing', 'today', '?']Filterd Sentence: ['Hello', 'Mr.', 'Smith', ', ', 'today', '?']
词汇规范化
词典规范化考虑了文本中的另一种噪声。例如, “ 连接” , “ 连接” , “ 连接” 词简化为通用词” 连接” 。它将单词的派生相关形式简化为公共词根。
抽干 词干提取是语言规范化的过程, 可将词缩减为词根词或将衍生词缀切掉。例如, “ 连接” , “ 连接” , “ 连接” 词简化为通用词” 连接” 。
# Stemmingfrom nltk.stem import PorterStemmerfrom nltk.tokenize import sent_tokenize, word_tokenizeps = PorterStemmer()stemmed_words=[]for w in filtered_sent:stemmed_words.append(ps.stem(w))print("Filtered Sentence:", filtered_sent)print("Stemmed Sentence:", stemmed_words)
Filtered Sentence: ['Hello', 'Mr.', 'Smith', ', ', 'today', '?']Stemmed Sentence: ['hello', 'mr.', 'smith', ', ', 'today', '?']
合法化 词法化将单词还原为基本单词, 这是语言上正确的引理。它通过词汇和词法分析来转换词根。合法化通常比阻止更为复杂。 Stemmer在不了解上下文的情况下处理单个单词。例如, 单词” 更好” 的引理是” 好” 。由于需要字典查找, 因此会错过该内容。
#Lexicon Normalization#performing stemming and Lemmatizationfrom nltk.stem.wordnet import WordNetLemmatizerlem = WordNetLemmatizer()from nltk.stem.porter import PorterStemmerstem = PorterStemmer()word = "flying"print("Lemmatized Word:", lem.lemmatize(word, "v"))print("Stemmed Word:", stem.stem(word))
Lemmatized Word: flyStemmed Word: fli
POS标签
词性(POS)标记的主要目标是识别给定单词的语法组。根据上下文, 它是名词, 代词, 修饰语, 动词, ADVERBS等。 POS标签在句子中查找关系, 并为单词分配一个相应的标签。
sent = "Albert Einstein was born in Ulm, Germany in 1879."
tokens=nltk.word_tokenize(sent)print(tokens)
['Albert', 'Einstein', 'was', 'born', 'in', 'Ulm', ', ', 'Germany', 'in', '1879', '.']
nltk.pos_tag(tokens)
[('Albert', 'NNP'), ('Einstein', 'NNP'), ('was', 'VBD'), ('born', 'VBN'), ('in', 'IN'), ('Ulm', 'NNP'), (', ', ', '), ('Germany', 'NNP'), ('in', 'IN'), ('1879', 'CD'), ('.', '.')]
POS标签:阿尔伯特/ NNP爱因斯坦/ NNP是/ VBD出生的/ VBN在/ IN乌尔姆/ NNP, /, 德国/ NNP在/ IN 1879 / CD ./。
情绪分析 如今, 公司想了解, 他们的最新产品出了什么问题?哪些用户和公众对最新功能有何看法?你可以使用情感分析以合理的准确性量化此类信息。
量化用户的内容, 想法, 信念和观点被称为情感分析。用户的在线帖子, 博客, 推文, 产品反馈可帮助业务人员吸引目标受众并创新产品和服务。情绪分析有助于更好, 更准确地了解人们。它不仅限于市场营销, 还可以用于政治, 研究和安全领域。
人际交流不仅限于文字, 还不只是文字。情感是单词, 语气和写作风格的组合。作为数据分析师, 更重要的是了解我们的观点, 这真正意味着什么?
文章图片
主要有两种进行情感分析的方法。
- 基于词汇的:计算给定文本中正词和负词的数量, 较大的数字将是文本的情感。
- 基于机器学习的方法:开发分类模型, 使用预先标记的正面, 负面和中性数据集进行训练。
文字分类 文本分类是文本挖掘的重要任务之一。这是一种有监督的方法。标识给定文本的类别或类别, 例如博客, 书籍, 网页, 新闻文章和推文。它在当今的计算机世界中具有各种应用程序, 例如垃圾邮件检测, CRM服务中的任务分类, 电子零售商网站上的产品分类, 搜索引擎网站内容分类, 客户反馈情绪等。在下一部分中, 你将将学习如何在python中进行文本分类。
文章图片
使用文本分类执行情感分析
# Import pandasimport pandas as pd
加载数据中 到目前为止, 你已经了解了使用NLTK进行数据预处理的方法。现在, 你将学习文本分类。你将使用scikit-learn执行多数值朴素贝叶斯分类。
【使用NLTK的初学者文本分析】在模型的构建部分中, 你可以使用Kaggle上可用的” 电影, 评论的情感分析” 数据集。数据集是一个制表符分隔的文件。数据集具有四列PhraseId, SentenceId, Phrase和Sentiment。
该数据有5个情感标签:
0-负面1-负面2-中立3-正面4-正面
在这里, 你可以建立一个模型来对品种类型进行分类。该数据集在Kaggle上可用。你可以从以下链接下载它:https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews/data
data=http://www.srcmini.com/pd.read_csv('train.tsv', sep='\t')
data.head()
短语编号 | SentenceId | 短语 | 情绪 | |
---|---|---|---|---|
0 | 1 | 1 | 一系列的谚语展示了格言… | 1 |
1 | 2 | 1 | 一系列的谚语展示了格言… | 2 |
2 | 3 | 1 | 一系列 | 2 |
3 | 4 | 1 | 一个 | 2 |
4 | 5 | 1 | 系列 | 2 |
data.info()
<
class 'pandas.core.frame.DataFrame'>
RangeIndex: 156060 entries, 0 to 156059Data columns (total 4 columns):PhraseId156060 non-null int64SentenceId156060 non-null int64Phrase156060 non-null objectSentiment156060 non-null int64dtypes: int64(3), object(1)memory usage: 4.8+ MB
data.Sentiment.value_counts()
2795823329271272734920607072Name: Sentiment, dtype: int64
Sentiment_count=data.groupby('Sentiment').count()plt.bar(Sentiment_count.index.values, Sentiment_count['Phrase'])plt.xlabel('Review Sentiments')plt.ylabel('Number of Review')plt.show()
文章图片
使用词袋生成特征 在” 文本分类问题” 中, 我们有一组文本及其各自的标签。但是我们不能直接在模型中使用文本。你需要将这些文本转换为一些数字或数字向量。
词袋模型(BoW)是从文本中提取特征的最简单方法。 BoW将文本转换为文档中单词出现的矩阵。该模型关注给定单词是否出现在文档中。
示例:有三个文档:
Doc 1:我爱狗。 Doc 2:我讨厌狗和编织物。 Doc 3:编织是我的爱好和激情。
现在, 你可以通过计算给定文档中单词的出现来创建文档和单词的矩阵。该矩阵称为文档术语矩阵(DTM)。
文章图片
该矩阵使用单个单词。它可以是两个或两个以上单词的组合, 称为双字母组或三字母组模型, 而一般的方法称为n元语法模型。
你可以使用scikit-learn的CountVectorizer生成文档术语矩阵。
from sklearn.feature_extraction.text import CountVectorizerfrom nltk.tokenize import RegexpTokenizer#tokenizer to remove unwanted elements from out data like symbols and numberstoken = RegexpTokenizer(r'[a-zA-Z0-9]+')cv = CountVectorizer(lowercase=True, stop_words='english', ngram_range = (1, 1), tokenizer = token.tokenize)text_counts= cv.fit_transform(data['Phrase'])
拆分火车和测试仪 为了了解模型的性能, 将数据集分为训练集和测试集是一个很好的策略。
让我们使用函数train_test_split()拆分数据集。你基本上需要传递3个参数功能, 目标和test_set大小。此外, 你可以使用random_state随机选择记录。
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(text_counts, data['Sentiment'], test_size=0.3, random_state=1)
模型建立与评估 让我们使用TF-IDF构建文本分类模型。
首先, 导入MultinomialNB模块, 并使用MultinomialNB()函数创建一个天真的Bayes分类器对象。
然后, 使用fit()将模型拟合到训练集上, 并使用predict()对测试集执行预测。
from sklearn.naive_bayes import MultinomialNB#Import scikit-learn metrics module for accuracy calculationfrom sklearn import metrics# Model Generation Using Multinomial Naive Bayesclf = MultinomialNB().fit(X_train, y_train)predicted= clf.predict(X_test)print("MultinomialNB Accuracy:", metrics.accuracy_score(y_test, predicted))
MultinomialNB Accuracy: 0.604916912299
好吧, 使用CountVector(或BoW)得出的分类率为60.49%, 这被认为不是很好的准确性。我们需要改善这一点。
使用TF-IDF生成特征 在术语频率(TF)中, 你只需计算每个文档中出现的单词数。此术语频率的主要问题是它将赋予较长的文档更多的权重。术语频率基本上是BoW模型的输出。
IDF(反向文档频率)衡量给定单词在整个文档中提供的信息量。 IDF是包含单词的文档数量与文档总数的对数比例反比。
文章图片
TF-IDF(术语频率-逆文档频率)对文档术语矩阵进行归一化。它是TF和IDF的产品。在一个文档中具有高tf-idf的单词, 它在大多数情况下发生在给定文档中, 而在其他文档中则必须不存在。因此, 这些词必须是签名词。
文章图片
from sklearn.feature_extraction.text import TfidfVectorizertf=TfidfVectorizer()text_tf= tf.fit_transform(data['Phrase'])
拆分训练和测试集(TF-IDF) 让我们使用函数train_test_split()拆分数据集。你基本上需要传递3个参数功能, 目标和test_set大小。此外, 你可以使用random_state随机选择记录。
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(text_tf, data['Sentiment'], test_size=0.3, random_state=123)
模型建立与评估(TF-IDF) 让我们使用TF-IDF构建文本分类模型。
首先, 导入MultinomialNB模块, 并使用MultinomialNB()函数创建Multinomial Naive Bayes分类器对象。
然后, 使用fit()将模型拟合到训练集上, 并使用predict()对测试集执行预测。
from sklearn.naive_bayes import MultinomialNBfrom sklearn import metrics# Model Generation Using Multinomial Naive Bayesclf = MultinomialNB().fit(X_train, y_train)predicted= clf.predict(X_test)print("MultinomialNB Accuracy:", metrics.accuracy_score(y_test, predicted))
MultinomialNB Accuracy: 0.586526549618
好吧, 使用TF-IDF功能获得的分类率为58.65%, 这被认为不是很好的准确性。我们需要通过使用其他一些预处理或特征工程来提高准确性。让我们在注释框中建议一些提高准确性的方法。
总结 恭喜, 你已完成本教程的结尾!
在本教程中, 你学习了什么是文本分析, NLP和文本挖掘, 使用NLTK的文本分析操作的基础知识, 例如令牌化, 规范化, 词干, 词法化和POS标记。使用scikit-learn进行情感分析和文本分类是什么?
我期待听到任何反馈或问题。你可以通过发表评论来提出问题, 我会尽力回答。
如果你有兴趣了解有关Python的更多信息, 请参加srcmini的Python自然语言处理基础知识课程。
推荐阅读
- 苹果电脑安装win10系统后怎样安装无线网卡驱动程序?
- 了解Python中的逻辑回归
- Matplotlib教程(Python绘图)
- 在Windows上安装Anaconda
- Python中的概率分布
- R编程对于初学者的生存分析
- 电子表格的时间序列分析
- 如何运行Python脚本
- Android 8.0+ 通知不显示的适配