搜索
您的当前位置:首页正文

Python NLTK自然语言处理:词干、词形与MaxMatch

2024-12-14 来源:知库网

[python] view plain copy

import nltk
nltk.download()

然后,Python Launcher会弹出下面这个界面,建议你选择安装所有的Packages,以免去日后一而再、再而三的进行安装,也为你的后续开发提供一个稳定的环境。某些包的Status显示“out of date”,你可以不必理会,它基本不影响你的使用与开发。

既然你已经安装成功,我们来小试牛刀一下。当然本文涉及的主要任务都是自然语言处理中最常用,最基础的pre-processing过程,结合机器学习的高级应用我们会在后续文章中再进行介绍。

1、 Sentences Segment(分句)
也就是说我们手头有一段文本,我们希望把它分成一个一个的句子。此时可以使用NLTK中的 punkt sentence segmenter。来看示例代码

[python] view plain copy

sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
paragraph = "The first time I heard that song was in Hawaii on radio.
... I was just a kid, and loved it very much! What a fantastic song!"
sentences = sent_tokenizer.tokenize(paragraph)
sentences
['The first time I heard that song was in Hawaii on radio.',
'I was just a kid, and loved it very much!',
'What a fantastic song!']

由此,我们便把一段话成功分句了。

2、Tokenize sentences (分词)
接下来我们要把每个句话再切割成逐个单词。最简单的方法是使用NLTK 包中的 WordPunct tokenizer。来看示例代码

[python] view plain copy

from nltk.tokenize import WordPunctTokenizer
sentence = "Are you old enough to remember Michael Jackson attending
... the Grammys with Brooke Shields and Webster sat on his lap during the show?"
words = WordPunctTokenizer().tokenize(sentence)
words
['Are', 'you', 'old', 'enough', 'to', 'remember', 'Michael', 'Jackson', 'attending',
'the', 'Grammys', 'with', 'Brooke', 'Shields', 'and', 'Webster', 'sat', 'on', 'his',
'lap', 'during', 'the', 'show', '?']

我们的分词任务仍然完成的很好。除了WordPunct tokenizer之外,NLTK中还提供有另外三个分词方法,
TreebankWordTokenizer,PunktWordTokenizer和WhitespaceTokenizer,而且他们的用法与WordPunct tokenizer也类似。然而,显然我们并不满足于此。对于比较复杂的词型,WordPunct tokenizer往往并不胜任。此时我们需要借助正则表达式的强大能力来完成分词任务,此时我所使用的函数是regexp_tokenize()。来看下面这段话

[python] view plain copy

text = 'That U.S.A. poster-print costs $12.40...'

目前市面上可以参考的在Python下进行自然语言处理的书籍是由Steven Bird、Ewan Klein、Edward Loper编写的《Python 自然语言处理》。但是该书的编写时间距今已有近十年的时间,由于软件包更新等语言,在新环境下进行开发时,书中的某些代码并不能很正常的运行。最后,我们举一个书中代码out of date的例子(对上面这就话进行分词),并给出相应的解决办法。首先来看书中的一段节录

[python] view plain copy

text = 'That U.S.A. poster-print costs $12.40...'
pattern = r'''''(?x) # set flag to allow verbose regexps
... ([A-Z].)+ # abbreviations, e.g. U.S.A.
... | \w+(-\w+)* # words with optional internal hyphens
... | $?\d+(.\d+)?%? # currency and percentages, e.g. $12.40, 82%
... | ... # ellipsis
... | [][.,;"'?():-_`] # these are separate tokens; includes ], [
... '''
nltk.regexp_tokenize(text, pattern)

我们预期得到输出应该是这样的

[python] view plain copy
['That', 'U.S.A.', 'poster-print', 'costs', '$12.40', '...']

但是我们实际得到的输出却是这样的(注意我们所使用的NLTK版本)

[python] view plain copy
[('', '', ''),
('A.', '', ''),
('', '-print', ''),
('', '', ''),
('', '', '.40'),
('', '', '')]

[python] view plain copy
pattern = r"""(?x) # set flag to allow verbose regexps
(?:[A-Z].)+ # abbreviations, e.g. U.S.A.
|\d+(?:.\d+)?%? # numbers, incl. currency and percentages
|\w+(?:[-']\w+)* # words w/ optional internal hyphens/apostrophe
|... # ellipsis
|(?:[.,;"'?():-_`]) # special characters with meanings
"""

再次执行前面的语句,便会得到

[python] view plain copy

nltk.regexp_tokenize(text, pattern)
['That', 'U.S.A.', 'poster-print', 'costs', '12.40', '...']

Python自然语言处理:词干、词形与MaxMatch算法

自然语言处理中一个很重要的操作就是所谓的stemming 和 lemmatization,二者非常类似。它们是词形规范化的两类重要方式,都能够达到有效归并词形的目的,二者既有联系也有区别。

