LINUX.ORG.RU

СОРМ на коленке

 , ,


3

1

Необходимо отбирать тексты содержащие определенные ключевики. Текстов не много, слов тоже вобщем-то не много. Проблемы - словоформы. Как лучше всего это сделать кроме регулярок в цикле? Какие есть библиотеки для PHP?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от Deleted

Хм... там уже есть сфинкс. Выполнять поиск по нужным тегам и если новость нашлась просто сопоставлять?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от nagibator

Спасибо, но я как-то и правда не подумал о полнотекстовой индексации и использовании поиска для этого. Но все равно почитаю.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Мне как то понадобилось сопоставить 2 таблицы из разных источников без каких либо общих ключей. На подмогу пришел полнотекстовый поиск из postgresql и записи были успешно сопоставлены по наименованию несмотря на разброд и шатание в наименованиях.

exception13 ★★★★★
()
Ответ на: комментарий от Suntechnic

Авторастановка тегов для новостей распарсеных с сайтов конкурентов ;)

Вот, как раз у меня выше пример с ключевыми словами :)

Вообще, самый быстрый (ИМХО) поиск группы тегов в тексте — это нормализовать стеммером все ключевые слова, нормализовать весь текст и искать в нём теги по одному просто по подстроке. Если сохранить в тексте порядок слов, то можно искать и склоняемые словосочетания.

Хм... там уже есть сфинкс

Он, кстати, уже умеет стемминг. Но для анализа именно отдельных документов не подходит. Там другая задача — поиск документов, содержащих ключевые слова.

KRoN73 ★★★★★
()
Ответ на: комментарий от Suntechnic

банальный join через функции полнотекстового поиска. естественно с последующей ручной поверкой полученного сопоставления.

exception13 ★★★★★
()
Ответ на: комментарий от Suntechnic

Что такое стемминг вообще?

Не честная морфология, а отбрасывание суффиксов/окончаний. Типа:

«честная», «честный», «честные» -> «честн»
«стемминг», «стеммингом», «стеммингами» -> «стемминг»

Соответственно, если сравнивать результат преобразования, то получается учёт склонений. В отличие от честной морфологии (если интересно — см. пример https://bitbucket.org/Balancer/blib-morfology-ru ) работает очень быстро, но могут быть ложные срабатывания (особенно в Сфинксе — там алгоритм жёстче, например, «саяны» и «САУ» обе превращаются в «са»).

Сам делал?

Нет, там ссылка на первоисточник в шапке: http://forum.dklab.ru/php/advises/HeuristicWithoutTheDictionaryExtractionOfAR...

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

В отличие от честной морфологии работает очень быстро

А, главное забыл, не требует словаря. А то вариант с phpMorphy по ссылке тащит с собой словарь мегабайт на 10.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ага, уже прочел в вики. Я примерно это и собирался своять побыстрому. Спасибо. Попробую заюзать.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

А зачем там у тебя свой лоукейс? Чем лучше встроенного?

Движок изначально расчитывался на работу на самых разных конфигурациях. Кодировки — KOI8-R, CP1251, UTF-8. Наличие/отсутствие mb_string. Наличие/отсутствие mbstring_overload и т.п. Поэтому у меня стоит «генератор» обёрток в зависимости от настроек. В принципе, сегодня уже не актуально, так как utf-8 и mb_string — норма, но, во-первых, есть ещё legacy-проекты, во-вторых, смысла особого переписывать нет, производительности выиграешь копеечно.

KRoN73 ★★★★★
()
Ответ на: комментарий от Suntechnic

Вот, что по кейсам, в самом конце:

https://github.com/Balancer/bors-core/blob/master/classes/bors/funcs.php

Там и просто унификация. Типа, нету mb_ucfirst(), так что приходится эмулировать и т.п.

Но всё это лютое legacy, корнями уходящее в 15-летнюю давность, а конкретно юникодность — почти ровно 10 лет назад: http://www.balancer.ru/g/p351760

Забавно: http://forums.balancer.ru/tech/forum/2003/05/t20608--buduschee-za-utf-8.html :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

)))

