Python入门NLP(二)

举报
Python爱好者 发表于 2020/12/30 00:27:54 2020/12/30
【摘要】 上次我们看了词频的统计和如何处理停用词。 这次我们看与语义相关的NLP 使用NLTK Tokenize文本 如果有一下这样一段文本: Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages. ...

上次我们看了词频的统计和如何处理停用词。

这次我们看与语义相关的NLP

640?wx_fmt=jpeg

使用NLTK Tokenize文本

如果有一下这样一段文本:

Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages. The following pages are a useful first step to get on your way writing programs with Python!

使用句子tokenizer将文本tokenize成句子:

from nltk.tokenize import sent_tokenize

mytext = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages. The following pages are a useful first step to get on your way writing programs with Python!"

print(sent_tokenize(mytext))

输出:

["Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages.", 'The following pages are a useful first step to get on your way writing programs with Python!']

它能把每句话准确的识别出来。

接下来试试单词tokenizer:

from nltk.tokenize import word_tokenize

mytext = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages. The following pages are a useful first step to get on your way writing programs with Python!"

print(word_tokenize(mytext))

输出:

['Python', 'can', 'be', 'easy', 'to', 'pick', 'up', 'whether', 'you', "'re", 'a', 'first', 'time', 'programmer', 'or', 'you', "'re", 'experienced', 'with', 'other', 'languages', '.', 'The', 'following', 'pages', 'are', 'a', 'useful', 'first', 'step', 'to', 'get', 'on', 'your', 'way', 'writing', 'programs', 'with', 'Python', '!']

它也能准确的识别每个单词。

使用Tokenize时可以指定语言 :  sent_tokenize(mytext,"Chinese")


同义词处理

WordNet是一个为自然语言处理而建立的数据库。它包括一些同义词组和一些简短的定义。

具体看代码:

from nltk.corpus import wordnet

syn = wordnet.synsets("happiness")

print(syn[0].definition())

输出:

state of well-being characterized by emotions ranging from contentment to intense joy

它能具体解读出这个词汇的意思

所以我可以使用如下的方式来获取它的同义词:

from nltk.corpus import wordnet

synonyms = []

for syn in wordnet.synsets('happy'):

for lemma in syn.lemmas():

synonyms.append(lemma.name())

print(synonyms)

输出:

['happy', 'felicitous', 'happy', 'glad', 'happy', 'happy', 'well-chosen']

同样的,我们也因此可以得到反义词处理:

antonyms = []

for syn in wordnet.synsets("happy"):

for l in syn.lemmas():

if l.antonyms():

antonyms.append(l.antonyms()[0].name())

print(antonyms)

输出:

['unhappy']

词干提取

语言形态学和信息检索里,词干提取是去除词缀得到词根的过程,例如working的词干为work。

搜索引擎在索引页面时就会使用这种技术,所以很多人为相同的单词写出不同的版本。

有很多种算法可以避免这种情况,最常见的是波特词干算法。NLTK有一个名为PorterStemmer的类,就是这个算法的实现:

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()

print(stemmer.stem('working'))

print(stemmer.stem('worked'))

输出:

work

work

单词变体还原

单词变体还原类似于词干,但不同的是,变体还原的结果是一个真实的单词。不同于词干,当你试图提取某些词时,它会产生类似的词:

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()

print(stemmer.stem('increases'))

输出:

increas

现在,如果用NLTK的WordNet来对同一个单词进行变体还原,才是正确的结果:

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

print(lemmatizer.lemmatize('increases'))

输出:

increase

结果可能会是一个同义词或同一个意思的不同单词。

有时候将一个单词做变体还原时,总是得到相同的词。

这是因为语言的默认部分是名词。要得到动词,可以这样指定:

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

print(lemmatizer.lemmatize('playing', pos="v"))

输出:

play

实际上,这也是一种很好的文本压缩方式,最终得到文本只有原先的50%到60%。

结果还可以是动词(v)、名词(n)、形容词(a)或副词(r):

print(lemmatizer.lemmatize('playing', pos="n"))

print(lemmatizer.lemmatize('playing', pos="a"))

print(lemmatizer.lemmatize('playing', pos="r"))

输出:

playing

playing

playing

这次就到这里吧。

下期见。

文章来源: blog.csdn.net,作者:敲代码的灰太狼,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/tongtongjing1765/article/details/100581657

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。