1、词干提取(stemming)
定义:Stemming is the process for reducing inflected (or sometimes derived) words to their stem, base or root form—generally a written word form.
解释一下,Stemming 是抽取词的词干或词根形式(不一定能够表达完整语义)。

NLTK中提供了三种最常用的词干提取器接口,即 Porter stemmer, Lancaster Stemmer 和 Snowball Stemmer。
Porter Stemmer基于Porter词干提取算法,来看例子
[python] view plain copy

from nltk.stem.porter import PorterStemmer
porter_stemmer = PorterStemmer()
porter_stemmer.stem(‘maximum’)
u’maximum’
porter_stemmer.stem(‘presumably’)
u’presum’
porter_stemmer.stem(‘multiply’)
u’multipli’
porter_stemmer.stem(‘provision’)
u’provis’
porter_stemmer.stem(‘owed’)
u’owe’

Lancaster Stemmer 基于Lancaster 词干提取算法,来看例子

[python] view plain copy

from nltk.stem.lancaster import LancasterStemmer
lancaster_stemmer = LancasterStemmer()
lancaster_stemmer.stem(‘maximum’)
‘maxim’
lancaster_stemmer.stem(‘presumably’)
‘presum’
lancaster_stemmer.stem(‘presumably’)
‘presum’
lancaster_stemmer.stem(‘multiply’)
‘multiply’
lancaster_stemmer.stem(‘provision’)
u’provid’
lancaster_stemmer.stem(‘owed’)
‘ow’

Snowball Stemmer基于Snowball 词干提取算法,来看例子

[python] view plain copy

from nltk.stem import SnowballStemmer
snowball_stemmer = SnowballStemmer(“english”)
snowball_stemmer.stem(‘maximum’)
u’maximum’
snowball_stemmer.stem(‘presumably’)
u’presum’
snowball_stemmer.stem(‘multiply’)
u’multipli’
snowball_stemmer.stem(‘provision’)
u’provis’
snowball_stemmer.stem(‘owed’)
u’owe’

2、词形还原(lemmatization)
定义:Lemmatisation (or lemmatization) in linguistics, is the process of grouping together the different inflected forms of a word so they can be analysed as a single item.

可见,Lemmatisation是把一个任何形式的语言词汇还原为一般形式(能表达完整语义)。相对而言,词干提取是简单的轻量级的词形归并方式,最后获得的结果为词干,并不一定具有实际意义。词形还原处理相对复杂,获得结果为词的原形,能够承载一定意义,与词干提取相比,更具有研究和应用价值。

我们会在后面给出一个同MaxMatch算法相结合的更为复杂的例子。

3、最大匹配算法(MaxMatch)
MaxMatch算法在中文自然语言处理中常常用来进行分词(或许从名字上你已经能想到它是基于贪婪策略设计的一种算法)。通常,英语中一句话里的各个词汇之间通过空格来分割,这是非常straightforward的,但是中文却没有这个遍历。例如“我爱中华人民共和国”,这句话被分词的结果可能是这样的{‘我’,‘爱’,‘中华’,‘人民’,‘共和国’},又或者是{‘我’,‘爱’,‘中华人民共和国’},显然我们更倾向于后者的分词结果。因为‘中华人民共和国’显然是一个专有名词(把这样一个词分割来看显然并不明智)。我们选择后者的策略就是所谓的MaxMatch,即最大匹配。因为‘中华人民共和国’这个词显然要比‘中华’,‘人民’,‘共和国’这些词都长。

我们可以通过一个英文的例子来演示MaxMatch算法(其实中文处理的道理也是一样的)。算法从右侧开始逐渐减少字符串长度,以此求得可能匹配的最大长度的字符串。考虑到我们所获得的词汇可能包含有某种词型的变化,所以其中使用了Lemmatisation,然后在词库里进行匹配查找。
[python] view plain copy
from nltk.stem import WordNetLemmatizer
from nltk.corpus import words

wordlist = set(words.words())
wordnet_lemmatizer = WordNetLemmatizer()

def max_match(text):
pos2 = len(text)
result = ''
while len(text) > 0:
word = wordnet_lemmatizer.lemmatize(text[0:pos2])
if word in wordlist:
result = result + text[0:pos2] + ' '
text = text[pos2:]
pos2 = len(text)
else:
pos2 = pos2-1
return result[0:-1]

来看看算法的实现效果

[python] view plain copy

string = 'theyarebirds'
print(max_match(string))
they are birds

当然,上述代码尚有一个不足,就是当字符串中存在非字母字符时(例如数字标点等),它可能会存在一些问题。有兴趣的读者不妨自己尝试完善改进这个版本的实现。

以上便是我们对NLTK这个自然语言处理工具包的初步探索,最后,我想说《Python 自然语言处理》仍然是当前非常值得推荐的一本讲述利用NLTK和Python进行自然语言处理技术的非常值得推荐的书籍。

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

热门图文

Top