python 机器学习——NLTK 及分析⽂本数据(⾃然语⾔处理基础)
NLTK
NLTK(Natural Language Toolkit),⾃然语⾔处理⼯具包,在NLP(⾃然语⾔处理)领域中,最常使⽤的⼀个Python库。⾃带语料库,词性分类库。⾃带分类,分词功能。
NLTK安装 安装:pip install NLTK
测试:
import nltk
Anaconda不⽤安装
安装语料库:执⾏代码后,会出现包管理器,我们下载NLTK数据,这些数据中包含很多语料和训练模型
安装过程:
import nltk
nltk.download()
安装完成:
NLTK功能:
NLTK⾃带的语料库:
corpus语料库的集合,导⼊布朗语料库。
categoryies()查看种类
sents()句⼦数量
words()词数
如果导⼊的时候出现import错误,说明语料库没有下载,重新下载好,再导⼊。
⽂本处理
分词(Tokenize):word_tokenize⽣成⼀个词的列表中⽂分词:⽤jieba
>>> import nltk
>>> sentence="I Love China !"
>>> tokens=nltk.word_tokenize(sentence)
>>> tokens
['I', 'Love', 'China', '!']
>>>
>>> import jieba
>>> seg_list=jieba.cut("我正在学习机器学习",cut_all=True)
>>> print("全模式:","/".join(seg_list))
全模式:我/正在/学习/学习机/机器/学习
>>> seg_list=jieba.cut("我正在学习机器学习",cut_all=False)
>>> print("精确模式:","/".join(seg_list))
精确模式:我/正在/学习/机器/学习
>>> seg_list=jieba.cut("我正在学习⾃然语⾔处理")
>>> print("默认是精确模式:","/".join(seg_list))
默认是精确模式:我/正在/学习/⾃然语⾔/处理
>>> seg_list=jieba.cut_for_search("⽂本分析和⾃然语⾔处理是现在⼈⼯智能系统不可分割的⼀部分")
>>> print("/".join(seg_list))
⽂本/分析/和/⾃然/语⾔/⾃然语⾔/处理/是/现在/⼈⼯/智能/⼈⼯智能/系统/不可/可分/分割/不可分割/的/⼀部/部分/⼀部分>>>
但是有时候分词并没有那么容易。⽂本中可能会含有各种各样的字符,如社交⽹络上的⽂本。
kenize import word_tokenize
tweet = 'RT @angelababy: love you baby! :D ah.love #168cm'
print(word_tokenize(tweet))
# ['RT', '@', 'angelababy', ':', 'love', 'you', 'baby', '!', ':', # ’D', 'http', ':', '//ah.love', '#', '168cm']
import re
emoticons_str = r"""
(?:
[:=;] # 眼睛
[oO\-]? # ⿐⿐⼦⼦
[D\)\]\(\]/\\OpP] # 嘴
)"""
regex_str = [
emoticons_str,
r'<[^>]+>', # HTML tags
r'(?:@[\w_]+)', # @某⼈⼈
r"(?:\#+[\w_]+[\w\'_\-]*[\w_]+)", # 话题标签
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs
r'(?:(?:\d+,?)+(?:\.?\d+)?)', # 数字
r"(?:[a-z][a-z'\-_]+[a-z])", # 含有 - 和 ‘ 的单词
r'(?:\S)'# 其他
]
tokens_re = repile(r'(' + '|'.join(regex_str) + ')',re.VERBOSE | re.IGNORECASE)
emoticon_re = repile(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
python中文文档tweet = 'RT @angelababy: love you baby! :D ah.love #168cm'
print(preprocess(tweet))
运⾏结果:
['R', 'T', '@angelababy', ':', 'love', 'you', 'baby', '!', ':D', 'ah.love', '#168cm']
提取⽂本数据的词⼲(Stemming 词⼲提取):
处理⽂本⽂档时,可能会碰到单词的不同形式。如“paly”这个词会以各种形式出
现,“play”,“plays”,“player”,“playing”等。这些是具有同样含义的单词家族,在⽂本分析中,提取这些词的原形⾮常有⽤,它有助于我们提取⼀些统计信息来分析整个⽂本。词⼲提取的⽬标是将不同词性的单词都变成其原形。
词⼲提取使⽤启发式处理⽅法截取单词的尾部,以提取单词的原形。
NLTK实现Stemmin(参照《python机器学习经典实例》分析⽂本数据)
运⾏结果:
⽐较:3种词⼲提取算法的本质⽬标都是提取出词⼲,消除词影响。它们的不同之处在于操作的严格程度不同。Lancaster词⼲提取器⽐其他两个词⼲提取器更严格,Porter词⼲提取器是最宽松的。Lancaster词⼲提取器得到的词⼲往往⽐较模糊,难以理解。Lancaster词⼲提取器的速度很快,但是它会减少单词的很⼤部分,因此通常会选择Snowball词⼲提取器。
⽤词性还原的⽅法还原⽂本的基本形式(Lemmatization 词形归⼀):
词形还原的⽬标也是将单词转化为其原形,但它是⼀个更结构化的⽅法。词形还原通过对单词进⾏词汇和语法分析来实现,输出结果取决于标记是⼀个动词还是⼀个名词。 NLTK实现Lemm(参照《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))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论