Разница между пустыми и предварительно обученными моделями в просторах - PullRequest
0 голосов
/ 27 марта 2020

В настоящее время я пытаюсь обучить текстовый классификатор, используя spacy, и я застрял со следующим вопросом: в чем разница между созданием пустой модели с использованием spacy.blank('en') и использованием предварительно обученной модели spacy.load('en_core_web_sm'). Просто чтобы увидеть разницу, я написал этот код:

text = "hello everyone, it's a wonderful day today"

nlp1 = spacy.load('en_core_web_sm')
for token in nlp1(text):
    print(token.text, token.lemma_, token.is_stop, token.pos_)

, и он дал мне следующий результат:

привет привет False INTJ

каждый каждый True PRON

, False PUNCT

it -PRON- True PRON

is True AUX

aa True DET

замечательный замечательный False ADJ

день дня False NOUN

сегодня сегодня False NOUN

Затем я попробовал это (для того же текста)

nlp2 = spacy.blank('en')
for token in nlp2(text):
    print(token.text, token.lemma_, token.is_stop, token.pos_)

и результат был

привет привет False

каждый каждый True

, False

it -PRON- True PRON

's True

aa True

замечательный замечательный False

day day False

сегодня today False

Мало того, что результаты отличаются (например, отличается лемма для 's), но также нет тегов POS для большинства слов в пустой модели.

Так что, очевидно, мне нужна предварительно обученная модель для нормализации моих данных. Но я все еще не понимаю, как это должно быть с моим классификатором данных. Должен ли я 1) создать пустую модель для обучения текстового классификатора (используя nlp.update()) и загрузить предварительно обученную модель для удаления стоп-слов, лемматизации и маркировки POS или 2) загрузить только предварительно обученную модель для: нормализации и обучения моего текстового классификатора?

Заранее спасибо за любые советы!

1 Ответ

2 голосов
/ 08 апреля 2020

Если вы используете классификатор текста spacy, тогда лучше начать с пустой модели. TextCategorizer не использует функции из каких-либо других конвейерных компонентов.

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

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

  • Если у вас не установлен пакет spacy-lookups-data и вы создаете пустую модель, вы получите строчная форма как лемма по умолчанию / фиктивная.

  • Если у вас установлен пакет spacy-lookups-data и вы создаете пустую модель, он автоматически загрузит леммы поиска, если они доступны для этого language.

  • Если вы загружаете предоставленную модель и конвейер включает в себя тегер, лемматизатор переключается на лучший лемматизатор на основе правил, если он доступен в пространстве для этого языка (в настоящее время: греческий) , Engli sh, французский, норвежский букмол, голландский, Swedi sh). Прилагаемые модели также всегда включают данные поиска для этого языка, поэтому их можно использовать, когда тегер не запущен.

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

import spacy
nlp = spacy.load("en_core_web_sm", disable=["tagger"])

В общем, качество леммы поиска не велико (нет информации, чтобы помочь в неоднозначных случаях), и леммы на основе правил будут намного лучше, однако для запуска теггера требуется дополнительное время, поэтому вы можете выбрать леммы поиска, чтобы ускорить процесс, если качество достаточно хорошее для вашей задачи.

И если вы не используете парсер или Модель NER для предварительной обработки позволяет ускорить процесс, отключив их:

nlp = spacy.load("en_core_web_sm", disable=["ner", "parser"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...