Морфология русского языка. Подходы.

Sniff

Новичок
Морфология русского языка. Подходы.

Задача стоит следующая:
Есть произвольный текст, каждое из встреченных значимых слов в любом обороте/сколении (скажем, существительные, но неважно) нужно преобразовать либо в исходную форму, либо в некую форму, которая будет одинакова для всех оборотом/склонений (например, корень слова).
Пока что решения нашел два:
1. ispell-словарь. Отличный вариант, работает как зверь - но слишком мало словоформ охватывает, использовался словарь Лебедева
2. Стеммерные алгоритмы, пытающиеся разбирать слова автоматически. Не нашел ни удачного алгоритма, ни имплементации на PHP

Есть идеи/опыт/комментарии?
 

Sniff

Новичок
Ага, спасибо, штудирен...
А словаря Зализняка так у кого и не появилось в юзабельной форме?
 

Popoff

popoff.donetsk.ua
Вот неплохая страничка со словарями, в том числе Зализняка:
http://fmg-www.cs.ucla.edu/fmg-members/geoff/ispell-dictionaries.html#Russian-dicts

Лично мне в словарях ISPELL не понравилось не то, что там мало слов (120000 слов / 1 200 000 словоформ - имхо, вполне достаточно для большинства сайтов) а то, что там считаются разными слова, которые при поиске вплоне можно было бы учитывать как одно слово, например, в словаре Лебедева, на который я сейчас смотрю, слова "отсечение" и "отсечённый" - это разные слова. Если я ищу "отсечение", то, наверное, "отсеченный" я тоже могу хотеть найти. Или еще пример:

архивировавший/A
архивированный/AS
архивировать/LQU
архивироваться/L
архивируемый/A
архивируется
архивируются

это все разные слова. Особенно последние два слова просто вообще не имеют друг к другу никакого отношения.

Дело в том, что этот словарь изначально был предназначен для проверки орфографии, а не для поиска начальной формы слова. Если у какого-то слова есть форма, которая не подходит под общие правила изменения окончаний, то эта форма просто выписывается в базе начальных форм так, как будто это отдельная форма слова.
 

kvf77

Red Devil
SiMM

Эта ссылка к сожалению ведет на малопригодный скрипт - он практически совсем бесполезен. Приставок он вообще как класс не видит, с суффиксами еще более-менее, но и то не правильно каждое второе слово
 

Sniff

Новичок
Popoff
Ну полюбуйся, как твой абзац разобран Лебедевским ispell-ом:
лично -
мне - мне
словарях - словарь
ispell -
понравилось -
что - что
там - там
мало -
слов -
120000 -
слов -
200 -
000 -
словоформ -
имхо -
вполне - вполне
достаточно -
для - для
большинства - большинство
сайтов - сайт
что - что
там - там
считаются -
разными -
слова - слово
которые -
при - при
поиске - поиск
вплоне -
можно - можно
было -
учитывать - учитывать
как - как
одно - одно
слово - слово
например - например
словаре - словарь
лебедева -
который - который
сейчас - сейчас
смотрю -
слова - слово
отсечение - отсечение
отсечённый - отсечённый
это - это
разные -
слова - слово
если - если
ищу -
отсечение - отсечение
наверное - наверное
отсеченный -
тоже - тоже
могу -
хотеть - хотеть
найти - найти


Ну как по-твоему, достаточно для большинства сайтов?

Дело в том, что этот словарь изначально был предназначен для проверки орфографии, а не для поиска начальной формы слова. Если у какого-то слова есть форма, которая не подходит под общие правила изменения окончаний, то эта форма просто выписывается в базе начальных форм так, как будто это отдельная форма слова.
я понимаю, но, как видишь, очень много значимых слов просто не были распознаны вообще. Аффиксные правила порождают далеко не все формы, что вообще странно, учитывая, что Лебедев над этим словарем работает уже лет семь.

А мож кто знает, как устроена проверка орфографии в ОпенОфисе? Или еще где-нибудь?

-~{}~ 12.07.05 10:08:

О, спасибо, это как раз то, что я искал - стеммер на пхп. Пошел пробовать, насколько хорошо работает...
 

Long

Новичок
Sniff стеммер для русского языка практически не применим, получится чуть хуже (или на таком же уровне) как ispell.
Кстати, ты где-то ошибся при разборе предложения. По крайней мере 3 слова ("понравилось", "словоформ" и "разные") из тех, что у тебя без начальной формы, при проверке на моем словаре дают начальную форму. остальные просто не проверял. но что-то мне подсказывает - не правильно работает у тебя реализация. правда, у меня несколько измененые правила построения.
 

