buriy / spacy-ru

Russian language models for spaCy
MIT License
242 stars 29 forks source link

Работает ли с NLP фреймворком Rasa? #11

Closed GraphGrailAi closed 4 years ago

GraphGrailAi commented 5 years ago

https://rasa.com/docs/ использует spacy, интересно, насколько просто прикручивается русская модель так, чтобы в Rasa пайплайн работал

buriy commented 5 years ago

Там поди NER нужен? Релиз с NER готовится.

GraphGrailAi commented 5 years ago

Нужен, но не только, еще всякие токенизаторы, предобученные модели ворд2век, есть ли пруф что работаети туториал может прикрутить

buriy commented 5 years ago

А есть какой-нибудь способ проверить, работает ли rasa с русским spacy? У меня же нет проекта для rasa. Если бы был бы код, который можно было чинить, было бы проще. Можешь завести для такого кода репозиторий на гитхабе и дать ссылку на него в этом issue.

true1337 commented 5 years ago

Ты можешь протестировать следующим образом:

pip install rasa
rasa init

Устанавливаю spacy-ru в соответствии с инструкцией в README.md

Теперь в config.yml я делаю так:

language: ru
pipeline:
- name: "SpacyNLP"
  model: ru2
- name: "SpacyTokenizer"
- name: "SpacyFeaturizer"
- name: "RegexFeaturizer"
- name: "CRFEntityExtractor"
- name: "EntitySynonymMapper"
- name: "SklearnIntentClassifier"

Теперь:

rasa x

В терминале наблюдаю:

2019-06-05 14:25:06 INFO     pymorphy2.opencorpora_dict.wrapper  - Loading dictionaries from /home/nkazakov/.local/share/virtualenvs/test_rasa-_X5XuIV8/lib/python3.6/site-packages/pymorphy2_dicts/data

Не уверен до конца, что все хорошо работает, но по крайней мере для intent'а greet завелось.

Koziev commented 5 years ago

Не уверен до конца, что все хорошо работает, но по крайней мере для intent'а greet завелось.

