Мне давно хотелось написать свою статью о технологии iKnow. Прошло уже три года с момента её появления, но публикаций о применениях этой технологии в русскоязычных решениях до сих пор не было. Объяснение этому довольно простое – не было полноценной поддержки русского языка. Но с каждым новым релизом, начиная с Cache 2013.1, ситуация менялась в лучшую сторону. И вот, наконец, мы решили реализовать первый проект на iKnow. О том, как это было, что получилось, а что нет, читайте далее в моей статье.
Итак, как я уже сказал, до сего момента не было применений и реальных русскоязычных решений, созданных с помощью iKnow, хотя поддержка семантической модели для русского языка впервые появилась в версии 2013.1. В какой-то момент стало понятно, что то, что работает для латинских языков, не подходит для русского (как и для всех славянских языков). И виной тому многообразие форм, которые может принимать одно слово. Когда iKnow анализирует текст, то ведется подсчет концептов (тут можно считать, что концепт это существительное), а концепты «яблоко», «яблок» и «яблоками» это совершенно разные термины и подсчитываются они раздельно. По этому, например, рецепт приготовления шарлотки, iKnow вполне сможет понять как статью об обслуживании электродуховок, ведь термин «духовку» (включите «духовку», откройте «духовку», выключите «духовку» и т.д.) будет встречаться в тексте чаще, чем формы слова «яблоко» по-отдельности. В этом и заключалась сложность. И справиться с ней помогло использование лемматизации – инструмента приведения к нормальной форме слова.
И вот, в Cache 2015.1 FieldTest появилась поддержка лемматизации, реализованная с использованием библиотеки Hunspell. А это значит, появилась возможность создавать полноценные приложения для анализа данных из текстов на русском и украинском языке. И мне сразу захотелось сделать что-нибудь такое, что стало бы отличным практическим примером использования iKnow и при этом не бесполезным аналогом «Hello world». И такая задача нашлась!
Нам была предоставлена база из 27000 отзывов по 100 наиболее популярным отелям Турции и Египта. Сразу определился и круг первоочередных задач, которые предстояло решить. Впрочем, расскажу обо всем по порядку.
Что такое туристический отзыв. Это, прежде всего, неструктурированные данные или текст (понятие «неструктурированный текст», которое многие любят употреблять, мне видится бессмысленным). Люди, вернувшись с отдыха (мы рассматривали пляжный отдых), заходят на портал, ставят оценки отелю, в котором они жили, или категориям этого отеля, например сервису, питанию, гостеприимству и т.д. Затем описывают отдых своими словами, отмечают, что было хорошо, а что плохо. Числовые оценки отдыха (например, по пятибалльной шкале) являются метаданными, которые администрация портала без проблем может использовать для расчета рейтингов отелей. Но, зачастую, люди просто пишут текст, и забывают поставить оценку. Таких случаев довольно много – в нашем проекте более половины отзывов содержат только текст, без численных оценок. Получается, что для рейтингования такой отзыв бесполезен. Вот и первая задача, которую предстояло решить – научить iKnow рассчитывать оценку отеля исключительно по тексту отзыва.
Остальные задачи также были сформулированы довольно быстро:
- рассчитывать оценку отдельных категорий отеля (комфорт, сервис, питание, гостеприимство, территория, месторасположение);
- оценить насколько соответствует это расчет тем оценкам, которые авторы отзывов ставили сами;
- синтезировать итоговую фразу об отдыхе в отеле (например «Из 653 отдыхавших в отеле, 278 человек (43%) отмечают вежливость и приветливость персонала, 220 отдыхающим (34%) понравилась еда в ресторанах, а 76 гостей (12%) хотели бы еще раз здесь отдохнуть»);
- научиться определять наиболее полезные отзывы, чтобы в первую очередь предлагать их посетителям портала;
- найти подозрительные и заказные отзывы, которые пишутся за пряники в рекламных целях, и зачастую, имеют мало общего с печальной реальностью;
Были и другие задачи, но остановлюсь на описании того, как я решал перечисленные.
Теперь мне необходимо объяснить, что такое iKnow и чего можно от него добиться без существенных усилий. iKnow – это технология, которая позволяет анализировать тексты. iKnow API – набор функций для работы с неструктурированными данными. Существует также GUI, позволяющий визуализировать результаты индексирования текстов и извлекать полезную информацию из данных. Когда мы загружаем что-то в iKnow, то на выходе имеем тот же текст, но поделенный на концепты и связи между ними. Концепты в предложениях, как правило, представляют собой подлежащее и дополнения. Связями между концептами в большинстве случаев выступают глаголы, глагольные формы или предлоги. Кроме того iKnow может бережно подсчитать сколько раз в туристическом отзыве упоминается термин «отель», «море», «пляж» или «пищевое отравление».
Пример разбиения предложения на концепты и отношения. Жёлтым выделены концепты, подчеркнуты — отношения, серым отмечены незначащие слова.
Что еще мы можем получить из текста, зависит в основном от нашей фантазии, и еще немного – от разнообразия iKnow API.
Как можно поставить оценку отелю по тексту отзыва? Ниже изложен один из подходов для расчета числовой характеристики по тексту.
Первое что нужно сделать – разбить весь текст на части. iKnow API позволяет производить разбиение на предложения или на пути. С предложениями все просто, это часть текста, ограниченная точками, вопросительным или восклицательным знаками, а также точкой с запятой. Путь – это часть предложения, в которой приведены взаимосвязанные концепты. На практике, в большинстве случаев, пути и предложения совпадают. И только сложносочиненные или сложноподчиненные предложения состоят из нескольких путей.
В номере обнаружили обещанных в отзывах муравьев, позвонили на рецепцию и сообщили им о нашей проблеме
Все вместе это предложение, а по частям – пути.
Мы делили текст на предложения.
Вторая задача – понять о чём говориться в предложении. Иными словами, нам требуется определить о какой категории отеля идет речь в данном предложении. Для этого понадобятся словари так называемых функциональных маркеров. Например, если в предложении есть термин «ресторан», «сок», «чай», то речь идет о категории «питание», а сами термины включаем в словарь маркеров для этой категории.
Из напитков в ресторане и барах порошковые соки, газированные напитки, чай, растворимый кофе, вино и пиво, крепкий алкоголь в барах.
Наш словарь функциональных маркеров содержал около 300 терминов, характерных для 6 оцениваемых категорий отеля. И вот, что важно – если бы не было лемматизации, то для правильной работы системы пришлось бы прописывать в словарь все формы этих 300 слов. Да, поначалу это не является непосильной задачей. Но если словарь будет расти?
На первом этапе словари маркеров формировались вручную. В них вносились термины, которые встречались при вычитке первых 200 отзывов. На втором этапе словарь расширялся автоматически с помощью алгоритма обучения словарей, построенного с помощью возможностей iKnow. В результате объем словаря увеличивался в среднем на порядок.
Хорошо, теперь мы знаем, о чем говорится в предложении. Осталось понять, понравилось ли это автору отзыва или нет. Иными словами требуется определить эмоциональный окрас предложения. Для этого был сформирован словарь эмоциональных маркеров. Как правило, в русском языке эмоциональная окраска задается прилагательными (вкусный кофе, удобный вход в море и т.д.). Также мы можем учитывать и существительные, имеющие явную окраску (грязь, массовое отравление алкоголем, радость).
А теперь начинается та самая «магия», когда из текста формируются численные оценки, графики и таблицы. Мы можем посчитать количество позитивных и негативных терминов, применительно к категориям отеля по каждому отдельному отзыву, а затем определить долю позитива. Для расчета я использовал такую формулу:
Оценка= N_позитива/(N_позитива+N_негатива )
Получится некоторое число от 0 до 1. Причем, чем лучше отель, тем ближе это значение к 1. Если умножить это число на некоторый коэффициент, например 5, то можно получить оценку отеля по пятибалльной шкале, что и было сделано.
Следующая задача – убедиться в том, что все это имеет смысл. Это был, пожалуй, ключевой момент в работе. Чтобы понять, насколько оценки, рассчитанные с помощью iKnow кореллируют с авторскими оценками, мы построили график, куда вошли все оцениваемые нами отели.
Рисунок 1. Корелляция авторских и рассчитанных оценок.
Синим цветом здесь указаны средние значения авторских оценок отелей, а зеленым рассчитанные iKnow. Как видно, корелляция явно присутствует. И хотя окончательные выводы делать рано, уже понятно, что такой подход работает и его можно развивать дальше. Разумеется, подобный алгоритм количественной оценки отелей и их параметров работает при статистически большом количестве отзывов: в нашем случае оценки формировались при количестве отзывов не менее 20 по каждому отелю. Кстати, хочется отметить, что для построения аналитики я использовал другую технологию Intersystems – DeepSee.
Следующие задачи, которые предстояло решить – поиск полезных и заказных отзывов. Тут все довольно просто, надо только сформулировать соответствующие критерии. Вот, к примеру, критерии полезности отзыва:
- в отзыве описывается максимальное количество категорий отеля. То есть здесь можно почитать об уровне сервиса, удобстве номера, качестве еды и т.д.
- отзыв должен быть сбалансирован эмоционально. Не должно быть только голой критики или только восхищенного описания. Как правило, людям одни вещи нравятся, а другими они остаются недовольны. То есть в отзыве должны присутствовать как положительные, так и отрицательные эмоциональные маркеры.
- оценка отеля, рассчитанная по такому отзыву, должна быть близка к средней оценке.
Аналогичные критерии были сформулированы и для оценки подозрительности отзывов. Хочется отметить, что однозначно утверждать, что отзыв заказной было бы слишком самонадеянно для iKnow, но назвать отзыв подозрительным и обратить на него внимание администратора туристического портала, вполне по силам.
Отдельно хочется сказать о DeepSee, который поддерживает возможность использования измерений и метрик на данных из iKnow. Есть очень много интересных, а главное полезных сведений для туристов, которые можно получить из отзывов помимо статических оценок. С помощью анализатора обнаружилось, что оценки меняются в зависимости от месяца, от года к году. И все это наглядно видно на графиках DeepSee.
Рисунок 2. Изменение оценки отеля по месяцам
Попробую подвести итоги проделанной работы. У нас получилось реализовать первый осмысленный проект на iKnow на русском языке. При достаточной фантазии и богатстве iKnow API можно строить довольно сложные решения. В дальнейшем мы планируем развить анализатор отзывов по отелям, в универсальный инструмент, ведь на просторах интернета отзывов полным-полно: о фильмах, автомобилях, телефонах и т.д.
Но будет неправильно рассказывать только о достоинствах, не упомянув о проблемах, с которыми пришлось столкнуться. Таких проблем две:
- обработка отрицательных предложений;
- несовершенство лемматизации.
Обработка отрицательных предложений впервые появилась в iKnow в версии 2014.1. Но использование её в анализаторе отзывов является весьма проблематично. Как, например, системе оценить такую фразу:
Не могу сказать что пляж нам не понравился.
или
Итог, наш лично отдых, прошёл ХОРОШО, но в этот отель я бы больше никогда не поехала!
iKnow умеет находить наличие отрицания в предложении, однако с уверенностью определять, что именно отрицается затруднительно. Особенно эта проблема характерна для русского языка, где нет жесткого установленного порядка слов в предложении. Как поступать с такими предложениями, решать вам, варианты такие: переворачивать оценку эмоциональных маркеров (домножать на -1), игнорировать такие предложения совсем, или оставлять все как есть. В любом случае это приведет либо к потере информации, либо к потере точности анализа отдельных предложений. И совсем не понятно, как анализировать сарказм.
Есть еще проблема с лемматизацией. Она есть и работает, но иногда выдает совершенно чудесные вещи. Например, предложный падеж от существительного отель – «об отеле», приводится к животноводческому термину «отёл», а «зеленая дикая слива» преобразуется в сантехнический «зеленый дикий слив».
Однако, думаю, нам следует быть оптимистами и верить, что со временем эти проблемы будут решены. Работа по совершенствованию iKnow продолжается.
В этой статье нет технических деталей и подробностей. О них и о том, как создавать собственные iKnow-приложения, я с удовольствием расскажу в продолжении.
Автор: ViArt