Переопределение токенизатора векторизатора scikitlearn с помощью spacy

Я хочу реализовать лемматизацию с пакетом Spacy. Вот мой код:

regexp = re.compile( '(?u)\\b\\w\\w+\\b' )
en_nlp = spacy.load('en')
old_tokenizer = en_nlp.tokenizer
en_nlp.tokenizer = lambda string: old_tokenizer.tokens_from_list(regexp.findall(string))

def custom_tokenizer(document):
    doc_spacy = en_nlp(document)
    return [token.lemma_ for token in doc_spacy]

lemma_tfidfvect = TfidfVectorizer(tokenizer= custom_tokenizer,stop_words = 'english')

Но это сообщение об ошибке появилось, когда я запускаю этот код.

C:\Users\yu\Anaconda3\lib\runpy.py:193: DeprecationWarning: Tokenizer.from_list is now deprecated. Create a new Doc object instead and pass in the strings as the `words` keyword argument, for example:
from spacy.tokens import Doc
doc = Doc(nlp.vocab, words=[...])
  "__main__", mod_spec)

Как я могу решить эту проблему ?


person Antenna_    schedule 26.01.2018    source источник


Ответы (2)


Чтобы настроить tokenizer spaCy, вам нужно передать ему список словарей, в которых указано слово, требующее пользовательской токенизации, и орты, на которые оно должно быть разделено. Вот пример кода из документов:

from spacy.attrs import ORTH, LEMMA
case = [{"don't": [{ORTH: "do"}, {ORTH: "n't", LEMMA: "not"}]}]
tokenizer.add_special_case(case)

Если вы делаете все это, потому что хотите создать собственный лемматизатор, вам может быть лучше просто создать собственный список лемм напрямую. Вам придется изменить языковые данные самого spaCy, но формат довольно прост:

"dustiest": ("dusty",),
"earlier": ("early",),
"earliest": ("early",),
"earthier": ("earthy",),
...

Эти файлы находятся здесь для английского языка.

person ahalt    schedule 30.01.2018

Я думаю, что ваш код работает нормально, вы просто получаете DeprecationWarning, что на самом деле не является ошибкой.

Следуя совету, данному предупреждением, я думаю, вы можете изменить свой код, заменив

en_nlp.tokenizer = lambda string: Doc(en_nlp.vocab, words = regexp.findall(string))

и это должно работать без предупреждений (сегодня это происходит на моей машине).

person Davide Fiocco    schedule 16.03.2018