我想阻止早期的现代英语文本:
sb.stem("loveth")
>>> "lov"
显然,我需要做的只是a small tweak给Snowball Stemmer:
并将结尾放入英语词干分析器列表中
步骤1b的ed ed ing ingly
应扩展到
edly ingly est eth
就Snowball脚本而言,结局' est' ' ETH'必须添加以防止结束'。
很好,所以我只需要改变变量。也许添加一个特殊的规则来处理" thee" /"你" /"你" " shalt" /""。 NLTK documentation将变量显示为:
类 nltk.stem.snowball.EnglishStemmer(ignore_stopwords = False)
基地: nltk.stem.snowball._StandardStemmer
英国雪球词干。
变量:
__元音 - 英语元音。
__ double_consonants - 英文双辅音。
__ li_ending - 可能直接出现在单词final'li'之前的字母。
__ step0_suffixes - 在算法的第0步中删除的后缀。
__ step1a_suffixes - 在算法的步骤1a中删除的后缀。
__ step1b_suffixes - 在算法的步骤1b中删除的后缀。 (我们走了)
__ step2_suffixes - 在算法的第2步中删除的后缀。
__ step3_suffixes - 在算法的第3步中删除的后缀。
__ step4_suffixes - 在算法的第4步中删除的后缀。
__ step5_suffixes - 在算法的第5步中删除的后缀。
__ special_words - 包含必须专门删除的单词的字典。 (我可以坚持我的"你" /"你"和#34; shalt"问题
现在,愚蠢的问题。如何更改变量?我到处寻找变量,我不断得到"对象没有属性" ...
答案 0 :(得分: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'