Расширение класса в nltk. - питон

Цель состоит в том, чтобы добавить дополнительные функции к классу wordnet в nltkНапример:

from nltk.corpus import wordnet

class WN(wordnet):
    def foobar(self):
        print 'foobar'

x = WN
WN.foobar()

но это дает ошибку:

Traceback (most recent call last):
  File "/home/alvas/workspace/pybabel-fresh/babelnet/utils/pybabel_WordNet.py", line 5, in <module>
    class WN(wordnet):
  File "/usr/local/lib/python2.7/dist-packages/nltk/corpus/util.py", line 44, in __init__
    assert issubclass(reader_cls, CorpusReader)
TypeError: Error when calling the metaclass bases
    issubclass() arg 1 must be a class

Итак, я попробовал с nltk.corpus.reader.WordNetCorpusReader( http://www.nltk.org/_modules/nltk/corpus/reader/wordnet.html):

from nltk.corpus.reader import WordNetCorpusReader

class WN(WordNetCorpusReader):
    def __init__(self):
        self = WN.__init__()

    def foobar(self):
        return "foobar"

x = WN
x.foobar()

Тем не менее, похоже, что если я использую WordNetCorpusReader, мне нужно создать его экземпляр, поэтому я получил:

Traceback (most recent call last):
  File "/home/alvas/workspace/pybabel-fresh/babelnet/utils/pybabel_WordNet.py", line 13, in <module>
    x.foobar()
TypeError: unbound method foobar() must be called with WN instance as first argument (got nothing instead)

Тогда я попробовал:

from nltk.corpus.reader import WordNetCorpusReader

class WN(WordNetCorpusReader):
    def foobar(self):
        return "foobar"

x = WN
for i in x.all_synsets():
    print i

[из]:

Traceback (most recent call last):
  File "/home/alvas/workspace/pybabel-fresh/babelnet/utils/pybabel_WordNet.py", line 10, in <module>
    for i in x.all_synsets():
TypeError: unbound method all_synsets() must be called with WN instance as first argument (got nothing instead)

Как расширить API WordNet nltk новыми функциями? Обратите внимание: цель состоит в том, чтобы создать новый класс с новыми функциями.

1 ответ

Решение

Ваша вторая попытка кажется самой близкой. Проблема с вашим конструктором:

class WN(WordNetCorpusReader):
    def __init__(self):
        self = WN.__init__()  # needs an instance as the first argument, recursive, and no need to assign to self

__init__ Метод нуждается в экземпляре в качестве первого аргумента (здесь self), а кроме того, вы звоните __init__ метод неправильного класса. Это приведет к RuntimeError: maximum recursion depth exceeded ошибка. Наконец, вы просто хотите вызвать метод; вам не нужно присваивать результаты метода self,

Я думаю, что вы хотели сделать это вместо:

from nltk.corpus.reader import WordNetCorpusReader
import nltk

class WN(WordNetCorpusReader):
    def __init__(self, *args):
        WordNetCorpusReader.__init__(self, *args)

    def foobar(self):
        return "foobar"

Уловка, однако, что вам нужно будет пройти необходимый WordNetCorpusReader.__init__ аргументы к вашему новому классу. В моей версии nltkэто означает, что вам нужно будет пройти root аргумент следующим образом:

>>> x = WN(nltk.data.find('corpora/wordnet'))
>>> x.foobar()
'foobar'
>>> x.synsets('run')
[Synset('run.n.01'), Synset('test.n.05'), ...]

Более эффективный подход

Намного более эффективный способ сделать то же самое заключается в следующем:

class WN(WordNetCorpusReader):
    root = nltk.data.find('corpora/wordnet')  # make root a class variable, so you only need to load it once
    def __init__(self, *args, **kwargs):
        WordNetCorpusReader.__init__(self, WN.root, *args, **kwargs)  # add root yourself here, so no arguments are required

    def foobar(self):
        return "foobar"

Теперь проверьте это:

>>> x = WN()
>>> x.foobar()
'foobar'
>>> x.synsets('run')
[Synset('run.n.01'), Synset('test.n.05'), ...]

Кстати, мне очень понравилось видеть вашу работу на nltk тег.

Другие вопросы по тегам