2

我想阻止早期现代英语文本:

sb.stem("loveth")
>>> "lov"

显然,我需要做的只是对 Snowball Stemmer做一个小小的调整:

并将结尾放入英语词干分析器中,列表

慢慢地

步骤 1b 应扩展到

edly ingly est eth

就 Snowball 脚本而言,必须添加结尾 'est' 'eth' 而不是结尾 'ing'。

太好了,所以我只需要更改变量。也许添加一个特殊规则来处理“thee”/“thou”/“you”和“shal”/“shall”。NLTK 文档将变量显示为:

nltk.stem.snowball.EnglishStemmer(ignore_stopwords=False)

基础: nltk.stem.snowball._StandardStemmer

英国雪球词干分析器。

变量:

__vowels – 英语元音。

__double_consonants – 英语双辅音。

__li_ending – 可能直接出现在词尾“li”之前的字母。

__step0_suffixes – 在算法的第 0 步中要删除的后缀。

__step1a_suffixes – 算法步骤 1a 中要删除的后缀。

__step1b_suffixes – 算法步骤 1b 中要删除的后缀。(开始了)

__step2_suffixes – 算法第 2 步中要删除的后缀。

__step3_suffixes – 算法第 3 步中要删除的后缀。

__step4_suffixes – 算法第 4 步中要删除的后缀。

__step5_suffixes – 算法第 5 步中要删除的后缀。

__special_words – 包含必须特别词干的单词的字典。(我可以在这里坚持我的“你”/“你”和“应该”问题)

现在,愚蠢的问题。如何更改变量?我到处寻找变量,我不断得到“对象没有属性”......

4

1 回答 1

1

尝试:

>>> from nltk.stem import snowball
>>> stemmer = snowball.EnglishStemmer()
>>> stemmer.stem('thee')
u'thee'
>>> dir(stemmer)
['_EnglishStemmer__double_consonants', '_EnglishStemmer__li_ending', '_EnglishStemmer__special_words', '_EnglishStemmer__step0_suffixes', '_EnglishStemmer__step1a_suffixes', '_EnglishStemmer__step1b_suffixes', '_EnglishStemmer__step2_suffixes', '_EnglishStemmer__step3_suffixes', '_EnglishStemmer__step4_suffixes', '_EnglishStemmer__step5_suffixes', '_EnglishStemmer__vowels', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_r1r2_standard', '_rv_standard', 'stem', 'stopwords', 'unicode_repr']
>>> stemmer._EnglishStemmer__special_words
{u'exceeds': u'exceed', u'inning': u'inning', u'exceed': u'exceed', u'exceeding': u'exceed', u'succeeds': u'succeed', u'succeeded': u'succeed', u'skis': u'ski', u'gently': u'gentl', u'singly': u'singl', u'cannings': u'canning', u'early': u'earli', u'earring': u'earring', u'bias': u'bias', u'tying': u'tie', u'exceeded': u'exceed', u'news': u'news', u'herring': u'herring', u'proceeds': u'proceed', u'succeeding': u'succeed', u'innings': u'inning', u'proceeded': u'proceed', u'proceed': u'proceed', u'dying': u'die', u'outing': u'outing', u'sky': u'sky', u'andes': u'andes', u'idly': u'idl', u'outings': u'outing', u'ugly': u'ugli', u'only': u'onli', u'proceeding': u'proceed', u'lying': u'lie', u'howe': u'howe', u'atlas': u'atlas', u'earrings': u'earring', u'cosmos': u'cosmos', u'canning': u'canning', u'succeed': u'succeed', u'herrings': u'herring', u'skies': u'sky'}
>>> stemmer._EnglishStemmer__special_words['thee'] = 'thou'
>>> stemmer.stem('thee')
'thou'

和:

>>> stemmer._EnglishStemmer__step0_suffixes
(u"'s'", u"'s", u"'")
>>> stemmer._EnglishStemmer__step1a_suffixes
(u'sses', u'ied', u'ies', u'us', u'ss', u's')
>>> stemmer._EnglishStemmer__step1b_suffixes
(u'eedly', u'ingly', u'edly', u'eed', u'ing', u'ed')
>>> stemmer._EnglishStemmer__step2_suffixes
(u'ization', u'ational', u'fulness', u'ousness', u'iveness', u'tional', u'biliti', u'lessli', u'entli', u'ation', u'alism', u'aliti', u'ousli', u'iviti', u'fulli', u'enci', u'anci', u'abli', u'izer', u'ator', u'alli', u'bli', u'ogi', u'li')
>>> stemmer._EnglishStemmer__step3_suffixes
(u'ational', u'tional', u'alize', u'icate', u'iciti', u'ative', u'ical', u'ness', u'ful')
>>> stemmer._EnglishStemmer__step4_suffixes
(u'ement', u'ance', u'ence', u'able', u'ible', u'ment', u'ant', u'ent', u'ism', u'ate', u'iti', u'ous', u'ive', u'ize', u'ion', u'al', u'er', u'ic')
>>> stemmer._EnglishStemmer__step5_suffixes
(u'e', u'l')

请注意,步骤后缀是元组并且是不可变的,因此您不能像特殊单词一样附加或添加它们,您必须“复制”并强制转换为列表并附加到它,然后覆盖它,例如:

>>> from nltk.stem import snowball
>>> stemmer = snowball.EnglishStemmer()
>>> stemmer._EnglishStemmer__step1b_suffixes
[u'eedly', u'ingly', u'edly', u'eed', u'ing', u'ed', 'eth']
>>> step1b = stemmer._EnglishStemmer__step1b_suffixes 
>>> stemmer._EnglishStemmer__step1b_suffixes = list(step1b) + ['eth']
>>> stemmer.stem('loveth')
u'love'
于 2016-02-29T06:51:13.057 回答