НЛП І НАМІРНЕ ВИДАЛЕННЯ Liksi Blog
Опублікував Робін Леклерк | 16 липня 2018 р. | Назад | 0 |

Про це Філіпп сказав у своїй попередній статті, у Liksi ми любимо чат-боти. І навіть якщо нам подобається Dialogflow, ми говоримо собі, що наявність резервного рішення у разі зміни тарифу Google може бути корисним (див. Google Maps нещодавно). Однак це не лише питання ціноутворення. Як я вже згадував у статті про BreizhCamp 2018, іноді неможливо надати ваші дані сторонній службі, як Dialogflow. Отже, ми розглянули проекти, які дозволяють нам це зробити самі, і ми знайшли кілька рішень, наприклад Rasa з її рішенням rasa_nlu.
Мета цієї статті - представити, що таке механізм обробки природних мов (NLP), і пояснити частину того, як він працює, кодуючи текстовий екстрактор тем (або намір для чат-бота) у python. Частина коду буде наведена в статті. Весь код для розуміння основних кроків, не вдаючись до теоретичних деталей, доступний у репозиторії github статті .
Чат-бот (також званий розмовним агентом) дозволяє спілкуватися з користувачем. Наприклад, ми можемо попросити його про відсутність інформації про необхідність (назва піци, яку користувач хоче з’їсти), або просто виконати дії та відповісти користувачеві. Для роботи з цією чорною магією ви можете включити механізм NLP.
Двигун NLP має дві основні функції:
- Знайдіть дію/тему, пов’язану з реченням (намір англійською)
- Знайдіть параметри, що містяться в цьому реченні (суб’єктів англійською)
Загальна робота двигуна NLP
Rasa - це движок NLP, який дозволяє вам визначати конвеєри машинного навчання для досягнення цього. Нижче ми дамо огляд високого рівня різних компонентів ланцюга вилучення намірів, доступних у Rasa. Детальна їх оцінка неможлива у рішенні Rasa, таким чином, ми представимо метод, що дозволяє це зробити, взявши приклад класифікації частини корпусу з 20 груп новин. Тобто, знайти групу новин, пов’язану з текстом, серед категорій:
- sci.space
- наук.електроніка
- апаратне забезпечення comp.sys.mac.
- comp.windows.x
- rec.sport.baseball
- rec.sport.hockey
Ми будемо використовувати scikit-learn для отримання даних, пов’язаних із цими категоріями:
Алгоритми класифікації часто працюють однаково: ми ставимо a особливість вектор представляючи наші дані (наше речення у справі НЛП), і ми отримуємо в якості результату ймовірність належності цих даних до тієї чи іншої категорії (наміри, про які ми говорили раніше).
Щоб отримати хороші результати, вам слід подивитися, як побудувати ці вектори (крок характеристики на зображенні нижче). Два методи будуть представлені в решті статті (CountVectorizer або мішок слів і Word2Vec).
Намісний трубопровід видобутку
Векторизація речень
Першим кроком у методах векторизації, що використовуються в іншій частині статті, є створення словникового запасу із складу речень. Кожне слово, яке є принаймні n разів у документах, індексується.
Ви можете вирішити ігнорувати певні слова, такі як детермінанти, які не надто додають значення речення.
Крок векторизації/характеристики
Підготовка даних для навчання наших векторів може бути виконана наступним чином:
- xПовна призведе до конвеєру на основі CountVectorizer який прийме як вхідний набір речень
- xТокенізовано навчимо власну модель word2Vec
- xGloVe використовуватиме попередньо навчені вектори з spaCy (та Common Crawl)
Мішок слів
Рішення викликається Мішок слів, або CountVectorizer полягає у пов’язуванні з кожним реченням вектора розміру словникового запасу з кількістю випадків слова i в індексі i. До цього ми можемо застосувати перетворення, подібне до TF-IDF, щоб отримати кінцевий вектор, пов'язаний із реченням. Однією з проблем цього методу є проблема втрата інформації пов'язані з порядком появи слів, наприклад, 2 речення "Я б хотів піцу Маргарита" та "Піца хотіла б Я Маргарита" будуть представлені однаково.
Щоб подолати цю проблему, ми можемо використовувати послідовності з кількох слів, а не окремих слів, це називається N-грамами (уніграма або біграма на 1 і 2 слова). Тести проводились на наборі даних 20 груп новин, і різниця в балах (91% для послідовностей 1 слова проти 92% для послідовностей 2) не здається суттєвою. Насправді ми використовуємо CountVectorizer з бібліотеки scikit-learn, яка з’являється першою в конвеєрі scikit-learn
Word2Vec
Як пояснювалося раніше, рішення Мішок слів, зосереджуючись на зустрічанні слів без урахування їх середовища, здається, абстрагує частину інформації, що міститься у реченнях. Намагаючись побудувати більш відповідні вектори слів, Міколов та співавт. пропоную навчати нейронну мережу, що складається з вхідного рівня, прихованого рівня і вихідного рівня без функції активації. Це шаблон Word2Vec. Мета - навчити нейронну мережу одним із двох способів:
- SKIP-грамова модель: Мета мережі полягає в тому, щоб передбачити p (C (контекст) | m (слово) контекст, розглядаючи слово. Тобто сказати слова, що оточують слово, яке вважається вхідним у даному вікні. приймаються за лінії вагової матриці прихованого шару. Навчання проводитиметься шляхом мінімізації суми помилок щодо кожного слова вихідного контексту. (див. наступний малюнок, щоб зрозуміти на малюнку)
- Неперервна сумка шаблону слів (CBOW) Метою мережі є передбачення p (m (слово) | C (контекст)) слова з урахуванням конкретного контексту. Вектори слів будуть прийняті за рядки вагової матриці вихідного шару. Результат роботи прихованого шару буде прийнятий як середнє значення результатів для кожного слова в контексті. Навчання проводитиметься шляхом мінімізації помилки передбачення щодо слова, яке передбачається.
Отримані нейронні мережі не використовуються як такі, ми зацікавлені у відновленні ваг матриць, пов’язаних з різними шарами, для побудови векторів слів. Для того, щоб пояснити ідею цього вибору, ми представляємо модель SKIP-грам. У цьому прикладі ми беремо спрощення, розглядаючи словниковий запас лише з 8 слів і беручи розмір контексту в одне слово для вікна розміром 2 (якби в контексті було кілька слів, ми б усереднювали результат прихованого шару ).
Глобальна робоча схема моделі word2Vec SKIP-gramm