如何使用nltk.stem.snowball来演绎Shakespere / KJV

时间:2016-02-29 02:14:34

标签: python nlp nltk stemming snowball

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

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

显然,我需要做的只是a small tweak给Snowball Stemmer:

  

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

     
    

ed ed ing ingly

  
     步骤1b的

应扩展到

     
    

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"问题

  

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

1 个答案:

答案 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'