Sniff

Новичок
а пришли свой аффикс?
[email protected]

-~{}~ 12.07.05 12:33:

Да, действительно, проверил, кое-какие правила не выполняются... буду рыть....

-~{}~ 12.07.05 12:42:

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

Popoff

popoff.donetsk.ua
Автор оригинала: Sniff
Popoff
Ну полюбуйся, как твой абзац разобран Лебедевским ispell-ом:
я понимаю, но, как видишь, очень много значимых слов просто не были распознаны вообще. Аффиксные правила порождают далеко не все формы, что вообще странно, учитывая, что Лебедев над этим словарем работает уже лет семь.
ну, не знаю, не знаю. Я у себя в форуме сделал автоматическую проверку орфографии для добавляемых сообщений на основе как раз этого словаря. В процитированном тобой отрывке было обнаружено только три неправильных слова: "имхо", "вплоне" и "Лебедева". Слова "имхо" нет в русском языке, в слове "вплоне" действительно содержится опечатка, а "Лебедева" - это фамилия а не обычное слово. Все работает правильно - ищи ошибки у себя. Все желающие могут добавить свое сообщение и убедиться в полноте словаря Лебедева здесь (регистрация не требуется; проверка орфографии выполняется только для того, кто добавил сообщение):
http://popoff.donetsk.ua/forum/trash/Proverka.html
 

Long

Новичок
Sniff, у меня как такового аффикса не осталось - я правил сразу в функциях. могу выложить только исходники этих функций (для каждого флага). теоретически - по ним можно востановить правила :)
стеммер и аффиксные правила действительно используют разные подходы. на мой взгляд - стеммер даст большую ошибку (не зря же ispell для проверки орфографии изначально применяется). но на самом деле все зависит от исходной задачи - если нужно свести слова в тексте к начальной форме чтобы производить поиск только по этому множеству, то подойдет любой из подходов. поскольку самое главное однозначное соответствие форма-начальная форма (пусть и не начальная форма в понимании морфологии языка). если предполагается реализовывать какой-то серьезный морфологический разбор - не подойдет ни один из них. нужно смотреть в сторону работ www.aot.ru и др.
 

Silent

Новичок
Автор оригинала: Long
если нужно свести слова в тексте к начальной форме чтобы производить поиск только по этому множеству, то подойдет любой из подходов. поскольку самое главное однозначное соответствие форма-начальная форма
Нет никакой гарантии, что стеммер все словоформы одного слова в итоге приведет в ОДНОЙ начальной форме. Особенно это касается слов с чередованием. Так что с однозначным соответствием там есть проблемы.
 

Long

Новичок
Silent, так и ispell не приведет к одной форме. да и при реализации среднестатистического поиска - это и не нужно. нужно всего лишь привести исходное множество слов в другое множество, по которому и осуществляется поиск. кстати, рекомендую почитать доклад fisher'а на конференции http://detail.phpclub.ru/magazine/2004/10/

p.s. исправленные функции для ispell брать тут - http://cyberdot.ru/other/ispell_flag.zip . сразу скажу - результаты нужно вычищать, поскольку генерятся разные слова-исключения (победить-победу-побежу и т.п.)
 

Silent

Новичок
> нужно всего лишь привести исходное множество слов в другое множество

Так ведь проблема как раз в том, что на сайте может быть "словоформа1", которую стеммер преобразует в "основа1", а пользователь спросит "словоформа2", которую стеммер преобразует в "основа2" и соответсвенно поиск ничего не найдет, хотя на самом деле это были две словоформы одного слова. Испелл наверное будет немного получше, хотя я и от него давно отказался.
 

Long

Новичок
Silent, поскольку у ispell'а изначально предназначен для других целей, у него точно такие же проблемы. и на малых объемах текста такие проблемы будут критичны. при большом объеме индексируемого текста с большой долей вероятности будет найдена и основа1", и основа2".
 

kvf77

Red Devil
Long
ну это же понятно, что у проверки орфографии и приведением к основе разные задачи и они врядли пересекаются. тут как вариант - составить словарь основ (по идее в ispell он есть), а вот механизм нахождения основы явно нужно разрабатывать свой

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

Long

Новичок
kvf77, ispell позволит составить только основу будущей системы. далее - ее нужно вычищать и расширять вручую. а каким образом реализовывать алгоритм нахождения основной формы слова - это дело "десятое", тут главное словарь иметь хороший.
 
Сверху