Никита, не подскажешь, какие у тебя версии rasa, spacy, thinc? У меня при попытке сделать "rasa train" с подключенным ru2 все заканчивается ошибкой где-то внутри thinc при попытке копирования массивов с совпадающими размерами. Попробовал пооткатывать версии rasa и spacy, не помогло :( При этом меняю в конфиге язык на en - все прекрасно.

buriy commented 5 years ago

Эта ошибка периодически встречается, говорят "обновитесь", больше ничего не нашёл. Кстати, вдруг отсутствие/наличие NER влияет -- у меня сейчас версия без NER. Дайте плиз мне инструкции как воспроизвести -- просто поставить rasa по инструкции достаточно? Или там как-то надо потом вызвать нужный шаблон, чтобы оно .ru загрузило? Лучше, если можно из консоли. А, не увидел выше инструкцию! Сейчас попробую.

Koziev commented 5 years ago

Так, у меня под убунтой с текущей версией spacy и rasa тоже завелось. Хотя осталось ощущение, что где-то в dependencies что-то нечисто - я не сделал ничего, просто еще раз под virsualenv установил spacy, rasa.

GraphGrailAi commented 5 years ago

@true1337 @buriy У меня тоже заработало, но есть нюансы. Что делал: поставил spacy-ru, по инструкции выше изменил pipeline в файле nlu_config.yml, далее в консоли запустил по очереди make train-nlu, затем make train-core. Обучение прошло, хотя были варнинги.

Как я понял, сущности определяются и произошла интеграция модели ру, тк в консоли при обучении были такие строки:

2019-07-10 17:53:20 INFO     rasa_nlu.training_data.training_data  - Training data stats: 
    - intent examples: 165 (12 distinct intents)
    - Found intents: 'ask_whatyoucan', 'ask_whoareyou', 'affirm', 'goodbye <!-— The label of the intent —>', 'ask_replica_sa', 'thanks', 'name', 'greet', 'ask_joke', 'ask_po', 'ask_family', 'ask_w'
    - entity examples: 79 (2 distinct entities)
    - found entities: 'name_po', 'name'

У меня в наборе реплик nlu_data.md есть штук 30 ответов юзера, где он отвечает на вопрос как его зовут с именем. А бот болжен понять, что ему ответили имя и использовать его далее, приведу кусочек:

## intent:name
- Меня зовут [Саша](name) 
- Я [Петя](name)
- Я это[Александр](name)
- Люди зовут меня [Джон](name)

А дальше интересно, как я тестировал: без ру модели бот понимает только имена, которые явно забиты в датасете. С моделью он смог понять имя Василий, хотя его в датасете не было (было Вася). Но он почему-то не может понять Люба, Любовь - специально взял проверить тк имя многозначное - вообще ничего не отвечает. Иностранные имена типа Джек тоже не понимает. Это потому, что модель ру на русских именах обучалась, то есть и не должен понимать?

Снимок экрана от 2019-07-10 18-43-55_2

И еще, почему как энтити понимает слово Сегодня, фамилию Путин понимает только с большой буквы, а должен с маленькой тоже. Я понимаю, что датасет старый наверное. Вообще, для нер лучше прикрутить от Айпавлов модель (или Polyglot): http://docs.deeppavlov.ai/en/master/components/ner.html

Что посоветуете, как проще это сделать

Koziev commented 5 years ago

Вообще, для нер лучше прикрутить от Айпавлов модель (или Polyglot): http://docs.deeppavlov.ai/en/master/components/ner.html

Мне кажется, для подключения стороннего NER лучше всего оформить его как Custom NLU Components в RASA.

С другой стороны, обучить NER в spacy тоже не сложно, но нужен обучающий датасет, и это проблема. Особенно если хочется что-то более интересное, типа названий еды. Я для макета rasa+spacy сделал 2 entity для дат и количества, чтобы rasa разбирала фразы типа "закажи сейчас 2 пиццы", в принципе работает.

GraphGrailAi commented 5 years ago

Мне кажется, для подключения стороннего NER лучше всего оформить его как Custom NLU Components в RASA.

Возможно, но хотелось бы обойтись без кодинга, собственно я думал в этом репозитории это проще реализовать, как писали выше, готовится нер. В блоге Rasa есть в принципе туториал описания как приделать, причем есть вариант без обучения (https://blog.rasa.com/enhancing-rasa-nlu-with-custom-components), но это риск, могут повылезать баги и неизвестно сколько их решать, не ясно, полностью ли совпадают типы распознаваемых энтити у Спаси и Айпавлов (вроде да https://spacy.io/api/annotation#named-entities), будет ли работать пайплайн Раса дальше - то есть обучать модель интентов классификации, используя энтити распознанные. Все это открытые вопросы.

А вы сделали для дат и количества именно Custom NLU Component ?

Koziev commented 5 years ago

А вы сделали для дат и количества именно Custom NLU Component ?

Я обучил ner spacy. Правда, я не очяень сильно впечатлен качеством получившейся модели, так как для entity "пациенс" например распознает "пиццу", но не опознает "пиццы" в реплике "Закажи 2 пиццы", и в таком духе. В общем, как-то оно заработало, для макета годится.

buriy commented 5 years ago

@Koziev а там проблема в том, что модель для морфологии и синтаксиса сейчас хорошо знает всего 110 тысяч словоформ. И нормального способа научить spacy морфологическим характеристикам всех 5 млн словоформ там нет. Но есть пару способов это обойти, я доберусь и реализую один из них, вот тогда оно должно намного лучше работать.

achmedzhanov commented 4 years ago

Привет! Как когда ждать версию с NER?

buriy commented 4 years ago

Привет. Я могу уже сегодня выложить версию 2.1 c NER без POS/DEP для теста, например, только для PER/LOC/ORG, но я больше заинтересован сейчас в полноценной интеграции всех фич, а для этого нужно ещё минимум несколько дней. Так что, похоже, будет вам подарок только к новому году, не раньше. С версией для 2.2 тоже думаю проблем не будет, т.к. там сломан только CLI, а так больше ничего не изменилось. А вот такой вам вопрос: а полагается ли rasa на token.norm ? А то я тут экспериментально модифицирую token.norm относительно стандартного, чтобы поднять качество работы всех нейросетей, использующих информацию токенов (т.е., POS, DEP, NER, TextCat) на 3-5%. Это будет работать заменой token.norm_ на стем/лемму (сейчас там lowercase-версия слова).

Ezhvsalate commented 4 years ago

Привет!

Пытаюсь прикрутить модель к rasa как описано в постах выше. При попытке выполнить rasa train падаю с:

2020-02-23 14:46:04 INFO rasa.nlu.utils.spacy_utils - Trying to load spacy model with name 'ru2' 2020-02-23 14:46:05 INFO pymorphy2.opencorpora_dict.wrapper - Loading dictionaries from /root/venv/lib64/python3.6/site-packages/pymorphy2_dicts/data 2020-02-23 14:46:05 INFO pymorphy2.opencorpora_dict.wrapper - format: 2.4, revision: 393442, updated: 2015-01-17T16:03:56.586168 Traceback (most recent call last): File "/root/venv/bin/rasa", line 8, in sys.exit(main()) File "/root/venv/lib64/python3.6/site-packages/rasa/main.py", line 76, in main cmdline_arguments.func(cmdline_arguments) File "/root/venv/lib64/python3.6/site-packages/rasa/cli/train.py", line 76, in train kwargs=extract_additional_arguments(args), File "/root/venv/lib64/python3.6/site-packages/rasa/train.py", line 46, in train kwargs=kwargs, File "uvloop/loop.pyx", line 1456, in uvloop.loop.Loop.run_until_complete File "/root/venv/lib64/python3.6/site-packages/rasa/train.py", line 97, in train_async kwargs, File "/root/venv/lib64/python3.6/site-packages/rasa/train.py", line 184, in _train_async_internal kwargs=kwargs, File "/root/venv/lib64/python3.6/site-packages/rasa/train.py", line 241, in _do_training persist_nlu_training_data=persist_nlu_training_data, File "/root/venv/lib64/python3.6/site-packages/rasa/train.py", line 470, in _train_nlu_with_validated_data persist_nlu_training_data=persist_nlu_training_data, File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/train.py", line 74, in train trainer = Trainer(nlu_config, component_builder) File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/model.py", line 147, in init self.pipeline = self._build_pipeline(cfg, component_builder) File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/model.py", line 159, in _build_pipeline component = component_builder.create_component(component_cfg, cfg) File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/components.py", line 482, in create_component component = registry.create_component_by_config(component_config, cfg) File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/registry.py", line 226, in create_component_by_config return component_class.create(component_config, config) File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/utils/spacy_utils.py", line 81, in create nlp = cls.load_model(spacy_model_name) File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/utils/spacy_utils.py", line 51, in load_model return spacy.load(spacy_model_name, disable=["parser"]) File "/root/venv/lib64/python3.6/site-packages/spacy/init.py", line 15, in load return util.load_model(name, overrides) File "/root/venv/lib64/python3.6/site-packages/spacy/util.py", line 116, in load_model return load_model_from_path(Path(name), overrides) File "/root/venv/lib64/python3.6/site-packages/spacy/util.py", line 156, in load_model_from_path return nlp.from_disk(model_path) File "/root/venv/lib64/python3.6/site-packages/spacy/language.py", line 653, in from_disk util.from_disk(path, deserializers, exclude) File "/root/venv/lib64/python3.6/site-packages/spacy/util.py", line 511, in from_disk reader(path / key) File "/root/venv/lib64/python3.6/site-packages/spacy/language.py", line 641, in self.vocab.from_disk(p) and _fix_pretrained_vectors_name(self))), File "vocab.pyx", line 376, in spacy.vocab.Vocab.from_disk File "strings.pyx", line 212, in spacy.strings.StringStore.from_disk File "strings.pyx", line 213, in spacy.strings.StringStore.from_disk ValueError: Expected object or value

Если ставлю model: en_core_web_sm - все хорошо.

rasa==1.6.1, spacy==2.0.12, pymorphy2==0.8, pymorphy2-dicts==2.4.393442.3710985

Посоветуйте в какую сторону копать?

buriy commented 4 years ago

@Ezhvsalate Хз, модель не нашлась у тебя почему-то... Или неправильно загрузилась... Попробуй отдельно сделать spacy.load на ту же модель, если ошибка та же -- то с моделью разбирайся/гугли ошибку, если ошибки нет -- то ищи разницу...

Ezhvsalate commented 4 years ago

@buriy, склонировал заново репу на ВМ, перезапустил - моделька обучается. Но дальше при запуске rasa shell новое веселье:

Сначала все запускается нормально:

(venv) [root@srv8 backend]# rasa shell --p 5006
2020-02-23 17:33:18 INFO     root  - Connecting to channel 'cmdline' which was specified by the '--connector' argument. Any other channels will be ignored. To connect to all given channels, omit the '--connector' argument.
2020-02-23 17:33:18 INFO     root  - Starting Rasa server on http://localhost:5006
2020-02-23 17:33:23 INFO     absl  - Entry Point [tensor2tensor.envs.tic_tac_toe_env:TicTacToeEnv] registered with id [T2TEnv-TicTacToeEnv-v0]
2020-02-23 17:33:23 INFO     pymorphy2.opencorpora_dict.wrapper  - Loading dictionaries from /root/venv/lib64/python3.6/site-packages/pymorphy2_dicts/data
2020-02-23 17:33:23 INFO     pymorphy2.opencorpora_dict.wrapper  - format: 2.4, revision: 393442, updated: 2015-01-17T16:03:56.586168
2020-02-23 17:33:25 INFO     rasa.nlu.components  - Added 'SpacyNLP' to component cache. Key 'SpacyNLP-ru2'.
Bot loaded. Type a message and press enter (use '/stop' to exit):

но при попытке отправить боту сообщение падаем

 File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/classifiers/sklearn_intent_classifier.py", line 167, in process
    intent_ids, probabilities = self.predict(X)
  File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/classifiers/sklearn_intent_classifier.py", line 210, in predict
    pred_result = self.predict_prob(X)
  File "/root/venv/lib64/python3.6/site-packages/rasa/nlu/classifiers/sklearn_intent_classifier.py", line 199, in predict_prob
    return self.clf.predict_proba(X)
  File "/root/venv/lib64/python3.6/site-packages/sklearn/svm/base.py", line 622, in _predict_proba
    X = self._validate_for_predict(X)
  File "/root/venv/lib64/python3.6/site-packages/sklearn/svm/base.py", line 478, in _validate_for_predict
    (n_features, self.shape_fit_[1]))
ValueError: X.shape[1] = 256 should be equal to 128, the number of features at training time

UPDATE Может быть кому-то поможет, в итоге у меня завелось когда взял модель из ветки 2.1 и поставил spacy 2.1.9

buriy commented 4 years ago

Давайте-ка тогда сделаем ветку 2.1 базовой, раз 2.0 теперь даже не работает. А 2.0 поставим в бранч.