| Author |
Message |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13556
Карма: 403 поощрить/наказать
|
Posted: Wed Feb 16, 2005 10:13 pm (написано за 2 минуты 33 секунды)
Post subject: Эвристическое (без словаря) извлечение корня из русского слова.
|
|
Стеммер Портера.
| Code (php): |
скопировать код в буфер обмена |
<?phpclass Lingua_Stem_Ru { var $VERSION = "0.02"; var $Stem_Caching = 0; var $Stem_Cache = array(); var $VOWEL = '/аеиоуыэюя/'; var $PERFECTIVEGROUND = '/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$/'; var $REFLEXIVE = '/(с[яь])$/'; var $ADJECTIVE = '/(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|ему|ому|их|ых|ую|юю|ая|яя|ою|ею)$/'; var $PARTICIPLE = '/((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$/'; var $VERB = '/((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ен|ило|ыло|ено|ят|ует|уют|ит|ыт|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$/'; var $NOUN = '/(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|иям|ям|ием|ем|ам|ом|о|у|ах|иях|ях|ы|ь|ию|ью|ю|ия|ья|я)$/'; var $RVRE = '/^(.*?[аеиоуыэюя])(.*)$/'; var $DERIVATIONAL = '/[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$/'; function s (& $s, $re, $to) { $orig = $s; $s = preg_replace($re, $to, $s); return $orig !== $s; } function m ($s, $re) { return preg_match($re, $s); } function stem_word ($word) { $word = strtolower($word); $word = strtr($word, 'ё', 'е'); # Check against cache of stemmed words if ($this-> Stem_Caching && isset($this-> Stem_Cache[$word])) { return $this-> Stem_Cache[$word]; } $stem = $word; do { if (! preg_match($this-> RVRE, $word, $p)) break; $start = $p[1]; $RV = $p[2]; if (! $RV) break; # Step 1 if (! $this-> s($RV, $this-> PERFECTIVEGROUND, '')) { $this-> s($RV, $this-> REFLEXIVE, ''); if ($this-> s($RV, $this-> ADJECTIVE, '')) { $this-> s($RV, $this-> PARTICIPLE, ''); } else { if (! $this-> s($RV, $this-> VERB, '')) $this-> s($RV, $this-> NOUN, ''); } } # Step 2 $this-> s($RV, '/и$/', ''); # Step 3 if ($this-> m($RV, $this-> DERIVATIONAL)) $this-> s($RV, '/ость?$/', ''); # Step 4 if (! $this-> s($RV, '/ь$/', '')) { $this-> s($RV, '/ейше?/', ''); $this-> s($RV, '/нн$/', 'н'); } $stem = $start. $RV; } while(false); if ($this-> Stem_Caching) $this-> Stem_Cache[$word] = $stem; return $stem; } function stem_caching ($parm_ref) { $caching_level = @ $parm_ref['-level']; if ($caching_level) { if (! $this-> m($caching_level, '/^[012]$/')) { die(__CLASS__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value"); } $this-> Stem_Caching = $caching_level; } return $this-> Stem_Caching; } function clear_stem_cache () { $this-> Stem_Cache = array(); }}?> |
Пример использования:
Естественно, библиотека иногда ошибается, однако в большинстве случаев все же срабатывает вполне удовлетворительно. Может использоваться в поисковых системах (здесь на форуме, к примеру).
Last edited by Дмитрий Кóтеров on Sat Feb 26, 2005 7:30 pm; edited 2 times in total
|
|
| Back to top |
|
 |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13556
Карма: 403 поощрить/наказать
|
|
| Back to top |
|
 |
Nick Bubelo
Заглянувший
Joined: 26 Feb 2005
Posts: 3
Карма: 0 поощрить/наказать
Location: Днепропетровск
|
Posted: Sat Feb 26, 2005 2:03 pm (спустя 9 дней 15 часов 47 минут)
Post subject:
|
|
Это стеммер Портера: http://snowball.tartarus.org/russian/stemmer.html
Алгоритм нуждается в маленькой доработке: перед началом стемминга в слове следует заменить все буквы 'ё' на 'е'. Сам Портер, кстати, на вышеуказанной страничке это же и советует.
|
|
| Back to top |
|
 |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13556
Карма: 403 поощрить/наказать
|
Posted: Sat Feb 26, 2005 7:32 pm (спустя 5 часов 28 минут; написано за 12 секунд)
Post subject:
|
|
| Поправил, спасибо.
|
|
| Back to top |
|
 |
Сый
Guest
Карма: 377 поощрить/наказать
|
Posted: Sun Aug 14, 2005 1:47 pm (спустя 5 месяцев 15 дней 18 часов 14 минут; написано за 3 минуты 5 секунд)
Post subject:
|
|
| Ну как я понял, скрипт вырезает лишь окончания и некоторые суффиксы. Но он не может различить (и не сможет) корень во многих словах, использующих, например суффикс "ок", ибо этот суффикс во многих случаях является частью корня. Так что словарь к такому скрипту должен прилагаться.
|
|
| Back to top |
|
 |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13556
Карма: 403 поощрить/наказать
|
Posted: Sun Aug 14, 2005 2:46 pm (спустя 59 минут; написано за 17 секунд)
Post subject:
|
|
Кому "должен"? Вы читали, что такое "стеммер Портера"?
|
|
| Back to top |
|
 |
Eugene Babushkin
Участник форума

Joined: 01 Aug 2003
Posts: 263
Карма: 3 поощрить/наказать
Location: 59, Russia
|
|
| Back to top |
|
 |
vutsh
Guest
Карма: 377 поощрить/наказать
|
Posted: Thu Feb 01, 2007 3:04 pm (спустя 1 год 5 месяцев 14 дней 6 минут; написано за 16 секунд)
Post subject:
|
|
'/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$/'; чем здесь віступает ая.
|
|
| Back to top |
|
 |
cosmos
Guest
Карма: 377 поощрить/наказать
|
Posted: Thu Jul 12, 2007 2:02 pm (спустя 5 месяцев 10 дней 22 часа 58 минут; написано за 24 секунды)
Post subject:
|
|
не могу понять на локале класс работает копирую на хостинг не фига не пашет
|
|
| Back to top |
|
 |
cosmos-web
Guest
Карма: 377 поощрить/наказать
|
Posted: Sun Jul 22, 2007 11:23 am (спустя 9 дней 21 час 21 минуту; написано за 4 секунды)
Post subject:
|
|
| strtolower
|
|
| Back to top |
|
 |
Setti
Guest
Карма: 377 поощрить/наказать
|
Posted: Fri Sep 14, 2007 9:38 am (спустя 1 месяц 22 дня 22 часа 14 минут; написано за 40 секунд)
Post subject:
|
|
| Подскажите, пожалуйста, как подключить к этому стеммеру словарь словоформ? Спасибо.
|
|
| Back to top |
|
 |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13556
Карма: 403 поощрить/наказать
|
Posted: Thu Sep 27, 2007 6:38 pm (спустя 13 дней 9 часов 6 секунд; написано за 24 секунды)
Post subject:
|
|
| Никак не подключить. Словоформы - совершенно отдельная штука. Ищите по словам "php ispell".
|
|
| Back to top |
|
 |
Константин Жинько [tIT]
Сотрудник «Лаборатории»

Joined: 12 Jun 2004
Posts: 2265
Карма: 108 поощрить/наказать
Location: Москва
|
Posted: Tue Oct 02, 2007 2:57 pm (спустя 4 дня 20 часов 19 минут; написано за 2 минуты 13 секунд)
Post subject:
|
|
Пришло письмо недавно от некой конторы, которая вроде как подрядилась нашей текстовой оптимизацией заниматься примерно следующего содержания:
| Quote: |
|
Мы вот тут нашли код для определения словоформ, который поможет вам улучшить поиск на сайте:
|
Посмеялся (-;
|
|
| Back to top |
|
 |
Никита Ковалев
Guest
Карма: 377 поощрить/наказать
|
Posted: Fri Jan 18, 2008 11:40 am (спустя 3 месяца 15 дней 20 часов 43 минуты; написано за 1 минуту 14 секунд)
Post subject:
|
|
Замену нужно делать не так: $word = strtr($word, 'ё', 'е'); а так $word = strtr($word, array('ё'=>'е')); В теории отличаться не должно, в реальности с Unicode работает правильно только второй вариант. (PHP 5.2.3)
|
|
| Back to top |
|
 |
deli6z
Заглянувший
Joined: 03 Oct 2007
Posts: 3
Карма: 1 поощрить/наказать
|
Posted: Mon Mar 03, 2008 11:37 pm (спустя 1 месяц 16 дней 11 часов 56 минут; написано за 1 минуту 10 секунд)
Post subject:
|
|
никому не попадалось на глаза вот такое: Пользователь вводит русскуюсловоформу и получает нормальную форму и морфологические атрибуты либо, по желанию, всю парадигму слова. пример сервиса http://www.aot.ru/demo/morph.html
|
|
| Back to top |
|
 |
Gilthoniel
Guest
Карма: 377 поощрить/наказать
|
Posted: Sat Mar 08, 2008 9:21 pm (спустя 4 дня 21 час 43 минуты; написано за 31 секунду)
Post subject:
|
|
| А нет ли где-нибудь такой же красивой и готовой на PHP реализации того же алгоритма, только для английского языка?
|
|
| Back to top |
|
 |
virus126
Guest
Карма: 377 поощрить/наказать
|
Posted: Fri Mar 28, 2008 11:25 am (спустя 19 дней 14 часов 3 минуты; написано за 24 секунды)
Post subject:
|
|
| эхх... кровать-кроватить... :\
|
|
| Back to top |
|
 |
bolteg86
Guest
Карма: 377 поощрить/наказать
|
Posted: Fri Jun 06, 2008 1:20 pm (спустя 2 месяца 9 дней 1 час 54 минуты; написано за 2 минуты 18 секунд)
Post subject:
|
|
| У меня всё отлично работает на денвере. ВСЁ ПРСТО ОТМЕННО. Разработал такую штуку, которая ищет введённые слова по базе данных во всех формах с учётом чередований в корнях даже. Но на сервере, на зеноне эта хрень не работает. Корень не выделяется. Чё делать, подскажите, плиз
|
|
| Back to top |
|
 |
rassol
Guest
Карма: 377 поощрить/наказать
|
Posted: Sat Jun 21, 2008 3:34 pm (спустя 15 дней 2 часа 14 минут; написано за 2 минуты 23 секунды)
Post subject:
|
|
Спасибо за стеммер. Работает на ура (правда таки да, ошибается). Небольшое дополнение от мну:
у меня некорректно работала с UTF-8 general_ci; Поэтому советую заменить на более универсальную
|
|
| Back to top |
|
 |
qfox.ru
Guest
Карма: 377 поощрить/наказать
|
Posted: Mon Dec 01, 2008 10:05 pm (спустя 5 месяцев 10 дней 6 часов 30 минут; написано за 4 минуты 26 секунд)
Post subject: script, utf8 & debian
|
|
С утф изза регулярок дикая проблема. После танцов с бубном выяснилось, что класс выделяет НЕ КОРЕНЬ слова, а его ОСНОВУ. Жалко :( p.s. Работу скрипта под дебианом с утф решал примерно так:
| Code (any language): |
скопировать код в буфер обмена |
// для начала локаль, если не стоит как надо. mb_regex_encoding( 'UTF-8' ); mb_internal_encoding( 'UTF-8' ); // меняем strtolower на mb_strtolower // меняем strtr на str_replace( 'ё', 'е', $word ) // далее меняем preg_replace на mb_ereg_replace в функции s // далее меняем preg_match на mb_ereg_match в функции m // и меняем preg_match в функции word на mb_ereg // удаляем ограничители (/) во всех выражениях. не забываем про функцию word |
|
|
| Back to top |
|
 |
Миша Спларов
Участник форума

Joined: 17 Nov 2003
Posts: 823
Карма: 65 поощрить/наказать
Location: Россия, Томск
|
Posted: Tue Dec 02, 2008 7:27 am (спустя 9 часов 21 минуту; написано за 1 минуту 4 секунды)
Post subject:
|
|
qfox.ru
Не правильно решали, в preg_replace есть модификатор "u". И синтаксис pcre отличается от синтаксиса posix - одинаковая работа тех же регулярных выражений - случайное совпадение.
|
|
| Back to top |
|
 |
Elfet
Заглянувший
Banned
Joined: 27 Jan 2007
Posts: 8
Карма: -1 поощрить/наказать
|
Posted: Thu Feb 05, 2009 12:24 pm (спустя 2 месяца 3 дня 4 часа 57 минут; написано за 20 секунд)
Post subject:
|
|
У меня под UTF-8 выдаёт вот что: ������� Как исправить?
|
|
| Back to top |
|
 |
almix
Guest
Карма: 377 поощрить/наказать
|
Posted: Mon Jun 08, 2009 4:03 pm (спустя 4 месяца 3 дня 3 часа 38 минут; написано за 14 секунд)
Post subject:
|
|
| спасибо! очень помогло qfox.ru , вамотдельное спасибо за правки!
|
|
| Back to top |
|
 |
Gamer09
Guest
Карма: 377 поощрить/наказать
|
Posted: Thu Jun 18, 2009 3:16 am (спустя 9 дней 11 часов 12 минут; написано за 19 секунд)
Post subject:
|
|
| А как это реализовать на Delphi кто-нибудь знает?
|
|
| Back to top |
|
 |
Александр Firestarte1987
Guest
Карма: 377 поощрить/наказать
|
Posted: Mon Nov 30, 2009 12:52 am (спустя 5 месяцев 11 дней 21 час 36 минут; написано за 15 секунд)
Post subject: Не подскажите как по этому алгиритму определить часть речи
|
|
| Подскажите пожалуйста
|
|
| Back to top |
|
 |
78464
Guest
Карма: 377 поощрить/наказать
|
Posted: Tue Jan 12, 2010 7:43 pm (спустя 1 месяц 12 дней 18 часов 51 минуту; написано за 36 секунд)
Post subject:
|
|
| ваще не могу прочитать!!! на китайском написано чтоли????!!!!
|
|
| Back to top |
|
 |
bæv
Модератор «Дзена»

Joined: 27 Aug 2003
Posts: 6809
Карма: ∞ поощрить/наказать
|
Posted: Tue Jan 12, 2010 8:36 pm (спустя 52 минуты; написано за 34 секунды)
Post subject:
|
|
| 78464 wrote: |
|
ваще не могу прочитать!!! на китайском написано чтоли????!!!! |
— это Вы про что?
|
|
| Back to top |
|
 |
Guest
Карма: 377 поощрить/наказать
|
Posted: Thu Feb 18, 2010 5:57 pm (спустя 1 месяц 5 дней 21 час 20 минут; написано за 54 секунды)
Post subject:
|
|
| Gamer09 wrote: |
|
А как это реализовать на Delphi кто-нибудь знает? |
Uses RegExpr function TForm1.WordStem(InWord: String):String; function ExistReg(var InStr:String; RgExp, RpStr : String):Boolean; var TempStr: String; begin TempStr := ReplaceRegExpr(RgExp, InStr, RpStr); Result := TempStr <> InStr; InStr := TempStr; end; var RVRE, PERFECTIVEGROUND, REFLEXIVE, ADJECTIVE, PARTICIPLE, VERB, NOUN, DERIVATIONAL: String; RE: TRegExpr; Stem, Start, Rv: String; begin Result := ''; RE := TRegExpr.Create; try RVRE := '^(.*?[аеиоуыэюя])(.*)$'; PERFECTIVEGROUND := '((ив|ивши|ившись|ыв|ывши|ывшись)|(((?i)[ая])(в|вши|вшись)))$'; REFLEXIVE := '(с[яь])$'; ADJECTIVE := '(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|ему|ому|их|ых|ую|юю|ая|яя|ою|ею)$'; PARTICIPLE := '((ивш|ывш|ующ)|(((?i)[ая])(ем|нн|вш|ющ|щ)))$'; VERB := '((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ен|ило|ыло|ено|ят|ует|уют|ит|ыт|ены|ить|ыть|ишь|ую|ю)|(((?i)[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$'; NOUN := '(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|иям|ям|ием|ем|ам|ом|о|у|ах|иях|ях|ы|ь|ию|ью|ю|ия|ья|я)$'; DERIVATIONAL := '[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*((?i)о)сть?$'; InWord := LowerCase(InWord); InWord := StringReplace(InWord, 'ё', 'е', [rfReplaceAll]); Stem := InWord; repeat RE.Expression := RVRE; if not RE.Exec(Stem) then Break; Start := RE.Match[1]; Rv := RE.Match[2]; if not ExecRegExpr(RVRE, Rv) then Break; if not(ExistReg(Rv, PERFECTIVEGROUND, '')) then ExistReg(Rv, REFLEXIVE, ''); if (ExistReg(Rv, ADJECTIVE, '')) then ExistReg(Rv, PARTICIPLE, '') else if not(ExistReg(Rv, VERB, '')) then ExistReg(Rv, NOUN, ''); ExistReg(Rv, 'и$', ''); if ExecRegExpr(DERIVATIONAL, Rv) then ExistReg(Rv, 'ость?$', ''); if not ExistReg(Rv, 'ь$', '') then begin ExistReg(Rv, 'ейше?', ''); ExistReg(Rv, 'нн$', 'н'); end; Stem := Start+Rv; Until true; Result := Stem; finally if Assigned (RE) then RE.Free; end; end;
|
|
| Back to top |
|
 |
Guest
Карма: 377 поощрить/наказать
|
Posted: Wed May 26, 2010 11:48 am (спустя 3 месяца 7 дней 17 часов 51 минуту; написано за 2 минуты 30 секунд)
Post subject:
|
|
| Можно алгоритм в коммерческих проектах использоть? К примеру поиск в системе управления сайтом реализовать на этом алгорите, потом получить патент и продавать?
|
|
| Back to top |
|
 |
zael
Заглянувший
Banned

Joined: 28 May 2010
Posts: 3
Карма: -4 поощрить/наказать
|
Posted: Fri May 28, 2010 3:20 pm (спустя 2 дня 3 часа 31 минуту; написано за 3 минуты 59 секунд)
Post subject:
|
|
| Anonymous wrote: |
|
Можно алгоритм в коммерческих проектах использоть? К примеру поиск в системе управления сайтом реализовать на этом алгорите, потом получить патент и продавать? |
это что-бы как у google однокоренные в выдачу попадали, так что не получится запатентовать.
|
|
| Back to top |
|
 |
Guest
Карма: 377 поощрить/наказать
|
Posted: Sun May 30, 2010 9:26 pm (спустя 2 дня 6 часов 6 минут; написано за 5 минут 21 секунду)
Post subject:
|
|
| zael wrote: |
|
это что-бы как у google однокоренные в выдачу попадали, так что не получится запатентовать. |
Нет, не систему поиска запатентовать, а CMS с поиском, использующем этот алгоритм? Т. е. имею ли я право пользоваться алготритмом как хочу, и в коммерческих целях?
|
|
| Back to top |
|
 |
TruBrite
Заглянувший
Banned
Joined: 06 Jun 2010
Posts: 3
Карма: -1 поощрить/наказать
|
Posted: Sun Jun 06, 2010 4:43 pm (спустя 6 дней 19 часов 16 минут; написано за 12 секунд)
Post subject:
|
|
| Спасибо!!!
|
|
| Back to top |
|
 |
Nurmaga
Заглянувший
Joined: 14 Nov 2010
Posts: 1
Карма: 0 поощрить/наказать
|
Posted: Sun Nov 14, 2010 12:28 pm (спустя 5 месяцев 7 дней 19 часов 45 минут; написано за 6 секунд)
Post subject:
|
|
| Подскажите пожалуйста, как все это реализовать на самописанном сайте? этот скрипт ищет совпадений в файлах или в базе?
|
|
| Back to top |
|
 |
TheWall
Заглянувший
Joined: 13 Jan 2011
Posts: 1
Карма: 0 поощрить/наказать
|
Posted: Thu Jan 13, 2011 10:51 pm (спустя 1 месяц 29 дней 10 часов 22 минуты; написано за 1 минуту 18 секунд)
Post subject:
|
|
подскажите как это реальзовать на windows-1251 (cp1251) все, вроде бы, работает но вместо слов вылазят краказябры
|
|
| Back to top |
|
 |
bæv
Модератор «Дзена»

Joined: 27 Aug 2003
Posts: 6809
Карма: ∞ поощрить/наказать
|
Posted: Fri Jan 21, 2011 3:36 pm (спустя 7 дней 16 часов 44 минуты)
Post subject:
|
|
 М |
|
Ветка выделена в отдельную тему «мусор», расположенную в форуме Мусоропровод (21 Января 2011, 15:36). |
|
|
| Back to top |
|
 |
|