Помогите придумать алгоритм сравнения слов

Solmyr
На сайте с 10.09.2007
Offline
501
2601

Имеется большое число словосочетаний одно, два, три, очень редко четыре слова. Словосочетания - наименования предметов с дополнениями. Например: "Шар желтый", "Куб красный блестящий" и т.д. Словосочетания часто повторяются, т.е. в анализируемом массиве много раз встречается "Эллипс красный блестящий".

В основном все словосочетания в массиве приведены к форме единственного числа именительного падежа. Но встречаются:

- формы множественного числа

- формы родительного падежа

- формы родительного падежа множественного числа

- опечатки

- другой порядок слов

Требуется придумать алгоритм, который будет понимать, что

"Эллипс красный блестящий" и "Блестящий красный эллипс" и "Эллипса красного блестящего" и даже "Эллипс красный блстящий" - всё это одно и то же.

В первом приближении хотя бы такой, который будет отлавливать первые три пункта, а опечатки и другой порядок слов не столь важно, т.к. они встречаются очень редко.

P.S. Все-таки большую часть анализируемого массива составляют словосочетания из одного слова, реже из двух, очень редко из трех, из четырех - исключительные случай. Алгоритм имеет право на небольшой процент ошибок. Алгоритм должен работать быстро.

Dreammaker
На сайте с 20.04.2006
Offline
569
#1

посмотрите в сторону http://php.net/soundex http://php.net/levenshtein, http://php.net/metaphone http://php.net/similar_text

Они конечно на буржуйский язык рассчитаны, но может быть помудровав что-то и придумать можно будет.

Shtogrin
На сайте с 02.11.2006
Offline
95
#2

а отсюда нельзя вытащить словоформы http://php.net/pspell ? Словари должны быть и для русского языка.

www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
Dreammaker
На сайте с 20.04.2006
Offline
569
#3

http://xpoint.ru/forums/programming/theory_algorythms/thread/36297.xhtml

Вот здесь нашёл sql с окончаниями для русского языка

P
На сайте с 08.03.2007
Offline
250
#4
Solmyr:
Требуется придумать алгоритм, который будет понимать, что
"Эллипс красный блестящий" и "Блестящий красный эллипс" и "Эллипса красного блестящего" и даже "Эллипс красный блстящий" - всё это одно и то же.

Берём массив словоформ (нормальный вид слова и множество вариаций - падеж, число...) - см. гугль на "ispell генератор словоформ", приводим все слова словосочетания к нормальной форме, сортируем по алфавиту, вычисляем контрольную сумму или просто ищем в индексированной базе данных.

Solmyr
На сайте с 10.09.2007
Offline
501
#5

В тексте много терминов. Не уверен что генератор словоформ просечет.

Я пока думаю сделать так:

Таблица:

1. Форма инфинитива

2. число четких повторов

3. число нечетких повторов

4. число сравнений

Сравниваемое словосочетание приводим к нижнему регистру и сначала просто сравниваем с формами инфинитива, а если четкого совпадения нет - вычисляем левенштейн с формой инфинитива. Если есть нечеткое совпадение по левенштейну - значит проверяемое словосочетание - форма этого инфинитива. Если нет нечеткого совпадения - значит это новая форма инфинитива. Добавляем в таблицу. Если по какой-то форме инфинитива оказывается нечетких совпадений больше чем четких - значит форма инфинитива была выбрана неправильно - меняем. Т.к. массив словосочетаний обладает свойством, что заведомо правильных форм инфинитива минимум 90%.

Хотя сейчас попробую проверить на ниболе сомнительных случаях генератор словоформ.

Kolyaj
На сайте с 28.03.2006
Offline
69
#6

Solmyr, с морфологией справиться вам поможет phpMorphy http://sourceforge.net/projects/phpmorphy/ с остальным проблем, в принципе, нет.

Solmyr
На сайте с 10.09.2007
Offline
501
#7
Pilat:
Берём массив словоформ (нормальный вид слова и множество вариаций - падеж, число...) - см. гугль на "ispell генератор словоформ", приводим все слова словосочетания к нормальной форме, сортируем по алфавиту, вычисляем контрольную сумму или просто ищем в индексированной базе данных.

Что-то я не очень понял, как с помощью ispell привести слово к форме инфинитива...

P
На сайте с 08.03.2007
Offline
250
#8
Solmyr:
Что-то я не очень понял, как с помощью ispell привести слово к форме инфинитива...

ispell имеет набор правил генерации словоформ для слов. Строится обратный индекс - словоформа->нормальный вид слова.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий