r"""
[:=;] # 眼睛
[oO\-]? # ⿐鼻⼦子
[D\)\]\(\]/\\OpP] # 嘴
regex_str = [
emoticons_str,
r'<[^>]+>',
r'(?:@[\w_]+)',
r"(?:\#+[\w_]+[\w\'_\-]*[\w_]+)",
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+',
r'(?:(?:\d+,?)+(?:\.?\d+)?)',
r"(?:[a-z][a-z'\-_]+[a-z])",
r'(?:\S)'
tokens_re = re.compile(r'(' + '|'.join(regex_str) + ')',re.VERBOSE | re.IGNORECASE)
emoticon_re = re.compile(r'^' + emoticons_str + '$',re.VERBOSE | re.IGNORECASE)
def tokenize(s):
return tokens_re.findall(s)
def preprocess(s, lowercase=False):
tokens = tokenize(s)
if lowercase:
tokens = [token if emoticon_re.search(token) else token.lower()for token in tokens ]
return tokens
tweet = 'RT @angelababy: love you baby! :D http://ah.love #168cm'
print(preprocess(tweet))
运行结果:
['R', 'T', '@angelababy', ':', 'love', 'you', 'baby', '!', ':D', 'http://ah.love', '#168cm']
提取文本数据的词干(Stemming 词⼲提取):
处理文本文档时,可能会碰到单词的不同形式。如“paly”这个词会以各种形式出现,“play”,“plays”,“player”,“playing”等。这些是具有同样含义的单词家族,在文本分析中,提取这些词的原形非常有用,它有助于我们提取一些统计信息来分析整个文本。词干提取的目标是将不同词性的单词都变成其原形。
词干提取使用启发式处理方法截取单词的尾部,以提取单词的原形。
NLTK实现Stemmin(参照《python机器学习经典实例》分析文本数据)
from nltk.stem.porter import PorterStemmer
from nltk.stem.lancaster import LancasterStemmer
from nltk.stem.snowball import SnowballStemmer
words = ['table', 'probably', 'wolves', 'playing', 'is',
'dog', 'the', 'beaches', 'grounded', 'dreamt', 'envision']
stemmers = ['PORTER', 'LANCASTER', 'SNOWBALL']
stemmer_porter = PorterStemmer()
stemmer_lancaster = LancasterStemmer()
stemmer_snowball = SnowballStemmer('english')
formatted_row = '{:>16}' * (len(stemmers) + 1)
print ('\n', formatted_row.format('WORD', *stemmers), '\n')
for word in words:
stemmed_words = [stemmer_porter.stem(word),
stemmer_lancaster.stem(word), stemmer_snowball.stem(word)]
print (formatted_row.format(word, *stemmed_words))
运行结果:
比较:3种词干提取算法的本质目标都是提取出词干,消除词影响。它们的不同之处在于操作的严格程度不同。Lancaster词干提取器比其他两个词干提取器更严格,Porter词干提取器是最宽松的。Lancaster词干提取器得到的词干往往比较模糊,难以理解。Lancaster词干提取器的速度很快,但是它会减少单词的很大部分,因此通常会选择Snowball词干提取器。
用词性还原的方法还原文本的基本形式(Lemmatization 词形归⼀):
词形还原的目标也是将单词转化为其原形,但它是一个更结构化的方法。词形还原通过对单词进行词汇和语法分析来实现,输出结果取决于标记是一个动词还是一个名词。
NLTK实现Lemm(参照《python机器学习经典实例》分析文本数据)
from nltk.stem import WordNetLemmatizer
words = ['table', 'probably', 'wolves', 'playing', 'is',
'dog', 'the', 'beaches', 'grounded', 'dreamt', 'envision']
lemmatizers = ['NOUN LEMMATIZER', 'VERB LEMMATIZER']
lemmatizer_wordnet = WordNetLemmatizer()
formatted_row = '{:>24}' * (len(lemmatizers) + 1)
print('\n', formatted_row.format('WORD', *lemmatizers), '\n')
for word in words:
lemmatized_words = [lemmatizer_wordnet.lemmatize(word, pos='n'),
lemmatizer_wordnet.lemmatize(word, pos='v')]
print (formatted_row.format(word, *lemmatized_words))
运行结果:
Stopwords停用词
在信息检索中,为节省存储空间和提高搜索效率,在自然语言数据(或文本)之前或之后会自动过滤某些字或词,这些字词即被称为“StopWords”。这类词基本上在任何场合任何时候都会有,因此不会影响数据的分析结果,反而对数据处理来说,是一种多余。因此,我们在进行分词和处理高频词汇的时候,一定要将其剔除。
全体stopwords列表 http://www.ranks.nl/stopwords
NLTK去除stopwords
首先要下载词库
>>> import nltk
>>> nltk.download('stopwords')
NLTK在自然语言处理中的应用
创建文本分类器
文本分类的目的是将文本文档分为不同的类,这是NLP中非常重要的手段。这里将使用一种技术,它基于一种叫作tf-idf的统计数据,它表示词频-逆文档频率。这个统计工具有助于理解一个单词在一组文档中对某一个文档的重要性。它可以作为特征向量来做文档分类。
tf-idf技术常用于信息检索领域,目的是了解文档中每个单词的重要性。如果想要识别在文档中多次出现的单词,同时像“is”和“be”这样的普通词汇并不能真正反映内容的本质,因此仅需要提供提取出具有实际意义的那些词。词频越大,则表示这个词越重要,同时,如果这个词经常出现,那么这个词频也会增加,这两个因素互相平衡。提取出每个句子的词频,然后将其转化为特征向量,用分类器来对这些句子进行分类。
详细步骤及代码(步骤在代码注释中)
from sklearn.datasets import fetch_20newsgroups
#选择一个类型列表,并用词典映射的方式定义
#这些类型是加载的新闻组数据集的一部分
category_map = {'misc.forsale': 'Sales', 'rec.motorcycles': 'Motorcycles',
'rec.sport.baseball': 'Baseball', 'sci.crypt': 'Cryptography',
'sci.space': 'Space'}
#基于刚刚定义的类型加载训练数据
training_data = fetch_20newsgroups(subset='train',
categories=category_map.keys(), shuffle=True, random_state=7)
#特征提取
from sklearn.feature_extraction.text import CountVectorizer
#用训练数据提取特征
vectorizer = CountVectorizer()
X_train_termcounts = vectorizer.fit_transform(training_data.data)
print("\nDimensions of training data:", X_train_termcounts.shape)
# 训练分类器
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
#定义一些随机输入的句子
input_data = [
"The curveballs of right handed pitchers tend to curve to the left",
"Caesar cipher is an ancient form of encryption",
"This two-wheeler is really good on slippery roads"
# tf-idf 变换器
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_termcounts)
# 多项式朴素贝叶斯分类器
classifier = MultinomialNB().fit(X_train_tfidf, training_data.target)
#用词频统计转换输入数据
X_input_termcounts = vectorizer.transform(input_data)
#用tf-idf变换器变换输入数据
X_input_tfidf = tfidf_transformer.transform(X_input_termcounts)
#预测输出类型
predicted_categories = classifier.predict(X_input_tfidf)
#打印输出
for sentence, category in zip(input_data, predicted_categories):
print ('\nInput:', sentence, '\nPredicted category:', \
category_map[training_data.target_names[category]])
运行结果:
在NPL中,通过姓名识别性别是一个有趣的任务。这里用启发式方法,即姓名的最后几个字符可以界定性别特征。如名字以“la”结尾,那么可能是一个女性的名字,如“Angela”,“Layla”。如果以“im”结尾,可能是一个男性的名字,如“Tim”,“Jim”。
详细步骤及代码(步骤在 代码注释中)
import random
from nltk.corpus import names
from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
def gender_features(word, num_letters=2):
return {'feature': word[-num_letters:].lower()}
if __name__=='__main__':
labeled_names = ([(name, 'male') for name in names.words('male.txt')] +
[(name, 'female') for name in names.words('female.txt')])
random.seed(7)
random.shuffle(labeled_names)
input_names = ['Leonardo', 'Amy', 'Sam']
for i in range(1, 5):
print ('\nNumber of letters:', i)
featuresets = [(gender_features(n, i), gender) for (n, gender) in labeled_names]
train_set, test_set = featuresets[500:], featuresets[:500]
classifier = NaiveBayesClassifier.train(train_set)
print ('Accuracy ==>', str(100 * nltk_accuracy(classifier, test_set)) + str('%'))
for name in input_names:
print (name, '==>', classifier.classify(gender_features(name, i)))
运行结果:
分析句子的情感
情感分析是NLP最受欢迎的应用之一。情感分析是指确定一段给定的文本是积极还是消极的过程。有一些场景中,我们还会将“中性“作为第三个选项。情感分析常用于发现人们对于一个特定主题的看法。情感分析用于分析很多场景中用户的情绪,如营销活动、社交媒体、电子商务客户等。
import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews
def extract_features(word_list):
return dict([(word, True) for word in word_list])
if __name__=='__main__':
positive_fileids = movie_reviews.fileids('pos')
negative_fileids = movie_reviews.fileids('neg')
features_positive = [(extract_features(movie_reviews.words(fileids=[f])),
'Positive') for f in positive_fileids]
features_negative = [(extract_features(movie_reviews.words(fileids=[f])),
'Negative') for f in negative_fileids]
threshold_factor = 0.8
threshold_positive = int(threshold_factor * len(features_positive))
threshold_negative = int(threshold_factor * len(features_negative))
features_train = features_positive[:threshold_positive] + features_negative[:threshold_negative]
features_test = features_positive[threshold_positive:] + features_negative[threshold_negative:]
print ("\nNumber of training datapoints:", len(features_train))
print ("Number of test datapoints:", len(features_test))
classifier = NaiveBayesClassifier.train(features_train)
print ("\nAccuracy of the classifier:", nltk.classify.util.accuracy(classifier, features_test))
print ("\nTop 10 most informative words:")
for item in classifier.most_informative_features()[:10]:
print (item[0])
input_reviews = [
"It is an amazing movie",
"This is a dull movie. I would never recommend it to anyone.",
"The cinematography is pretty great in this movie",
"The direction was terrible and the story was all over the place"
print ("\nPredictions:")
for review in input_reviews:
print ("\nReview:", review)
probdist = classifier.prob_classify(extract_features(review.split()))
pred_sentiment = probdist.max()
print ("Predicted sentiment:", pred_sentiment)
print ("Probability:", round(probdist.prob(pred_sentiment), 2))
运行结果:
文本情感分析(Text Sentiment Analysis)是指对输入的一段文字或者文档的整体的积极或消极程度进行分析的一种自然语言处理技术。它的应用范围非常广泛,如产品评论,用户评论,微博客等等。近几年,随着深度学习、自然语言处理等技术的火热,文本情感分析技术也得到了飞速发展。本文通过对文本情感分析技术的研究探讨其实现方法及其特点,并基于python语言及相关库进行系统性的介绍。本篇文章假定读者具有一定的编程经验,掌握Python语言基础语法。
本文实例讲述了Python自然语言处理 NLTK 库用法。分享给大家供大家参考,具体如下:
在这篇文章中,我们将基于 Python 讨论自然语言处理(NLP)。本教程将会使用 Python NLTK 库。NLTK 是一个当下流行的,用于自然语言处理的 Python 库。
那么 NLP 到底是什么?学习 NLP 能带来什么好处?
简单的说,自然语言处理( NLP )就是开发能够理解人类语言的应用程序和服务。
我们生活中经常会接触的自然语言处理的应用,包括语音识别,语音翻译,理解句意,理解特定词语的同义词,以及写出语法正确,句意通畅的句子和段落。
NLP的作用
正如大家所知,每天博客,社交网站
如果我们不是集中我们的精力在问题或“实体关系”的有限集合,例如:“不同的设施位于何处”或“谁被什么公司雇用”上,我们就能取得重大进展。一个重要的形式是结构化数据:实体和关系的可预测的规范的结构。我们将用于实体识别的基本技术是词块划分,它分割和标注多词符的序列,如 2.1 所示。然而,只需创建一个包含递归规则的多级的词块语法,就可以建立任意深度的词块结构。另外,级联过程只能产生固定深度的树(不超过级联级数),完整的句法分析这是不够的。在本节中,我们将在较深的层面探讨词块划分,以词块的定义和表示开始。
对于文本的研究,对于语言主要是中文,英文的研究反而会少了很多,主要还是因为应用的问题,而现在对于海外的产品来说,英文的语言处理,会越来越显得重要,其实对英文语言处理资料会比中文的来得多,来得全,很多中文研究的方法是借鉴了英文处理的思想。
NLTK是python中研究自然语言的非常优秀的第三方库,里面集中了非常多的自然语言处理方式的算法,不需要自己去编写算法,可以让我们更多的去关系应用本身。
NLTK的安装
NLTK的安装,跟python安装第三方包并没有太多的区别。
pip install nltk
情感分析是NLP最受欢迎的应用之一。情感分析是指确定一段给定的文本是积极还是消极的过程。下面的代码是借用其他博主的, 但是我对代码的输入数据格式以及类型做了一个简单解析供大家参考。另外我发在nltk在处理中文时的切分统计不是很好,中文和英文文本的情感分析思路上是一致的,不同之处在于中文在分析前需要进行分词,然后才能用nltk处理(nltk 的处理粒度一般是词),因此在切分中文的时候...
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言工具箱(NLTK,NaturalLanguageToolkit)是一个基于Python语言的类库,它也是当前最为流行的自然语言编程与开发工具。在进行自然语言处理研究和应用时,恰当利用NLTK中提供的函数可以大幅度地提高效率。本文就将通过一些实例来向读者介绍NLTK的使用。
NaturalLanguageToolkit,自然语言处理工具包,在NLP领域中,最常使用的一个Python库。
NLTK是一个开源的项目,包含:Python模块,数据集和教程,用于NLP的研究和开发 。
NLTK由Steven Bird和Edw
本文,我将利用一个例子教大家使用python中的机器学习库构建一个可以进行情感分析的模型。首先,我们构建模型需要数据集,我们这里使用一个互联网电影数据库中的大量电影评论数据。这里给出下载链接https://ai.stanford.edu/~amaas/data/sentiment/ai.stanford.edu我们观察我们下载的数据集test和train目录下都有25000个数据集,分别在neg...
尝试:>>> from __future__ import division>>> from nltk.corpus import inaugural>>> total_lens = 0>>> for i, sent in enumerate(inaugural.sents()):... total_lens += l...
一、环境搭建1、安装第三方包nltkpip intall nltk==3.4.52、安装 nltk_datanltk_data 存放了很多语料数据, 包括大量的数据集,本文中就是用到了其中的 positive_tweets 和negative_tweets 两个数据集来训练模型安装方式有两种, 离线和在线, 推荐【使用离线】, 因为数据量很大, 在线下载通常会失败[ a ] 在线下载py...
本文是使用Python和开源自然语言工具包NLTK进行情感分析系列的第一篇。本文介绍了一些关键的NLP概念,并开始使用自然语言工具包(NLTK)Python库。我们将简要概述自然语言处理(NLP),介绍用于Python的NLTK,并解释如何使用它解决复杂的NLP问题。随着社区的发展,会有大量的对话,理解该群体的整体情绪是很难的,但也许更重要的是要理解和识别有用的客户反馈。我将演示如何开始使用Pyt...
一、nltk库
nltk是一个python工具包, 用来处理与自然语言相关的东西. 包括分词(tokenize), 词性标注(POS), 文本分类等,是较为好用的现成工具。但是目前该工具包的分词模块,只支持英文分词,而不支持中文分词。
1.安装nltk库
在命令行输入:
conda install nltk #anaconda环境
pip install nltk ...