Забавно. Я так далек был в то время от компьютера (((

Кстати столкнулся с такой проблемой - по тегу «дума» срабатывает текст «госдума» - это плохо, потому что включение может оказаться вовсе не тем чем надо. Сделал return таким: return ' '.join(' ', $keywords).' '; Так как тэги тоже гонятся через нормализацию, они обиваются пробелами по краям и на подслово уже не сработают. Как ты с этим не столкнулся? Или как иначе решил?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

по тегу «дума» срабатывает текст «госдума»

Ищи не тупо подстроку. Собирай текст документа после стеммирования через пробелы и ищи тег, окружив его пробелами (или другим символом, но пробел ничем не хуже, я же для лучшей видимости дальше использую подчёркивание). Т.е. из текста «депутатам госдумы» получаешь «_депутат_госдум_» (не забудь окружить пробелами результат, чтобы крайние слова найти тоже — у меня в function bors_text_clear() так и сделано — именно для этого) и ищешь подстроки тегов «_дум_» или «_госдум_».

KRoN73 ★★★★★
()
Ответ на: комментарий от Suntechnic

Упустил.

Так как тэги тоже гонятся через нормализацию, они обиваются пробелами по краям и на подслово уже не сработают

Ну так для этого и идёт оббивка пробелами. Как же тогда у тебя в «госдум» находится подстрока «_дум_»? trim() не делаешь?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ну дык я же и написал что так и сделал. Для этого достаточно ретарн в твоем же классе отбить пробелами ;)

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Так не было пробелов - говорю же - это я сейчас добавил. Сейчас нормально всё работает. Спасибо - сэкономил несколько часов мне минимум. )))

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

А есть какие-нибудь продуманные приемы как бороться с ложными срабатываниями? Например какой нибудь Франц Клинцевич выскажется и бах - тэг Франция...

Suntechnic ★★★★★
() автор топика

Возьмите словарь для орфоправок и выдерните оттуда всё по базовой форме, если слов не много. Или с яндексовского сервиса.

Потом автогенереными регулярками. Для вашего случая это будет самый простой вариант. Если текстов много - тогда полнотекстный поиск.

На коленке автоматизировать словоформы не советую. Сами вы максимум стеммер осилите, а стеммеры для русского работают говёно. Надо хотя бы AOT.

Vit ★★★★★
()
Ответ на: комментарий от Suntechnic

Надо матчить по границам слов, а не подстроки. Регулярки умеют.


А если омонимы типа «стекло», то без лексического анализа никак.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Та по границе слов же. Но текст нормализован стеммингом, так что Франция превратилась во франц. И Франц тоже. r_asian предложил вроде вариант - сейчас пробую. Возможно сделаю одновременно со стеммингом. Текстов не много и они не большие. Так что можно поэксперементировать.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Потому что надо не текст нормализовывать кривыми алгоритмами, а словоформы в запрос добавлять.

Vit ★★★★★
()
Ответ на: комментарий от Vit

В смысле словоформы в запрос добавлять?

Вообще разобрался с mystem - это веселее, так как он разбирает в исходные формы, но еще круче tomita-parser - вот что я попробую завтра прикрутить.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

В смысле словоформы в запрос добавлять?

Ну регекспом искать не «яйцо» а «яйцо|яйцы|яйцев». Когда объемы небольшие, работать будет хорошо.

Стеммеры для русского - это говнище by design. Для приведения к базовым словоформам надо aot.

Лучше только полноценный лексический анализ. Что-то есть от яндекса, но оно все огороженное.

Vit ★★★★★
()
Ответ на: комментарий от Vit

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

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Тогда только готовые решения.

в sphix serach есть aot. С синтаксическим анализом дела не имел.

Vit ★★★★★
()
Ответ на: комментарий от Suntechnic

А есть какие-нибудь продуманные приемы как бороться с ложными срабатываниями?

Универсального автоматического нет. Или с ручной проверкой, или со сложностями и отсутствием срабатывания (честная морфология по словарю), или просто, но с ложными срабатываниями (стемминг).

Обычно чаще мирятся с ложными срабатываниями, они бывают нечасто, менее критичны с точки зрения доступа к данным (лишняя статья наносит меньше вреда, чем отсутствие статьи) и, если понадобится, вручную проверить срабатывания проще, чем их отсутствия :)

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.