Применение шаблона проектирования стратегии - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужно написать программу для лемматизации текста (разные формы слов).Поскольку я собираюсь использовать разные библиотеки лемматизации и сравнивать их, я решил использовать шаблон стратегии.

Моя идея состоит в том, чтобы обернуть все в один класс и, в зависимости от функции лемматизации, изменить только мой метод лемматизации..

Вот мой класс:

import re
import types

create_bound_method = types.MethodType

class Lemmatizator(object):
def __init__(self, filename=None, lemmatization=None):
    if lemmatization and filename:
        self.filename = filename
        self.lemmatize = create_bound_method(lemmatization, self)

def _get_text(self):
    with open(f'texts/{self.filename}.txt', 'r') as file:
        self.text = file.read()

def _split_to_unique(self):
    text = re.sub(r'[^\w\s]', '', self.text)
    split_text = re.split(r'\s', text)

    self.unique_words = set(split_text)

    return self.unique_words

def lemmatize(self):
    return 'Lemmatize function or text are not found'

Затем я создаю свой метод лемматизации:

def nltk_lemmatization(self):
words = {}

for word in self.unique_words:
    if word:
        words[word] = {
            'noun': wnl.lemmatize(word),
            'adverb': wnl.lemmatize(word, pos='r'),
            'adjective': wnl.lemmatize(word, pos='a'),
            'verb': wnl.lemmatize(word, pos='v')
        }

return words

И пытаюсь применить его:

nltk_lem = Lemmatizator('A Christmas Carol in Prose', nltk_lemmatization)
nltk_lem.lemmatize()

Но я получаю следующую ошибку:

for word in self.unique_words:

AttributeError: у объекта 'Lemmatizator' нет атрибута 'unique_words'

что не так?

1 Ответ

0 голосов
/ 27 ноября 2018

Из того, что я вижу, self.unique_words добавляется только к классу в функции _split_to_unique(self).Поэтому, когда вы звоните nltk_lemmatization(self), _split_to_unique(self) еще не был вызван, и в результате он пытается перебрать то, чего не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...