Pull to refresh

Понимание компьютером текста: действительно ли всё так плохо?

Artificial Intelligence
Sandbox
Совсем недавно на Хабре появился пост, в котором автор уверенно заявляет о том, что компьютер никогда не сможет понимать текст так, как его понимает человек. В доказательство он приводит ряд непосильных для машины задач, делая упор на отсутствие эффективных алгоритмов и невозможность моделирования полноценной системы, в которой были бы учтены все возможные варианты построения текста. Однако действительно ли всё так плохо? Правда ли, что для решения подобных задач нужны невероятные вычислительные мощности? И в каком вообще состоянии находится область обработки текстов на естественных языках?

А что вообще значит «понимать»?


Первое, что меня смутило, — это сам вопрос — сможет ли компьютер когда-нибудь понимать текст так, как его понимает человек. А что, собственно, значит «понимать как человек»? Или даже не так, что вообще значит «понимать»? В книге Data Mining: Practical Machine Learning Tools and Techniques авторы задаются схожим вопросом — что значит «быть обученным». Допустим, что мы применили к «интерпретатору» некоторую технику обучения. Как проверить, обучился он или нет? Если студент ходил на все лекции по предмету, это ещё не значит, что он его выучил и понял. Чтобы проверить это, вводят экзамены, где студента просят решить некоторые задачи по теме предмета. То же самое и с компьютером — узнать обучился ли он (понял ли он текст) можно только проверив, как он решает конкретные прикладные задачи — переводит текст, выделяет факты, выдаёт конкретное значение многозначного слова и т.д. В таком ракурсе понятие смысла вообще теряет первостепенное значение — смыслом можно считать просто какое-то состояние интерпретатора, в соответствии с которым он обрабатывает текст.

Многозначные слова


Далее автор оригинальной статьи приводит пример перевода предложения «Первым Николай распечатал письмо от Сони», указывая на несколько возможных вариантов перевода слова «распечатал» с совершенно разными значениями. Человек может легко понять, о чём идёт речь, но может ли машина?
Для того, чтобы ответить на этот вопрос, рассмотрим, как сам человек принимает решение о том, в каком смысле употреблено данное слово. Думаю, все согласятся, что в первую очередь при решении такого рода задач ориентируемся на контекст. Контекст может быть представлен явно — в виде предложений, обрамляющих данное, либо неявно — в виде совокупности знаний о данном предложении (в нашем случае — знание о том, что предложение взято из романа «Война и Мир», знание о времени, когда происходит сюжет, и знание о состоянии прогресса на тот момент).

Для начала рассмотрим первый вариант — использование контекстных предложений. Предположим, что у нас есть две пары предложений: «Первым Николай распечатал письмо от Сони. При свете лучины читать его было сложно» и «Первым Николай распечатал письмо от Сони. Принтер барахлил, поэтому местами были понятны не все символы». Во втором предложении каждой пары присутствуют ключевые слова, которые позволяют нам однозначно идентифицировать смысл слова «распечатал» в предыдущем предложени — в первом случае это «лучина», во втором — «принтер». Вопрос: что мешает компьютеру проделать тот же манёвр, чтобы узнать настоящий смысл слова под вопросом? Да ничего. На самом деле системы по определению значения слова уже давно используются на практике. Так, например, индекс tf-idf широко используется в поисковых движках при вычислении релевантности. Как правило, собирается информация о совместной встречаемости слов («распечатывать» и «лучина», «распечатывать» и «принтер») и на её основе выбирается более релевантный документ или более точный вариант перевода слова.

С неявным контекстом, то есть с набором знаний о обстоятельствах, всё несколько сложней. Простым сбором статистики тут не обойдёшься — нужны именно знания. А что вообще такое знания, как их можно представить? Одним из способов представления являются онтологии. В простейшем случае онтология — это набор фактов вида <Subject, Predicate, Object>, например, <Николай, является, Человек>. Построение самих онтологий даже для конкретной предметной области — это дело, мягко говоря, немаленькое. Немаленькое, но не невыполнимое. Есть ряд инициатив, таких как Linked Data, в рамках которых люди собирают с миру по нитке и строят паутину взаимосвязанных понятий. Более того, существует ряд вполне успешных наработок по автоматическому извлечению фактов из текста. Т.е. из предложения «Первым Николай распечатал письмо от Сони» можно автоматически вывести факты <Николай, распечатал, письмо>, <Письмо, от, Сони> и т.д. В качестве open-source примера таких разработок может служить Stanford Parser, который довольно неплохо понимает структуру предложения на английском языке. А некоторые компании, такие как InventionMachine (ссылку вставлять не буду, ибо и так реклама) вообще строят свой бизнес на системах извлечения фактов.
Однако я отвлёкся. Итак, будем считать, что у нас уже есть более или менее полная онтология для нашей предметной области. Для простоты также предположим, что собрана она людьми, поэтому слово «распечатать» в ней представлено несколько раз — по одному разу на каждый смысл этого слова. В смысле «открыть» это слово может образовывать факты <[Кто-то], распечатал, посылку>. В смысле «пустить на печать» оно может быть использовано в фактах <распечатать, на чём, принтер>. Наконец, предположим, что в нашей онтологии уже присутствуют знания об обстоятельствах. В таком случае задача определения правильного смысла слова сводится к отображению всех фактов предлжения на онтологию для всех возможных значений слова «распечатать» и выбору того значения, в окружении которого больше всего известных фактов (как фактов об обстоятельствах, так и фактов, извлечённых непосредственно из предложений).

Перед тем, как идти дальше, сделаю несколько выводов:

1. Статистика является мощным инструментом анализа текста.
2. Извлечение знаний (фактов) из текста является реальностью.
3. Создание базы знаний о предметной области является сложной, но выполнимой задачей.

Другие задачи


Далее автор статьи приводит, на мой взгляд довольно сумбурно, ряд конкретных задач, которые компьютеру якобы абсолютно неподвластны. Спорить не буду, некоторые задачи действительно довольно сложны. Сложны, но не неподвластны. Ниже в произвольном порядке будут приведены упомянутые задачи с возможными вариантами их решения, но сначала ещё несколько слов о самой дисциплине обработки естественных языков (natural language processing).

С точки зрения NLP, текст представляет из себя набор признаков. Этими признаками могут быть слова (корни и формы слов, падеж, регистр букв, часть речи), знаки препинания (особенно те, что ставятся в конце), смайлы, предложения целиком. На основании этих признаков могут строиться и более сложные — n-граммы (последовательности слов), оценочные группы (appraisal groups, те же последовательсности, но с указанием оценки, например, «very good»), слова из заданных словарей. И даже более сложные — аллитерация, антонимия и синонимия, омофоны и т.д. Всё это может быть использовано против вас в суде в качестве индикаторов при решении тех или иных задач обработки текста.

Итак, сами задачи.

Определение настроения текста

Вообще автор предложил не совсем понятное деление — текст весёлый и текст грустный. В голову приходят три варианта классификации:

1. Текст оптимистический/пессимистический.
2. Положительный/отрицательный (например, отзыв).
3. Юмористический/серьёзный.

Так или иначе, это задача классификации, а значит для неё могут быть использованы стандартные алгоритмы, такие как Naïve Bayes или SVM. Вопрос только в том, какие именно признаки брать из текста, чтобы добиться максимальных результатов классификации.
Классификацией текста на оптимистический и пессимистический никогда не занимался, но бьюсь об заклад, что в качестве признаков достаточно использовать корни всех слов. Результаты можно ещё улучшить, если составить словари для каждого из классов. Например, в «пессимистический» словарь могут войти такие слова как «грустно», «одиночество», «печалька» и т.д., а в «оптимистический» — «круто», «йоу», «весело».
Классификация отзывов и прочего user generated content, показывающего отношение говорящего к некоторому объекту (к новой фотокамере, к действиям правительства, к компании Microsoft) в последнее время получила настолько широкое распространение, что даже была выделена в отдельную область — извлечение мнений (opinion mining, a.k.a. sentiment analysis) ([1], [2]). Есть много подходов к извлечению мнений. Для текстов, состоящих хотя бы из 5-6 предложений хорошо себя показали оценочные группы [3] (с результатом до 90.2% правильно определённых мнений). Для более мелких текстов (например, твитов) приходиться использовать другие признаки — слова из предопределённых словарей, регистр букв, смайлы и т.д.
Задача определения юмористического текста не так популярна, но и по ней существуют определённые наработки ([4]). Как правило, для определения юмора используется антонимия, аллитерация, а также «взрослый сленг».
Стоит также заметить, что не только юмор, но и сарказм с иронией компьютер также уже умеет вполне успешно распознавать. Ну, в любом случае лучше, чем Шелдон Купер.

Идеология автора

А также его компетентность, подход к работе, отношения к семье и скрытые комплексы. Всё, что отражено в тексте, может быть найдено. Даже то, что не видит среднестатистический человек. Достаточно выделить подходящие признаки и правильно обучить классификатор. Да, возможно, результаты будут не очень точны, но, например, Википедия вообще утверждает, что и среди людей подобные вещи способны правильно определить лишь 70%, а 70% — это ниже среднего для таких классификаторов.

Метафоры, поговорки и умолчания

Все эти задачи требуют дополнительной информации. Если у вас есть готовая онтология для предметной области, найти объекты со схожими свойствами не составит труда — для этого вводится некая мера близости, расчитываемая на основании статистических данных, и ищется наиболее «релевантный» объект.

Автоматический перевод

Как я уже указал выше, проблема с определением конкретного значения многозначного слова при автоматическом переводе может быть решена с помощью статистического анализа. Поэтому единственной реальной проблемой становится генерация грамотно сформированного текста. Здесь есть две подзадачи:

1. Правильное определение связей между словами.
2. Правильное отображение найденных конструкций в новом языке.

Задача определения связей между словами по сути является всё той же задачей классификации, где классами являются все возможные отношения между словами. Такие библиотеки как Stanford Parser используют вероятностные классификаторы и теорию нечётких множеств, чтобы определить наиболее «правильный» вариант связей между словами.

А вот с отображением найденных конструкций в новый язык действительно существуют проблемы. Но проблемы эти в большей степени не компьютерного, а как раз переводческого характера. Профессиональные переводчики никогда не указывают языки, которые знают — вместо этого они указывают направления перевода. Например, переводчик может уметь переводить с итальянского на русский, но не с русского на итальянский. То есть, конечно, кое-как сделать обратный перевод они смогут, но далеко неидеально. Проблема состоит как раз в отображении конструкций одного языка в другой, в котором прямого аналога может тупо не быть. Что делать в таком случае — непонятно. Поэтому не только компьютерная, но и обычная теоретическая лингвистика продолжает развиваться, выводя всё новые и новые правила. В то же время с точки зрения компьютерной реализации нет ничего сложного в том, чтобы заложить созданные правила в программу автоматического перевода.

Большая проблема


Итак, компьютеры уже умеют выделять факты из текста, понимать настроение автора, распознавать сарказм и многое другое. Так в чём же проблема, почему до сих пор не существует универсальной «читалки», которая могла бы взять текст и решить все задачи, которые может выполнить человек? За несколько лет практики в NLP я пришёл к выводу, что системы интеллектуальной обработки текста сложно комбинировать. Создание систем из нескольких компонент не только вызывает комбинаторных рост связей между ними, но и требует учёта всех зависимостей вместе с их вероятностными показателями. Например, для извлечения мнений можно использовать машинное обучение или созданные вручную правила. Однако если совместить оба этих подхода, встаёт вопрос о том, в какой степени каждый из них должен влиять на результат: от чего это будет зависеть, какова природа этих зависимостей, как вычислить численные параметры и т.д. Область обработки естественных языков всё ещё находится в своём подростковом возрасте, поэтому пока человечество способно создавать только системы для решения локальных задач. Что получится, когда все локальные задачи будут решены, и хватит ли у человека способностей (памяти, скокрости мышления), чтобы скомбинировать всё наработанное, предсказать сложно.

Ссылки на ресурсы


[1] Bo Pang, Lillian Lee. Opinion Mining and Sentiment Analysis
[2] Bing Liu. Opinion Mining
[3] Casey Whitelaw. Using Appraisal Groups for Sentiment Analysis
[4] Rada Mihalcea. Making Computers Lough: Investigations in Automatic Humor Recognition
Tags:искусственный интеллектобработка естественных языков
Hubs: Artificial Intelligence
Total votes 88: ↑83 and ↓5+78
Views6.7K