Перепечатано с общедоступного номера: Ван Эргу
См. код: [читать исходный текст]
Системы понимания естественного языка (NLU) являются краеугольным камнем более продвинутых приложений, таких как системы ответов на вопросы, чат-боты и многое другое. Базовые инструменты NLU, включая две задачи: распознавание объектов и распознавание намерений.
Большинство существующих инструментов NLU выполняют две вышеупомянутые задачи, вызывая Restful API удаленного http для анализа целевого оператора. К таким инструментам относятся Google API.ai, Microsoft Luis.ai, Facebook Wit.ai и т. д. Kitt.ai, который только что был приобретен Baidu, в дополнение к пробуждению голоса, которое показал Baidu, на самом деле имеет большую часть своей работы над NLU, Их очень вдохновляющий Chatflow включает в себя собственный движок NLU.
(Другими словами, доменное имя .ai сейчас очень дорого... На самом деле, это национальное доменное имя Ангильи, настолько популярен этот маленький остров...)
Вышеупомянутые инструменты, предоставляя пользователям услуги NLU, также постоянно обучают и улучшают свои собственные модели с помощью большого количества размеченных и неразмеченных данных, загружаемых самими пользователями. А для пользователей, чувствительных к данным, инструменты NLU с открытым исходным кодом, такие как Rasa.ai, открывают для нас еще один путь. Что еще более важно, такие инструменты с открытым исходным кодом можно развертывать локально, а модель можно обучать и настраивать в соответствии с реальными потребностями.Говорят, что эффект в некоторых конкретных областях намного лучше, чем у общих онлайн-сервисов NLU.
Здесь мы кратко расскажем об использовании Rasa NLU для создания локализованной доменной китайской системы NLU.
Сам Rasa NLU поддерживает только английский и немецкий языки. Из-за своей специфики китайскому языку необходимо добавить определенный токенизатор как часть всего конвейера. Я добавил jieba в качестве нашего китайского токенизатора, код версии rasa NLU для китайского языка находится на github.
Сбор и предварительная обработка корпуса
Для задач распознавания объектов и намерений Rasa NLU требуется обученная модель MITIE. Эта модель MITIE получается путем неконтролируемого обучения, аналогичного встраиванию слов в word2vec.
Для обучения этой модели MITIE нам нужен относительно большой китайский корпус. Лучше всего использовать корпус, который соответствует вашим потребностям. Например, если вы финансовый чат-бот, вы можете просматривать больше финансовых новостей, а если вы медицинский чат-бот, вы можете получать больше статей, связанных с медициной.
Я использую дамп китайской википедии и корпус Baidu Baike, перечисленные в awesome-chinese-nlp. Для обработки дампа википедии вы можете обратиться к этому сообщению.
Просто получить корпус недостаточно, потому что ввод для обучения модели MITIE основан на словах. Итак, нам нужно сначала исполнить причастие, мы используем причастие заикания.
Установите причастие заикания:
$ pip install jieba
скопировать код
Токенизировать файл корпуса с пробелами в качестве разделителей:
$ python -m jieba -d " " ./test > ./test_cut
скопировать код
Обучение модели MITIE
Мы помещаем все файлы корпуса, сегментированные по словам, в один и тот же путь к файлу. Далее мы хотим обучить модель MITIE.
Первый клон MITIE:
$ git clone https://github.com/mit-nlp/MITIE.git
скопировать код
Все, что мы хотим использовать, — это MITIE, инструмент под названием wordrep. Сначала построим.
$ cd MITIE/tools/wordrep
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
скопировать код
Затем обучите модель, чтобы получить total_word_feature_extractor.dat. Обратите внимание, что этот этап обучения потребует десятков ГБ памяти и займет от двух до трех дней. . .
$ ./wordrep -e /path/to/your/folder_of_cutted_text_files
скопировать код
Я создал файл total_word_feature_extractor_chi.dat, используя китайскую википедию и корпус Baidu Baike, и делюсь им следующим образом.
链接:http://pan.baidu.com/s/1micEF0G 密码:opli
скопировать код
Для некоторых общих сценариев использования NLU этого должно быть достаточно.
Построить корпус и модель rasa_nlu
-
Клонируем rasa_nlu_chi и устанавливаем:
$ git clone https://github.com/crownpku/rasa_nlu_chi.git
$ cd rasa_nlu_chi
$ python setup.py install
скопировать код
-
Создайте как можно больше примеров данных для обучения распознаванию намерений и распознаванию сущностей:
data/examples/rasa/demo-rasa_zh.json
Формат json, пример такой. «Начало» и «Конец» — это начальный и конечный индексы объекта, соответствующего «тексту».
{
"text": "找个吃拉面的店",
"intent": "restaurant_search",
"entities": [
{
"start": 3,
"end": 5,
"value": "拉面",
"entity": "food"
}
]
},
{
"text": "这附近哪里有吃麻辣烫的地方",
"intent": "restaurant_search",
"entities": [
{
"start": 7,
"end": 10,
"value": "麻辣烫",
"entity": "food"
}
]
},
{
"text": "附近有什么好吃的地方吗",
"intent": "restaurant_search",
"entities": []
},
{
"text": "肚子饿了,推荐一家吃放的地儿呗",
"intent": "restaurant_search",
"entities": []
}
скопировать код
Здесь есть небольшой баг, то есть сущность должна быть ровно одним из слов после сегментации текста jieba. Если результат причастия jieba не соответствует заданному слову, будет сообщено об ошибке. Поэтому при написании этого примера данных вы должны обратиться к результатам сегментации слов jieba для написания текста.
-
Изменить параметры конвейера
Для китайского языка у нас теперь есть два пайплайна:
Использование MITIE+Jieba:
["nlp_mitie", "tokenizer_jieba", "ner_mitie", "ner_synonyms", "intent_classifier_mitie"]
Таким образом, обучение проходит медленно, эффект не очень хороший, а итоговое намерение не сортируется по баллам.
Мы рекомендуем использовать следующий конвейер:
MITIE+Jieba+sklearn (config_jieba_mitie_sklearn.json):
["nlp_mitie", "tokenizer_jieba", "ner_mitie", "ner_synonyms", "intent_featurizer_mitie", "intent_classifier_sklearn"]
Рабочий процесс Rasa NLU также можно увидеть здесь. «nlp_mitie» инициализирует MITIE, «tokenizer_jieba» использует jieba для сегментации слов, «ner_mitie» и «ner_synonyms» выполняют распознавание сущностей, «intent_featurizer_mitie» извлекает функции для распознавания намерений, а «intent_classifier_sklearn» использует sklearn для классификации распознавания намерений.
-
Обучите модель для Rasa NLU
$ python -m rasa_nlu.train -c config_jieba_mitie_sklearn.json
скопировать код
Это создаст файл типа model_20170714-195758 в папке /models.
Создайте локальный сервис rasa_nlu
-
Запустите фоновую службу rasa_nlu:
$ python -m rasa_nlu.server -c config_jieba_mitie_sklearn.json --server_model_dirs=./your_model_name
скопировать код
-
Откройте новый терминал, теперь мы можем использовать команду curl для получения результатов, например:
$ curl -XPOST localhost:5000/parse -d '{"q":"我发烧了该吃什么药?"}' | python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 364 100 326 100 38 98519 11483 --:--:-- --:--:-- --:--:-- 106k
{
"entities": [
{
"end": 3,
"entity": "disease",
"extractor": "ner_jieba_mitie",
"start": 1,
"value": "\u53d1\u70e7"
}
],
"intent": {
"confidence": 0.82073156639321614,
"name": "medical"
},
"text": "\u6211\u53d1\u70e7\u4e86\u8be5\u5403\u4ec0\u4e48\u836f\uff1f"
}
скопировать код
Пользовательский интерфейс Раса
Как вы можете видеть выше, этот метод фоновой службы и внешнего завитка может фактически заменить большое количество облачных служб NLU, упомянутых ранее.
Восторженный фронтенд Даниэль также создал пользовательский интерфейс Rasa, чтобы предоставить интерфейс Rasa. Теоретически добавление упомянутых выше примеров данных, обучение модели, мониторинг сервиса и т. д. превращаются в красивый веб-интерфейс. Просто разработка еще очень несовершенна, и большая часть функций не добавлена.
Заинтересованные друзья могут клонировать и установить его, чтобы попробовать. Эффект следующий: