Как построить семантическую сеть в ворде
Признаюсь сразу это д/з такое в универе. Но я задался этим вопросом более серьёзно, чем от нас требуют. Среди однокурсников полное недопонимание чего от нас хотят, и сдают они измененные копии одной работы.
Суть вопроса - построить простую семантическую сеть из нескольких элементов и написать прогу, которая путем опроса приведёт тебя к определенному ответу. При этом все данные необходимо где-то хранить так, чтобы можно было изменить их не трогая код самой программы.
Очень странными для меня было недоумение преподавателя от моего вопроса "можно ли данные хранить в БД?", на что ответ был - "нет, для семантической сети нужна База Знаний, а это не БД". Я смирился с этим бредом и написал на php+MySQL за 10 мин приложение.
Мой вопрос сообществу. Что такое семантическая сеть? Её реально построить в реляционной БД? Покажите примеры реализации, пожалуйста)
P.S. Приму любые связки технологий, ЯП, концепций и т.д.
- Вопрос задан более трёх лет назад
- 3294 просмотра
Да тут всё просто ))
Классический вопрос базе данных такой: Сколько весит слон?
А вопрос базе знаний будет: Какой средний вес слона?
Спросите у гугла ответы на эти 2 вопроса.
На второй он вам должен выдать в дополнение часть статьи из Вики. (Которая по сути и будет являться базой знаний в данном случае)
Возьмём список объектов у которого есть свойства.
Слон - вес, цвет.
Медведь - вес, цвет, рост.
.
Итак, у нас есть 100 слонов и у каждого заполнен вес.
На вопрос "Сколько весит слон?" сколько весит ОДИН слон, как выбрать-то из ста?
Ответ прост, посчитать средний вес. (Человеку это понятно, машине нет)
Уточнив вопрос, добавив слово "средний", машине будет более понятнее, что от неё хотят (утрированно конечно)
Это маленький пример, который очень упрощён.
Что касается приложения.
В базе знаний вы двигаетесь по графу.
Точно так же как и в Википедии, "зависая" иногда на ней, начав с какого-то события этого века, заканчивая описанием математических алгоритмов, когда открыто более 20 вкладок "которые надо прочесть".
Зайдите на тостер. Тут у вас будут открыты только вкладки с вопросами и парочку с пользователями. Вы тут не сможете без помощи гугла релевантно искать по комментариям, не сможете увидеть похожих тэгов. Потому что вы двигаетесь в пределах объектов, а не их свойств.
ЗЫ. Не претендую на отличный и толковый ответ. Постарался объяснить, как понимаю сам, и как можно проще.
Если вам необходимо дополнить текст графическими элементами. Например, таблицами, графиками, диаграммами или схемами.
То, это можно сделать прямо в текстовом редакторе Word. Не прибегая к использованию сторонних программ.
Мы уже рассказывали о том, как сделать диаграмму в Word. В этот раз речь пойдет о схемах. Текстовый редактор Word оснащен множеством инструментов для создания схем. С их помощью вы можете рисовать различные геометрические фигуры, а также линии и стрелки. При этом нарисованную схему можно украсить с помощью с помощью теней или других графических эффектов.
Как сделать схему в Word 2007, 2010, 2013 или 2016
Итак, если вы хотите сделать схему в Word 2007, 2010, 2013 или 2016, то вам необходимо перейти на вкладку «Вставка». На этой вкладке есть две кнопки, которые можно использовать для создания схем в Ворде. Это кнопки «Фигуры» и «SmartArt».
При нажатии на кнопку «Фигуры» появляется огромный список фигур, которые вы можете вставить в документ.
Выбрав одну из этих фигур из списка, вы можете сразу нарисовать ее в любом удобном вам месте. Использовав несколько таких фигур вы без труда сможете сделать схему в Ворде. Пример простой схемы на скриншоте внизу.
При необходимости внешний вид нарисованных фигур можно менять. Для этого просто выделите одну из фигур и перейдите на вкладку «Формат». На данной вкладке можно изменить цвет фигуры, цвет рамки, цвет заливки, добавить тени и другие графические эффекты. Используя все эти возможности можно создать достаточно красивую схему (пример внизу).
Для того чтобы добавить на схему текст просто нажмите на нужную фигуру правой кнопкой мышки и выберите пункт меню «Добавить текст». После чего вы сможете вписывать текст прямо внутрь фигуры.
В итоге вы можете получить примерно вот такую схему.
Кроме этого вы можете сделать схему в Ворде при помощи кнопки «SmartArt». После нажатия на данную кнопку открывается каталог уже готовых схем. В котором вы можете выбрать один из подходящих вам вариантов.
После выбора подходящего варианта схемы на странице появится уже готовая схема.
Вам необходимо будет только добавить свой текст. Для этого достаточно просто кликнуть мышкой в один из блоков и вписать нужный текст.
Также вы можете изменить внешний вид сделанной вами схемы. Для этого выделите схему мышкой и перейдите на вкладку «Конструктор» или «Формат». Используя инструменты, доступные на этих вкладках, можно получить вот такую разноцветную и объемную схему как на скриншоте внизу.
Как сделать схему в Word 2003
Если вы используете Word 2003, то вы также можете сделать схему и добавить ее к вашему документу. Чтобы сделать это необходимо сначала открыть меню «Вид» и включить панель инструментов «Рисование».
После этого в программе Word 2003 появится панель инструментов для рисования различных фигур. Здесь будет доступны такие фигуры как прямоугольник, круг, линия и стрелка.
Для того чтобы нарисовать более сложные фигуры, можно воспользоваться меню «Автофигуры».
Компьютерные лингвисты из Вышки, университета Тренто и университета Осло разработали vec2graph — инструмент для визуализации семантической близости слов в виде сети. Воспользоваться vec2graph может любой желающий. Рассказываем, как это работает и зачем нужно
Команда компьютерных лингвистов из школы лингвистики НИУ ВШЭ, университета Тренто и университета Осло под руководством Андрея Кутузова представила на конференции AIST библиотеку vec2graph для Python. Vec2graph умеет визуализировать семантическую близость слов в виде сети. Информацию о близости слов vec2graph получает из векторной семантической модели. Вот так выглядит граф для слова «лук»:
Расскажем по порядку, что это такое и откуда берется.
Напоминалка: дистрибутивная семантика
«Системный Блокъ» уже рассказывал о том, что современные технологии автоматической обработки текста (даже те, которые пафосно и не всегда заслуженно называют «искусственным интеллектом») опираются на дистрибутивную семантику. В основе дистрибутивной семантики — простая идея: близкие по значению слова будут встречаться в похожих контекстах (ср. « полицейский бьет митингующего дубинкой», « омоновец бьет митингующего дубинкой», « полиция разогнала мирный митинг», « омон разогнал мирный митинг»).
Чтобы передать такое знание о контекстной близости слов компьютеру, ученые и инженеры обучают векторные семантические модели — например, с помощью word2vec (вот здесь мы подробно рассказывали, как это работает). Такие модели при обучении сохраняют знание о частых и редких контекстах слова в виде упорядоченного списка чисел (т.е. в виде вектора — отсюда и «векторные» модели). Благодаря этому семантические расстояния между словами становятся измеримы, и машина, измерив их, понимает: слова полицейский и омоновец похожи (благодаря частому употреблению в похожих контекстах вектора этих слов будут близкими).
Как визуализировать семантическую близость?
Как отображать эти семантические близости из векторной модели так, чтобы они снова стали понятны человеку? Один самый простой вариант вы уже видели выше: можно для любого слова просто выдавать столбик ближайших к нему «семантических ассоциатов» (т.е. слов с наиболее похожими семантическими векторами).
Можно ли более наглядно? Один из вариантов — попытаться сжать многомерное векторное пространство модели обратно в двумерное. Алгоритмов такого снижения размерности (PCA, MDS, t-SNE) множество, статистика разрабатывает их последние лет 100.
К сожалению, такое представление неизбежно теряет часть информации о соотношении векторов. Невозможно превратить, к примеру, 500-мерное пространство в двумерную картинку на плоскости без потерь.
Семантика и сети
Третья альтернатива — использовать сети (они же графы). Для каждого слова можно строить сеть из его семантических ассоциатов. При этом сам показатель близости можно отобразить, например, через длину линии: чем короче связь — тем ближе слово в векторной модели. Именно такие визуализации делает vec2graph.
Сети хороши не только наглядностью, но и тем, что здесь можно частично преодолеть ограничения так называемых контекстно-независимых моделей (word2vec, fastText и мн.других). Такие модели всегда хранят один вектор для любого слова, даже многозначного. В результате получается, что слова с несколькими значениям типа «кисть» или «лук» будут иметь один гибридный вектор. Такой вектор будет тяготеть сразу и к словам, связанным с растениями, огородом, едой, и к разной военно-оружейно-спортивной лексике («стрелы», «колчан», «лучник»). Это серьезная проблема дистрибутивной семантики.
Сетевая визуализация позволяет отобразить не только самые близкие слова для «лука», но и близость этих самых слов между собой. «Колчан» будет близок «стреле», но не слишком близок «чесноку», поэтому связи между «колчаном» и «чесноком» не отобразится. В результате получается граф с двумя кластерами: один «оружейный», другой — «растительный»:
Видно, что «чеснок» и «репчатый» связаны с луком-растением, но не связаны с оружием.
А вот и код для vec2graph, который позволяет это сделать:
Как же получается, что не все слова связаны со всеми? Для этого в vec2graph есть полезная опция «порог близости» (threshold). В примере выше если слово входит в топ-8 ближайших семантических ассоциатов, но при этом его близость к «луку» ниже 0,53, оно появится в визуализации как узел сети, но сама такая связь не отобразится. Так происходит со словом «арбалет».
Больше примеров сетевых визуализаций
Молодой
При высоком пороге близости (0,7) только «немолодой» и «пожилой» достаточно близки друг другу, чтобы отобразилась связь.
Оранжерея
«Теплица» связана по смыслу с «оранжереей», но далека от цветов, поэтому между ней и «цветочными» словами связи слабые (в данном случае — меньше 0.6).
Как сделать это самому?
Самая большая радость в том, что сделать это несложно: нужно лишь установить библиотеку vec2graph, скачать предобученную дистрибутивную модель на ваш вкус, а ещё установить несколько зависимостей.
Установка библиотеки и зависимостей:
Удобнее всего делать это с помощью pip. Если работаете в jupyter — можно обратиться к командной строке прямо там с помощью «!»:
Импорт из vec2graph:
Заранее создать папку для html-файлов с графами, прописать путь к ней и к дистрибутивной модели:
Использование vec2graph:
Теперь осталось задать слово и параметры, как было выше в подписях к визуализациям:
depth=0 означает, что будет создан один файл с графом, узлами которого будут слово WORD и его ближайшие соседи. Если увеличивать глубину, то ближайшие слова-соседи исходного запроса тоже распустятся графами в отдельных html-файлах.
topn=8 значит количество слов-соседей для одного слова-запроса.
threshold=0.6 — самое интересное: это минимальное значение косинусной близости, необходимое для прорисовки ребра между словами. По умолчанию этот показатель равен нулю, тогда граф полносвязный, но интереснее всего его регулировать и выяснять, какие слова близки и образуют кластеры, а какие оказываются дальше.
edge=1 отвечает за толщину рёбер.
sep=True означает, что метки частей речи показывать не нужно.
Результат будет выглядеть так:
Теперь вы можете сами исследовать значения слов.
Ссылки
Создатели библиотеки: Алексей Яскевич, Анастасия Лисицына, Тамара Жордания, Надежда Катричева, Елизавета Кузьменко, Андрей Кутузов.
Сегодня поговорим о NLP-методах векторизации слов - Word Embeddings. Векторы слов лежат в основе многих систем обработки естественного языка и повсеместно используются в современном мире. Рассмотрим работу Word Embeddings на примере нейронной сети Word2Vec.
В более общем смысле Word2Vec удобен для работы с категориальными признаками.
Когда мы говорим о смыслах или о лингвистике, мы имеем дело с сотнями тысяч слов-смыслов. И вот, собственно, Word2Vec и есть та самая современная технология, которая позволяет работать с такими категориальными признаками.
Для демонстрации возможностей технологии Word2Vec введем некую обучающую последовательность данных. Эта последовательность будет в виде расстояния на иерархии isa.
Расстояния между смыслами на графе будем вычислять, считая каждое ребро равное 1. Если нам нужно вычислить расстояние между “собакой” и “травой”, то мы пройдем по графу четыре отрезка, два отрезка вверх и два отрезка вниз. А значит, расстояние между “собакой” и “травой” будет равно четырем.
Расстояние между “собака” и “кошка” равно двум, раз поднялись вверх, и раз спустились вниз.
Чем ближе располагаются объекты на дереве к друг другу, тем ближе они семантически.
Естественно, особой глубины в таком семантическом расстоянии нет, для нас это просто некий удобный пример, на котором мы дальше будем работать.
И, собственно, задача будет очень простая. Мы вычислим на небольшом наборе смыслов все такие расстояния и научим нейронную сеть самостоятельно вычислять эти расстояния. Она ничего не будет знать о нашей семантической сети, просто на вход будем подавать подобные примеры, а на выходе она будет вычислять правильные расстояния.
В качестве обучающих данных у нас будет демонстрационная иерархия на 124 сущности.
Здесь корневым элементом является объект. Объект может быть вещью, существом, местом, веществом или частью. Например, вещь_рукотворная может быть инструментом. Инструмент может быть для работы или музыки. Инструмент для работы - это молоток, отвертка, пила, топор…
Таким образом организована иерархия и вычислены попарно все возможные расстояния на таком дереве. Так, как сущностей 124 штуки, расстояний получается достаточно много (а дальше увидим, сколько их) для того, чтобы вполне успешно тренировать нашу нейронную сеть.
Теперь рассмотрим, в чем, собственно проблема, почему мы говорим о векторизации слов. Дело в том, что нейронная сеть не оперирует собаками и кошками, она оперирует числами. Поэтому с таким входом “собака” - “кошка” нужно что-то делать.
Общее применение технологии Word2Vec - это работа с категориальными признаками. Если у нас есть признаки, значения категорий которых никак не упорядочены, то они требуют обработки.
Чтобы отвлечься от семантики и лингвистики, приведем отвлеченную задачу. Например, нам нужно написать нейронную сеть, которая прогнозирует отношение покупателей к выбору автомобиля. Здесь сразу виден один явный признак - это цена. Помимо него еще будет модель (BMW, Mercedes, Audi) - абсолютно никак не упорядоченные классы машин. И цвет (красный, желтый, зеленый). Вот у нас есть, как минимум, три признака. Один из них числовой, а два категориальных. С ними нужно что-то делать.
От слов всегда можно перейти к числам. В нашем случае имеются слова-смыслы, которые относятся к разным категориям, никак не упорядоченным.
Расположим эти слова в трехмерном пространстве.
В этом трехмерном пространстве “арфа” будет иметь три вещественных числа, которые будут соответствовать ее координатам этом пространстве. “Собака” другие какие-то три числа, а “кошка” - третьи.
Вот такими координатами для каждой сущности мы располагаем эти слова-сущности по многомерному пространству. В таком пространстве, сущности, близкие друг другу по смыслу, будут располагаться рядом. В нашем примере “кошка” и “собака” будут размещены в одной области, “дерево” и “трава” в другой, а “арфа” и “рояль” в третьей.
Эти данные для входа в нейронную сеть уже будут более осмысленными, чем если бы они просто располагались по порядку на линейной прямой. В многомерном пространстве есть возможность группировать и кластеризовать объекты с гораздо большей свободой. Качество обучения сети значительно повысится.
Естественно, возникает вопрос, а как же эти вектора задать. Для этого и применим слой Embedding.
Системе сообщается список всех слов из словаря. Она под каждое слово резервирует вектор некой заранее установленной размерности и заполняет его случайными числами. Хранятся все эти числа в слое Embedding. После этого слоя располагается полносвязная нейронная сеть.
Когда мы начинаем пропускать через эту сеть наши примеры, Embedding извлекает значения компонент из вектора и подает на выход.
После этого идет прямое распространение, на выходе получаем ошибку и начинается обратное распространение обучения по градиенту, подправляются веса у нейронов и когда нейронная сеть добирается до векторов, которые мы вытащили из памяти, она их тоже подправляет. В нашем примере это “кошка” и собака”. Компоненты этих векторов по градиенту тоже сдвигаются.
Поступает следующий пример и компоненты векторов из этих примеров тоже сдвигаются. Например, подаем теперь на вход “собака” и “свинья”.
Word2Vec. Практика
Теперь перейдем к практике. Применим Word2Vec для отношения isa. Наша задача: научить сеть воспроизводить расстояния между смыслами, вычисленные на дереве отношения isa.
Мы подготовили обучающие данные в виде файла csv, Он сгенерирован на основе дерева из 124 понятий. Приведем для наглядности первые 10 строчек с расстояниями из этого файла. Всего в нем 15376 примеров (124 * 124).
На втором этапе, после загрузки мы должны закодировать эти слова целыми числами. При помощи LabelEncoder из библиотеки sklearn имена смыслов преобразуем в целые числа.
Словарь (смысл, номер) хранится в объекте le.
Создаем экземпляр LabelEncoder, помещаем в него все строки из обоих колонок. Командой fit создаем словарь и упорядочиваем по алфавиту. А с помощью команды transform возвращаем номера.
Создаются новые колонки s1 и s2, где каждой строке соответствует номер. Они приведены в таблице.
Например, “объект” имеет номер 75, а “вещь” имеет номер 8.
Также вычисляем нормированное расстояние. Для этого поделим расстояние между смыслами на максимальное значение. А максимальное значение равно 10. Это максимальное расстояние на этом дереве. Результаты отображены в колонке d.
Первые три колонки - это исходные колонки наших данных, а колонки s1, s2 и d мы будем использовать непосредственно уже в обучении. Это числовые идентификаторы слов и нормированное расстояние.
Весь наш словарь теперь выглядит так:
Те номера, которые мы видим в таблице, это просто порядковые номера элементов (начиная с нуля) в этом массиве.
Далее разбиваем данные на обучение и валидацию. Выделим 10% для валидационных данных. В результате 13838 примеров будут для обучающих данных и 1538 для валидационных.
Теперь приступим к главной части нашей работы, определяем модель. Для ее определения нам понадобится две константы. Это:
NUM_WORDS - число слов в словаре, и
VEC_DIM - размерность векторного пространства, которую мы хотим получить.
Нейронная сеть реализована в виде простой стопки, через последовательность.
Первый слой - это слой Embedding, о котором мы говорили. Этому слою мы указываем количество слов в словаре, желаемую размерность и сколько входов.
Далее он разворачивается в единую монотонную последовательность вещественных чисел.
И далее идет полносвязная нейронная сеть из двух слоев на 16 и 8 нейронов. На выходе один нейрон с сигмоидом на активационной функции.
Параметры, которые располагаются в слое Embedding, это и есть те компоненты векторов, которые нейронная сеть будет учиться сдвигать в процессе обучения. Ну и естественно, одновременно с ними, смещать веса нейронов в слоях полносвязной нейронной сети.
Обучение модели происходит стандартным образом. Задаем метод для оптимизации, задаем функцию ошибки и запускаем модель на обучение.
После обучения можем посмотреть расстояния между векторами. Для примера на рисунке для неких наборов слов приведены расстояние по косинусу и обычное евклидово расстояние.
Видно, что пары “кошка” - “собака” и “кошка” - “акула” по косинусу очень близки, но в пространстве реально находятся немного отдаленно друг от друга.
А в паре “кошка” - “книга” вектора направлены в разные стороны, у них отрицательный косинус и расстояние очень большое.
Также можем вычислить ближайший смысл к вектору.
Найдем среднее между “гитара” и “арфа”. В результате получим “пианино”. Обратите внимание, получили не кошку и не собаку. А вот среднее. Рядом с гитарой и арфой находится то, на чем можно играть, а не то, что можно съесть.
Теперь о графическом представлении данного примера.
Конкретно эта задача на пятимерном пространстве имеет ошибку в 5-10 раз меньше, чем на двухмерном пространстве. Но мы намеренно используем двухмерное для наглядности результатов.
Строим график. Точки, соответствующие векторам, располагаем на плоскости. И в эти же точки помещаем метки наших классов, чтобы видеть значения точек.
Получилась фантастически интересная вещь. В этом пространстве нейронная сеть по факту геометрически воспроизвела нашу иерархию.
Цель этой статьи — поделиться опытом и идеями реализации проекта, основанного на полном преобразовании текстов в семантическое представление и организации семантического (смыслового) поиска по полученной базе знаний. Речь пойдет об основных принципах функционирования этой системы, используемых технологиях, и проблемах, возникающих при ее реализации.
Зачем это нужно?
В идеале, семантическая система «понимает» содержание обрабатываемых статей в виде системы смысловых понятий и выделяет из них главные («о чем» текст). Это дает огромные возможности по более точной кластеризации, автоматическому реферированию и семантическому поиску, когда система ищет не по словам запроса, а по смыслу, который стоит за этими словами.
Семантический поиск – это не только ответ по смыслу на набранную в поисковой строке фразу, а в целом способ взаимодействия пользователя с системой. Семантическим запросом может быть не только простое понятие или фраза, но и документ — система при этом выдает семантически связанные документы. Профиль интересов пользователя – это тоже семантический запрос и может действовать в «фоновом режиме» параллельно с другими запросами.
Ответ на семантический запрос в общем случае состоит из следующих компонентов:
-
Прямой ответ на вопрос и другая информация, касающаяся запрошенных и связанных с ними понятий.
Онтология
При выборе онтологии основным критерием было удобство ее использования как для построения семантического парсера текста, так и для эффективной организации поиска. Для упрощения системы было сделано допущение, что можно не обрабатывать, или обрабатывать с большим допустимым уровнем ошибок часть содержащейся в тексте информации, которая предполагается не очень важной для поисковых задач (вспомогательная информация).
В нашей онтологии, простые семантические понятия (объекты) можно разделить на следующие классы:
- Материальные предметы, люди, организации, нематериальные объекты (например, фильмы), географические объекты и т.п.
- Действия, показатели ("продать", "инфляция", "сделать").
- Характеристики ("большой", "синий"), назовем их атрибутами.
- Периоды времени, числовая информация.
Узлы могут входить один в другой, когда один узел заполняет пустую роль в другом узле. В результате, текст преобразуется в систему вложенных друг в друга узлов.
Характеристики, примененные к семантическим понятиям первого и второго класса, как правило можно считать «второстепенной» информацией применительно к поисковым задачам. Например, в выражениях "сохраняются низкие цены на нефть","стабильные поставки нефти в Европу" выделенные курсивом атрибуты имеют меньшую значимость, тем другие объекты. Такая информация не входит в узлы, а привязывается к ним в привязке к определенному месту в документе. Аналогично к узлам привязываются числовая информация и периоды времени.
Рисунок ниже иллюстрирует семантическое преобразование двух несложных фраз. Цветные прямоугольники – это элементы шаблонов узлов, а прямоугольники над ними – элементы узла, построенного по этому шаблону.
При таком подходе мы имеем два сорта информации:
- Определенный узел существует («цены на нефть»). Накопитель таких узлов назовем «Базой знаний».
- Этот узел существует в определенных местах документов с определенными атрибутами, числовыми значениями и периодами времени.
Преобразование текста в семантическое представление
Основная задача семантического преобразования текста – структурировать содержащиеся там объекты в виде совокупности подходящих узлов. Для этого применяем систему шаблонов узлов, в которой для каждого элемента установлено условие на допустимый тип объекта. Типы формируют древовидный граф. Когда в шаблоне узла установлен для данной роли определенной тип объекта, то на эту роль могут подойти все объекты того же типа или «подчиненных» типов.
Например, в узле «торговые операции» активным объектом (продавцом или покупателем) может быть объект типа «человек или организация», а также объекты всех нижележащих типов (компании, магазины, культурные учреждения и т.д.). В шаблонах узлов заводим и синтаксические ограничения. В отличие от большинства других систем семантического анализа текстов, мы не делаем предварительный синтаксический разбор с формированием сети синтаксических зависимостей, а применяем синтаксические ограничения параллельно с семантическим анализом.
Кратко поясню основные этапы.
Сначала производится идентификация простых объектов, которые определяются отдельными словами или известными словосочетаниями. Далее, определяются комбинации имен и фамилий как указания на людей, и работает алгоритм анализа отдельных слов и последовательностей слов, которые могут быть неизвестными системе объектами.
На втором этапе формируем узлы на основе объектов класса 1 с уточняющими их объектами. Фразы типа «генеральный директор московской торговой компании «Рога и копыта» свертываются в один объект. Содержащаяся в этих узлах дополняющая информация («московская» как признак расположения и «торговая» как признак отрасли в этом примере) может быть добавлена в граф семантических связей для указанной компании. В следующей главе граф семантических связей рассмотрим подробнее.
Затем, текст нужно структурировать в виде последовательности независимых фрагментов, каждый из которых обычно содержит определенную фразу на основе глагола, и в идеале должен свернуться в один узел, который может включать в себя другие узлы. Обрабатываем причастные обороты и другие конструкции, а перечисления объектов класса 1, в том числе уже сформированные узлы, сворачиваем в специальные объекты.
После этого, для каждого фрагмента идет поиск подходящих узлов на основе объектов класса 2. Если для одного узлообразующего объекта сформировалось несколько узлов, остаются те, которые включают в себя максимальное количество объектов в данном фрагменте. Таким образом, на основе типа окружающих объектов происходит переход от семантически широких объектов вроде «идти» к узлу, имеющему ясный семантический смысл. Если при первичной обработке на месте омонимов возникли несколько параллельных объектов, то после этой обработки остаются только те объекты, которые вошли в узлы (т.е. семантически согласуются с соседними объектами).
Последний блок преобразования в семантическое представление – учет объектов, которые в тексте удалены от узлообразующих объектов, но по смыслу подразумеваются. Например, «В Москве тепло, идет дождь. Завтра похолодает, и пойдет снег». Семантический анализ конца предложения оставляет вакантной роль географического объекта, и по ряду признаков можно определить, что подходит «Москва».
Когда узлы полностью сформированы, к ним привязываем атрибуты, числовую информацию и периоды времени. Типична ситуация, когда период времени указывается только в одном месте текста, но относится к нескольким узлам по всему тексту. Приходится использовать специальный алгоритм для "распределения" периодов по всем узлам, где "не хватает" периода времени исходя из их семантического значения..
Наконец, в каждом документе определяем основные объекты ("о чем" этот документ). Помимо количества вхождений, учитывается участие объектов в узлах разных типов.
Имея богатую семантическую информацию, можно построить достаточно точную меру семантической близости документов. Объединение документов в кластер делаем при превышении мерой семантической близости определенного порога. Формируем семантические профили кластеров (основные объекты кластера, по ним обычно идет поиск) и сеть семантических связей между кластерами, позволяющую выводить «облако» документов, связанных по смыслу с определенным документом.
Как работает семантический поиск
Алгоритм семантического поиска состоит из следующих основных блоков:
Во-первых, если текстовый запрос, то нужно преобразовать его в семантическое представление. Отличия от описанного выше алгоритма обработки текстов документов диктуются, прежде всего, необходимостью очень быстрого выполнения поискового запроса. Поэтому, никакие узлы не формируем, а выделяем один или несколько блоков, состоящих из потенциально узлообразующего объекта и ряда объектов, которые, исходя из их типа и положения в запросе, могут относиться к этому узлообразующему.
При этом может быть сформировано несколько параллельных комбинаций, в одной из которых на следующем этапе нужно раскрывать через базу знаний комбинации типа «московские компании» в список конкретных объектов, а в другой не надо.
Следующий этап – поиск семантически связанных объектов и узлов. Для одиночных объектов класса 1 это выборка семантически связанных объектов. В случае комбинации «действие + объекты» идет поиск узлов, имеющих такой же или подчиненный тип узлообразующего объекта, и при этом имеющих в своем составе объекты, совпадающие или семантически связанные с объектами запроса. Также, производится раскрытие в список конкретных объектов комбинаций типа «московские компании» или «страны Европы».
Здесь используется древовидный граф семантических связей между объектами. Принцип его построения прост — к определенному объекту привязываются те "подчиненные" объекты, которые должны учитываться в поиске по данному объекту. Например, города подчинены государствам, политические деятели тоже подчинены государствам, компании подчинены странам или городам, руководители компаний подчинены компаниям. Для материальных предметов этот граф строится от более общих понятий к частным и частично совпадает с графом типов.
Для ряда объектов количество "подчиненных" может быть очень велико и возникает необходимость в выборе наиболее значимых. Для этого между элементами графа установлен числовой коэффициент семантической связи, который рассчитывается на основе значимости объектов. Для разных типов объектов значимость определяется по-разному, например, для компаний – исходя из экономических показателей (оборота) или количества сотрудников, для географических объектов – по количеству населения.
Далее, простые объекты и узлы, которые получены на выходе предыдущего этапа, ищем в объектных профилях кластеров. Если найдено мало кластеров, то идет поиск в объектных профилях документов.
Если поисковый запрос содержит объекты-атрибуты (характеристики), идет дополнительная фильтрация найденных документов по наличию привязанных к найденным узлам искомых атрибутов. Если в запросе есть лексемы, для которых в базе нет перехода к семантическим объектам, семантический поиск дополняется обычным текстовым поиском по лексемам.
Наконец, ранжируем найденные кластеры и документы, формируем сниппеты и прочие элементы выдачи (ссылки на связанные объекты и др.). Ранжирование обычно идет по степени семантической связи между объектами запроса и объектами, через которые найдены документы. Также, при ранжировании может быть учтен семантический профиль интересов пользователя.
Перед началом выполнения сложного запроса нужно делать анализ сложности обработки разных его компонентов, и строить порядок его выполнения таким образом, чтобы в процессе обработки возникало меньше промежуточных объектов или документов. Поэтому, порядок обработки не всегда может соответствовать описанному выше. Иногда может быть выгодно сначала найти документы на основе части запроса, а потом содержащиеся в них объекты фильтровать по отношению к оставшейся части запроса.
Отдельный алгоритм требуется для «широких» запросов – "экономика", "политика", "Россия" и т.п., которые характеризуются очень большим количеством связанных объектов и релевантных документов.
Например, с объектом «политика» связаны:
- Люди-политики – занимающие высшие государственные посты или авторитетные эксперты
- Организации — политические партии, органы гос. власти.
- Ряд событий и действий (выборы, назначения на определенные должности, деятельность Госдумы и др.).
Основные проблемы реализации данного подхода и их решения
Проблема 1. Система должна "знать" все объекты, которые встречаются в текстах.
Возможные решения включают следующие:
-
Применение семантической системы в области, где незнание или ошибки идентификации редких и малоизвестных объектов не критичны.
В решающих аналогичные проблемы распределения объектов по семантическим ролям англоязычных системах SRL (Semantic Role Labeling) используются алгоритмы машинного обучения с использованием уже размеченных корпусов. В качестве системы конструкций «действие + роли» используется, например, Framenet. Однако, для русского языка нет подходящего размеченного корпуса. Кроме того, реализация этого подхода имеет свои проблемы, обсуждение которых выходит за рамки этой короткой статьи.
В нашем подходе, как было описано выше, распределение объектов по ролям идет на основе соответствия типов объектов семантическим ограничениям, установленным для ролей в шаблоне узлов. Всего в системе сейчас около 1700 шаблонов узлов, большинство которых было сформировано полуавтоматически на основе фреймов Framenet. Однако, семантические ограничения для ролей приходится в основном устанавливать вручную, по крайней мере для наиболее часто встречающихся узлов.
Можно попробовать автоматическое формирование узлов с помощью машинного обучения на основе уже сформированных. Если есть некая комбинация объектов и слов (неизвестных системе) с определенными синтаксическими характеристиками, то можно формировать узлы, аналогичные уже существующим. Хотя по этим узлам все равно нужно будет вручную делать шаблоны, наличие такого узла все равно будет лучше, чем его отсутствие.
Проблема 3. Высокая вычислительная сложность выполнения многих семантических запросов.
Некоторые запросы могут включать в себя обработку очень большого количества промежуточных объектов и узлов и выполняться медленно. Эта проблема вполне решаема техническими методами.
Читайте также: