Closed GraphGrailAi closed 4 years ago
Там поди NER нужен? Релиз с NER готовится.
Нужен, но не только, еще всякие токенизаторы, предобученные модели ворд2век, есть ли пруф что работаети туториал может прикрутить
А есть какой-нибудь способ проверить, работает ли rasa с русским spacy? У меня же нет проекта для rasa. Если бы был бы код, который можно было чинить, было бы проще. Можешь завести для такого кода репозиторий на гитхабе и дать ссылку на него в этом issue.
Ты можешь протестировать следующим образом:
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 завелось.
Не уверен до конца, что все хорошо работает, но по крайней мере для intent'а greet завелось.
Никита, не подскажешь, какие у тебя версии rasa, spacy, thinc? У меня при попытке сделать "rasa train" с подключенным ru2 все заканчивается ошибкой где-то внутри thinc при попытке копирования массивов с совпадающими размерами. Попробовал пооткатывать версии rasa и spacy, не помогло :( При этом меняю в конфиге язык на en - все прекрасно.
Эта ошибка периодически встречается, говорят "обновитесь", больше ничего не нашёл. Кстати, вдруг отсутствие/наличие NER влияет -- у меня сейчас версия без NER. Дайте плиз мне инструкции как воспроизвести -- просто поставить rasa по инструкции достаточно? Или там как-то надо потом вызвать нужный шаблон, чтобы оно .ru загрузило? Лучше, если можно из консоли. А, не увидел выше инструкцию! Сейчас попробую.
Так, у меня под убунтой с текущей версией spacy и rasa тоже завелось. Хотя осталось ощущение, что где-то в dependencies что-то нечисто - я не сделал ничего, просто еще раз под virsualenv установил spacy, rasa.
@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)
А дальше интересно, как я тестировал: без ру модели бот понимает только имена, которые явно забиты в датасете. С моделью он смог понять имя Василий, хотя его в датасете не было (было Вася). Но он почему-то не может понять Люба, Любовь - специально взял проверить тк имя многозначное - вообще ничего не отвечает. Иностранные имена типа Джек тоже не понимает. Это потому, что модель ру на русских именах обучалась, то есть и не должен понимать?
И еще, почему как энтити понимает слово Сегодня, фамилию Путин понимает только с большой буквы, а должен с маленькой тоже. Я понимаю, что датасет старый наверное. Вообще, для нер лучше прикрутить от Айпавлов модель (или Polyglot): http://docs.deeppavlov.ai/en/master/components/ner.html
Что посоветуете, как проще это сделать
Вообще, для нер лучше прикрутить от Айпавлов модель (или Polyglot): http://docs.deeppavlov.ai/en/master/components/ner.html
Мне кажется, для подключения стороннего NER лучше всего оформить его как Custom NLU Components в RASA.
С другой стороны, обучить NER в spacy тоже не сложно, но нужен обучающий датасет, и это проблема. Особенно если хочется что-то более интересное, типа названий еды. Я для макета rasa+spacy сделал 2 entity для дат и количества, чтобы rasa разбирала фразы типа "закажи сейчас 2 пиццы", в принципе работает.
Мне кажется, для подключения стороннего 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 ?
А вы сделали для дат и количества именно Custom NLU Component ?
Я обучил ner spacy. Правда, я не очяень сильно впечатлен качеством получившейся модели, так как для entity "пациенс" например распознает "пиццу", но не опознает "пиццы" в реплике "Закажи 2 пиццы", и в таком духе. В общем, как-то оно заработало, для макета годится.
@Koziev а там проблема в том, что модель для морфологии и синтаксиса сейчас хорошо знает всего 110 тысяч словоформ. И нормального способа научить spacy морфологическим характеристикам всех 5 млн словоформ там нет. Но есть пару способов это обойти, я доберусь и реализую один из них, вот тогда оно должно намного лучше работать.
Привет! Как когда ждать версию с NER?
Привет. Я могу уже сегодня выложить версию 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-версия слова).
Привет!
Пытаюсь прикрутить модель к 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
Посоветуйте в какую сторону копать?
@Ezhvsalate Хз, модель не нашлась у тебя почему-то... Или неправильно загрузилась... Попробуй отдельно сделать spacy.load на ту же модель, если ошибка та же -- то с моделью разбирайся/гугли ошибку, если ошибки нет -- то ищи разницу...
@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
Давайте-ка тогда сделаем ветку 2.1 базовой, раз 2.0 теперь даже не работает. А 2.0 поставим в бранч.
https://rasa.com/docs/ использует spacy, интересно, насколько просто прикручивается русская модель так, чтобы в Rasa пайплайн работал