Добрый день. Стоит задача анализировать к примеру статью на вхождений фраз или слов:
- поиск слова (Стемминг: яблоко, яблоки)
- поиск двух слов (стемминнг) с анализом расстояния между ними, к примеру: расстояние между двумя заданными словами не более (1,2,3,4 .....) слов, расстояние между словами не более (1,2,3,4 .....) символов (пробелы, тире, буквы).
- поиск слова (стемминг) впереди или позади которого на расстояние (1,2,3,4...) символов или слов, есть другое слово(а).
Ищу какие нибудь инструменты, алгоритмы, дабы понять как это правильно реализовать.
Статьи будут на английском. В принципе варианты слова не сложно получить, после текст перевести в массив из символов или слов, и начать их насиловать)))) Так же присматриваюсь к поисковым движкам, у них есть мощные системы запросов, но это загонять статьи в индекс, потом производить поиск по ним, потом удалять, заносить новые, как то муторно.
Рад был бы услышать любые мнения по реализации поставленной задачи.
AirWorker: Да нет, не муторно, есть либы, которые часть муторности убьют. Но всё равно надо придумать алгоритм, который не будет съедать много ресурсов. Я присмотрелся к запросам в поисковых движка, сильно не изучал, но чувствую что не все мои пожелания удовлетворять, и всё равно придётся с бубном плясать.
- поиск слова (Стемминг: яблоко, яблоки)
- поиск двух слов (стемминнг) с анализом расстояния между ними, к примеру: расстояние между двумя заданными словами не более (1,2,3,4 .....) слов, расстояние между словами не более (1,2,3,4 .....) символов (пробелы, тире, буквы).
- поиск слова (стемминг) впереди или позади которого на расстояние (1,2,3,4...) символов или слов, есть другое слово(а).
Я бы сделал n-ное кол-во необходимых шаблонов с параметрами. Прогонял бы каждую новую статью через них(меняя параметры, при необходимости) Ну, и собственно, анализировал результаты.
OVK2015: Да однозначно можно через регулярки, основные шаблоны написать, и прогонять. Но тут гибкость убьется сразу. Ведь сейчас 3 варианта поиска с правилами, а как обычно через какое то время появиться еще 10 вариантов)
OVK2015: Не поможет. Что то в любом случае измениться в процессе, задачи такого рода очень часто ведут себя изменчивым образом, поэтому решил сразу быть к этому готовым. С задачей такого рода этого просто не избежать.
Спасибо. Нечеткий поиск мне в принципе не нужен, синонимы будут задаваться в ручную, да и поиск слов сугубо по определенной теме, контролируемый словарь того что искать нужно. Вся беда в нахождение положение слов, оценка расстояния символов и слов.
Тут видите какое дело. По сути нужно разбирать текст на данные о чём текст, что бы его классифицировать. Можно конечно использовать специальные инструменты для извлечения фактов, но они не покроют мои задачи. Расстояние слов нужно, к примеру "зеленый сильный ежик" - нам нужно определить что статье есть упоминание про зеленного ежика, но слова зеленый ежик разбиты другим словом или словами, поэтому нужно уметь обрабатывать данный разрыв, если сильно далеко друг от друга то они навряд ли связаны и определяют одну сущность. Или к примеру предложение : Длина ежика составляла 2 метра, нам надо найти длину существа который описан в тексте, находим слово "метр" и идём назад по словам и символам и ищем существо, если находим, значит ежик 2 метра - верное утверждение. В русском да можно строить как хочешь предложения, с порядком будут проблемы, но в английском попроще, а анализировать нужно английские тексты, спасибо им за прямой порядок слов).
livemirsi: "зеленый сильный ежик" - нечеткий поиск, как раз, по ссылке, находит такие вещи.
Про остальное - это поисковые деревья (связи узлов с направлениями) различных частей речи.
Самое первое что нужно: уметь определять о чем весь текст (главную мысль = авто-заголовок). Если это получится сделать - остальное уже дело техники.
Касательно длины ёжика, может быть так: "ёжик со слона". Вот тогда что делать?
Немного не ясно выразился, у меня словарь для анализа текста задан по умолчанию, то есть о чём статья и остальное не важно, главное определить слова и фразы из словари актуальны для данного текста. Тематика словаря и текста узкая.
Я как понял, нечеткий поиск найдет, но расстояние как оценивать между двумя эти словами, так как если они сильно далеко, они могут быть о разных объектах?
livemirsi: чтобы оценить объекты - нужно понимать отношения местоимений: *котор* [некоторые, которые, которую,....] и [неё, её, его, оно, им, и т.д....] во всех лицах и падежах. Тогда по поиску связок внутри одного предложения П*С*П, Г*С*Г, П*М*П, Г*М*Г, где С-сущ, П-прилаг., Г - глагол, М - местоимение. и после - уже анализировать вектора мыслей по объектам...
кстати, да хорошая мысль. Можно хранить в последовательностях [value = 'word', type = 'noun, verb', pronoun] и такие последовательности разбирать. Правда появилось два момента, как определять у слова к какому типу речи оно относиться и как грамотно работать с такими последовательностями)
нашел интересную либу, которая облегчит жизнь с тем подходом, которым с вами обсуждаем https://github.com/NaturalNode/natural не знаю как у нее с производительностью, но после беглого просмотра очень крутые вещи реализованы)
livemirsi: либа почти ничего не умеет....
по поиску: Левенштейн и JaroWinkler - это устаревшие варианты....
все остальное - это просто туча правил и словарь.
по определению части речи - там вообще нет ничего.
по работе с деревьями - тоже ничего: максимум двумерные массивы и сдвиг)))
я бы не стал юзать её для любых своих нужд...
Вообще пока представил себе такой метод. Заносим весь текст в массив по словам, потом каждую единицу массива разбираем к какой речи она относиться.
Для простого поиска слова, используя стемминг смотрим если ли данное слово в последовательность если есть значит ок.
Если слова требует какого контекста, к примеру что ежик был зеленый, значит основной объект это ежик, находим его в последовательности(стемминг), потом смешаемся левее и смотрим какие там единицы слов с типами речи.
Получается что если нашли слово "ежик" смешаемся левее к примеру на 10 слов, находим слово зеленый, то нам нужно оценить какие типы речи находятся между контекстом "зеленый" и "ежик", если вдруг находим после слова зеленый существительное, значит потерян контекст поиска, и вхождение не найдено. Пока мозг взрывает, оценка этого промежутка между контекстом и объектом, по каким правилам понимать, что контекст не относиться или относиться к объекту.
livemirsi: решение вопроса в последнем предложении - это самое вкусное и интересное))) все что выше - гораздо проще. про смещение - нужно "растекаться", а не смещаться.
Да это самое вкусное, но в принципе и увлекательно занятие, в таких задача и проявляется вся крутость от занятия кодингом) В этой схеме я пока остановился на вопросе, как определить тип речи у слова. И еще внес правку что растекаться надо как влево так и в право. По принципу "green ball" и "ball is green" - два варианта допустимы.
https://github.com/neopunisher/pos-js -хотя вот либа, определяет тип речи порядок слов можно сохранить нужный. Замерил скорость, 375 слов обработало за 0.484 мс, это здорово)
livemirsi: "проявляется вся крутость от занятия кодингом" - я ежедневно этим занимаюсь (кодингом такой сложности и выше) и могу сказать, что строк мало, а времени и сил уходит нереально много, и не так это просто и весело...
незнаю меня наоборот утомляет рутинные задачи, больше захватывает делать что то сложное, хотя весь мой кодинг, это пока больше хобби чем работа, работа в другой сфере) но тоже it.
Доработал мысль о анализе растекание влево и в право, если контекст нашли левее, конткекст по сути это почти всегда прилагательное, причастие - то что описывает объект (объект всегда существительное). Получается нашли объект растеклись левее на заданный диапазон, нашли контекст и от точки контекста идём в строну объекта, и смотрим попадется ли нам тот тип речи, которые может взять на себя контекст. Если нашелся, то навряд ли это контекст. Вроде должно сработать, поправьте если видите недочеты)
livemirsi: пока мне сложно, т.к. нужен конкретный пример. Т.е. список того, что именно выцепляем из текста (какую информацию).
Вот пример:
"Ёжик со слона зелёного цвета вприпрыжку возвращался в свой тесный красный дом."
Вопросы контекстного поиска (вопрос-ответ):
1. Какого цвета дом у ёжика? (красного)
2. В чей (имя собственное/существительное) дом возвращался ёжик? (в дом ёжика, в свой же дом)
3. Какого размера ёжик? (со слона)
4. Какого размера красный дом? (тесный)
5. Откуда возвращался ёжик? (со слона?!)
6. Ёжик умеет прыгать? (да)
Вот можно протестить....
И это лишь один частный случай из "моря" вариантов.
xmoonlight: У меня будет поиск по вхождения:
1. Красный - уточнение, дом - объект, нашли слово дом сместились левее нашли форму слова красный, межу словом красный и дом
нет, существительного или местоимения, которые могли бы забрать утверждение, соответственно true.
2. Свой дом - по принципу из 1 пункта вернется true.
3. Тут вероятней всего запрос будет такой: объект ежик, уточнений большой. Нашли ежик, погуляли влево и вправо, не нашли слово большой, вернули false.
4. поиск будет, объект: дом, уточнений: тесный, по принципу из 1 пункта вернет true.
5. Действия я пока не рассматриваю. Только объекты и их характеристики. Хотя по принципу можно так же:
объект: ежик уточнение: прыгать. Находим ежик, потом словоформу "прыгать", изучаем отрезок между объектом и уточнением,
понимаем что там нет типа речи, который мог бы забрать на себя уточнение, соответственно алгоритм вернет true.
Итого мой примерный словарь для анализа статей про ежиков будет такой:
{
объект: дом,
уточнение: красный
}
{
объект: дом,
уточнение: свой
}
{
объект: ежик,
уточнение: большой
}
{
объект: ежик,
уточнение: прыгать
}
Еще можно расширить уточнения, на более абстрактный уровень
{
объект: ежик,
уточнение: прыгать, летать, бегать
}
Ну типо когда нужно определить обладает ли ежик супер силами)))))
Если одно из уточнений найдется, то ежик необычный))))
Я думаю можно конечно, за счёт анализа типов речи вычеслять объекты и их свойства без словарей,
но система рухнет, если текст вдруг будет сленговый, или еще какой нестандартный.
livemirsi: со словарями - это просто жесть. надо минимум делать через POS-деревья. Вы не придумаете столько словарей.
"Сколько их там всего было?" => kinoart.ru/archive/1997/03/n3-article1
Ну у меня английские тексты (классику тоже не планирую), русский даже страшно представить как разбирать) А у меня именно задача и стоит, по словарям определять те или иные моменты текста. Плюс тексты буду узкой тематики, под них словарь не очень сложно составить. Общие темы в планах разбирать нет. Поищу про данный тип деревьев (может расширю свою задачу для полного автомата), правда загуглил, не нашел пока ничего по данному типу деревьев.
Я правильно понимаю, вы имеете виду вытянуть данные с текста используя к примеру wordpos, к примеру вытягиваем существительные, и потом бегая по дереву пытаемся найти его характеристики, на основе типов речи?
Да штука однозначно мощней получиться, но в итоге найденные объекты с характеристиками надо еще в каком то виде нормальном хранить. Приводить слова в какой то единый формат, к примеру все глаголы привести к первой форме "work вместо worked" и т.д. Надо подумать над нормализацией данных.