# Общие задачи и методы обработки естественного языка
Для большинства задач *обработки естественного языка* текст, который нужно обработать, должен быть разбит на части, проанализирован, а результаты сохранены или сопоставлены с правилами и наборами данных. Эти задачи позволяют программисту извлечь _смысл_, _намерение_ или просто _частотность_ терминов и слов в тексте.
## [Тест перед лекцией](https://ff-quizzes.netlify.app/en/ml/)
Давайте изучим общие методы обработки текста. В сочетании с машинным обучением эти методы помогают эффективно анализировать большие объемы текста. Однако, прежде чем применять машинное обучение к этим задачам, давайте разберемся с проблемами, с которыми сталкивается специалист по обработке естественного языка.
## Общие задачи обработки естественного языка
Существует множество способов анализа текста, с которым вы работаете. Есть задачи, которые вы можете выполнять, и благодаря этим задачам вы сможете понять текст и сделать выводы. Обычно эти задачи выполняются последовательно.
### Токенизация
Вероятно, первое, что делают большинство алгоритмов обработки естественного языка, — это разбивают текст на токены или слова. Хотя это звучит просто, необходимость учитывать пунктуацию и разделители слов и предложений в разных языках может усложнить задачу. Возможно, вам придется использовать различные методы для определения границ.

> Токенизация предложения из **Гордости и предубеждения**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
### Встраивание слов (Embeddings)
[Встраивание слов](https://wikipedia.org/wiki/Word_embedding) — это способ численного представления текстовых данных. Встраивание выполняется таким образом, чтобы слова с похожим значением или слова, которые часто используются вместе, группировались рядом.

> "Я испытываю величайшее уважение к вашим нервам, они мои старые друзья." - Встраивание слов для предложения из **Гордости и предубеждения**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
✅ Попробуйте [этот интересный инструмент](https://projector.tensorflow.org/) для экспериментов с встраиванием слов. Нажатие на одно слово показывает кластеры похожих слов: 'toy' группируется с 'disney', 'lego', 'playstation' и 'console'.
### Разбор и определение частей речи
Каждое токенизированное слово может быть помечено как часть речи — существительное, глагол или прилагательное. Например, предложение `the quick red fox jumped over the lazy brown dog` может быть размечено как fox = существительное, jumped = глагол.

> Разбор предложения из **Гордости и предубеждения**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
Разбор включает в себя определение, какие слова связаны друг с другом в предложении — например, `the quick red fox jumped` представляет собой последовательность прилагательное-существительное-глагол, которая отделена от последовательности `lazy brown dog`.
### Частотность слов и фраз
Полезной процедурой при анализе большого объема текста является создание словаря всех интересующих слов или фраз и подсчет частоты их появления. Например, в фразе `the quick red fox jumped over the lazy brown dog` слово "the" встречается дважды.
Рассмотрим пример текста, где подсчитывается частота слов. В стихотворении Редьярда Киплинга "The Winners" есть следующие строки:
```output
What the moral? Who rides may read.
When the night is thick and the tracks are blind
A friend at a pinch is a friend, indeed,
But a fool to wait for the laggard behind.
Down to Gehenna or up to the Throne,
He travels the fastest who travels alone.
```
Так как частотность фраз может быть чувствительной или нечувствительной к регистру, фраза `a friend` встречается 2 раза, `the` — 6 раз, а `travels` — 2 раза.
### N-граммы
Текст можно разбить на последовательности слов заданной длины: одно слово (униграммы), два слова (биграммы), три слова (триграммы) или любое количество слов (n-граммы).
Например, для текста `the quick red fox jumped over the lazy brown dog` с n-граммой длиной 2 получаются следующие n-граммы:
1. the quick
2. quick red
3. red fox
4. fox jumped
5. jumped over
6. over the
7. the lazy
8. lazy brown
9. brown dog
Это можно представить как скользящее окно по предложению. Вот пример для n-грамм из 3 слов, где n-грамма выделена жирным:
1. **the quick red** fox jumped over the lazy brown dog
2. the **quick red fox** jumped over the lazy brown dog
3. the quick **red fox jumped** over the lazy brown dog
4. the quick red **fox jumped over** the lazy brown dog
5. the quick red fox **jumped over the** lazy brown dog
6. the quick red fox jumped **over the lazy** brown dog
7. the quick red fox jumped over **the lazy brown** dog
8. the quick red fox jumped over the **lazy brown dog**

> Значение n-граммы = 3: Инфографика от [Jen Looper](https://twitter.com/jenlooper)
### Извлечение именных фраз
В большинстве предложений есть существительное, которое является субъектом или объектом предложения. В английском языке его часто можно определить по словам 'a', 'an' или 'the', которые ему предшествуют. Извлечение именной фразы — это распространенная задача в обработке естественного языка, когда нужно понять смысл предложения.
✅ В предложении "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun." можете ли вы определить именные фразы?
В предложении `the quick red fox jumped over the lazy brown dog` есть 2 именные фразы: **quick red fox** и **lazy brown dog**.
### Анализ тональности
Предложение или текст можно проанализировать на тональность, то есть насколько он *положительный* или *отрицательный*. Тональность измеряется по *полярности* и *объективности/субъективности*. Полярность измеряется от -1.0 до 1.0 (от отрицательной до положительной), а объективность — от 0.0 до 1.0 (от наиболее объективной до наиболее субъективной).
✅ Позже вы узнаете, что существуют разные способы определения тональности с использованием машинного обучения, но один из них — это использование списка слов и фраз, которые классифицированы как положительные или отрицательные экспертом, и применение этой модели к тексту для расчета полярности. Можете ли вы понять, как это может работать в одних случаях и не работать в других?
### Словоизменение (Inflection)
Словоизменение позволяет взять слово и получить его единственное или множественное число.
### Лемматизация
*Лемма* — это корень или основное слово для набора слов, например, *flew*, *flies*, *flying* имеют лемму глагола *fly*.
Также существуют полезные базы данных для исследователей обработки естественного языка, в частности:
### WordNet
[WordNet](https://wordnet.princeton.edu/) — это база данных слов, синонимов, антонимов и многих других деталей для каждого слова на разных языках. Она невероятно полезна при создании переводов, проверок орфографии или любых языковых инструментов.
## Библиотеки для обработки естественного языка
К счастью, вам не нужно разрабатывать все эти методы самостоятельно, так как существуют отличные библиотеки на Python, которые делают их более доступными для разработчиков, не специализирующихся на обработке естественного языка или машинном обучении. В следующих уроках будет больше примеров, но здесь вы узнаете несколько полезных примеров, которые помогут вам с выполнением следующей задачи.
### Упражнение — использование библиотеки `TextBlob`
Давайте воспользуемся библиотекой TextBlob, так как она содержит полезные API для решения подобных задач. TextBlob "основан на мощных библиотеках [NLTK](https://nltk.org) и [pattern](https://github.com/clips/pattern) и хорошо с ними взаимодействует". В его API встроено множество методов машинного обучения.
> Примечание: Рекомендуется ознакомиться с [руководством по быстрому старту](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) для TextBlob, особенно если вы опытный разработчик на Python.
При попытке определить *именные фразы* TextBlob предлагает несколько вариантов экстракторов для их поиска.
1. Ознакомьтесь с `ConllExtractor`.
```python
from textblob import TextBlob
from textblob.np_extractors import ConllExtractor
# import and create a Conll extractor to use later
extractor = ConllExtractor()
# later when you need a noun phrase extractor:
user_input = input("> ")
user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified
np = user_input_blob.noun_phrases
```
> Что здесь происходит? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) — это "Экстрактор именных фраз, использующий разбор на основе модели, обученной на корпусе ConLL-2000". ConLL-2000 относится к Конференции по вычислительному изучению естественного языка 2000 года. Ежегодно конференция проводила семинар для решения сложных задач обработки естественного языка, и в 2000 году это была задача выделения именных фраз. Модель была обучена на данных Wall Street Journal, с использованием "разделов 15-18 в качестве обучающих данных (211727 токенов) и раздела 20 в качестве тестовых данных (47377 токенов)". Вы можете ознакомиться с процедурами [здесь](https://www.clips.uantwerpen.be/conll2000/chunking/) и результатами [здесь](https://ifarm.nl/erikt/research/np-chunking.html).
### Задание — улучшение вашего бота с помощью обработки естественного языка
В предыдущем уроке вы создали очень простого бота для вопросов и ответов. Теперь вы сделаете Марвина немного более чутким, анализируя ваш ввод на тональность и выводя ответ, соответствующий тональности. Вам также нужно будет определить `noun_phrase` и задать вопрос об этом.
Ваши шаги при создании более продвинутого бота:
1. Выведите инструкции, объясняющие пользователю, как взаимодействовать с ботом.
2. Начните цикл:
1. Примите ввод пользователя.
2. Если пользователь попросил выйти, завершите работу.
3. Обработайте ввод пользователя и определите соответствующий ответ на основе тональности.
4. Если в тексте обнаружена именная фраза, преобразуйте ее во множественное число и задайте дополнительный вопрос на эту тему.
5. Выведите ответ.
3. Вернитесь к шагу 2.
Вот фрагмент кода для определения тональности с использованием TextBlob. Обратите внимание, что здесь всего четыре *градации* ответа на тональность (вы можете добавить больше, если хотите):
```python
if user_input_blob.polarity <= -0.5:
response = "Oh dear, that sounds bad. "
elif user_input_blob.polarity <= 0:
response = "Hmm, that's not great. "
elif user_input_blob.polarity <= 0.5:
response = "Well, that sounds positive. "
elif user_input_blob.polarity <= 1:
response = "Wow, that sounds great. "
```
Пример вывода для ориентира (ввод пользователя отмечен символом >):
```output
Hello, I am Marvin, the friendly robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am ok
Well, that sounds positive. Can you tell me more?
> I went for a walk and saw a lovely cat
Well, that sounds positive. Can you tell me more about lovely cats?
> cats are the best. But I also have a cool dog
Wow, that sounds great. Can you tell me more about cool dogs?
> I have an old hounddog but he is sick
Hmm, that's not great. Can you tell me more about old hounddogs?
> bye
It was nice talking to you, goodbye!
```
Одно из возможных решений задачи можно найти [здесь](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py).
✅ Проверка знаний
1. Думаете ли вы, что чуткие ответы могут "обмануть" кого-то, заставив поверить, что бот действительно их понимает?
2. Делает ли определение именной фразы бота более "убедительным"?
3. Почему выделение "именной фразы" из предложения может быть полезным?
---
Реализуйте бота из проверки знаний и протестируйте его на друге. Может ли он их обмануть? Можете ли вы сделать своего бота более "убедительным"?
## 🚀Задание
Возьмите задачу из проверки знаний и попробуйте ее реализовать. Протестируйте бота на друге. Может ли он их обмануть? Можете ли вы сделать своего бота более "убедительным"?
## [Тест после лекции](https://ff-quizzes.netlify.app/en/ml/)
## Обзор и самостоятельное изучение
В следующих уроках вы узнаете больше об анализе тональности. Изучите эту интересную технику в таких статьях, как на [KDNuggets](https://www.kdnuggets.com/tag/nlp).
## Задание
[Сделайте бота, который отвечает](assignment.md)
---
**Отказ от ответственности**:
Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.