The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Поиск похожих слов на Perl (нечеткий поиск).


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова:  (найти похожие документы)
Date: Thu, 02 Sep 2004 11:03:17 +0600 From: yurik shestakov <yu.trap@frigate.kiev.ua.> Newsgroups: ftn.ru.perl Subject: Поиск похожих слов на Perl (нечеткий поиск). MP> Здравствуйте. Существует ли распространенный алгоритм/модуль для MP> поиска слов в словаре, даже если введенное слово отличается от требуемого MP> - лишняя буква в любой позиции MP> - отсутствующая буква в любой позиции MP> - неверная буква MP> - перепутанные местами буквы MP> Причем желательно варьировать количество изменяемых при поиске букв. MP> Естественно, найденых слов может быть найдено более одного. MP> Что посоветуете? MP> З.Ы. Пример: должно быть найдено слово "паровоз" на введенные слова MP> "паравоз", "парвоз", "паро-воз". google://Levenshtein use Text::Levenshtein qw(distance fastdistance); print distance("foo","four"), "\n"; # печатает "2" print fastdistance("foo","four"), "\n"; # печатает "2" faster $"=','; my @words=("four","foo","bar"); my @distances=distance("foo",@words); print "@distances\n"; # печатает "2 0 3" my $word = "опечатка"; foreach (qw/очепятка опчатка печатка/) { print "LD('$word','$_')=",fastdistance($word, $_),"\n"; } MP> З.Ы. База - Mysql, если есть встроенные средства, тоже подойдут. AFAIR, нету.
From: "Anton Y. Shevtsov" <shevtsov@tngf.ru.> > З.Ы. Пример: должно быть найдено слово "паровоз" на введенные слова > "паравоз", "парвоз", "паро-воз". Это называется нечеткий поиск. Общего способа нет. Кто-то пытается считать сумму кодов букв в слове и тогда при выпадении одной ссумма найденного слова не очень будет отличатся от заданного.. но все это лажа)) особенно на коротких словах.. чтобы сделать реально работающее, нужно приложить математику. Вообщето для этого полно в инете http://www.3ka.mipt.ru/vlib/books/Programming/ComputerScience/StryngAnalysis/index.html http://algolist.manual.ru/search/fsearch/ http://www.delphikingdom.com/asp/viewitem.asp?catalogid=722 http://www.pereplet.ru/nauka/perl/find.html у буржуев это назвается fuzzy logic (вроде)
From: Artur Penttinen <artur+usenet@niif.spb.su> Newsgroups: ftn.ru.perl Subject: Поиск похожего? MP> З.Ы. Пример: должно быть найдено слово "паровоз" на введенные MP> слова "паравоз", "парвоз", "паро-воз". AC> Алгоритм - да. Вот, правда, слово вылетело из головы. Он лучше AC> работает для английского, где нет развесистых склонений. AC> Поскольку слово я забыл, могу порекомендовать поискать по AC> английскому переводу слова "созвучие". Модуль, кажется, тоже был. алгоритм soundex, модуль Text::Soundex

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, Андрей_У (?), 22:24, 26/08/2005 [ответить]  
  • +/
    Можно использовать регулярные выражения

    Во время теста этого метода со словарем Зализняка (108000 слов) скорость
    поиска опечаток составляла около 60000 слов в секунду.

    #------------------------
    #!/usr/bin/perl

    #слово, которое проверяем
    $query="парвоз";

    #массив со словарём
    @words=("пароход","паровоз","самолёт"); # и т.д.

    foreach $word(@words) {
    if ($word =~/^(п(.{0,2})рвоз|па(.{0,2})воз|пар(.{0,2})оз|парв(.{0,2})з|парво(.{0,2}))$/) {

    print "$1"; #здесь и будет "паровоз"

    } #/if;
    elsif ($word =~/^(п(.{0,3})воз|па(.{0,3})оз|пар(.{0,3})з|парв(.{0,3}))$/) {

    print "$1"; #здесь тоже будет "паровоз"

    } #/elsif;

    } #/foreach;

    #------------------------

    Как загнать "парвоз" в регулярное выражение (с помощью цикла!) подумай сам.

     
  • 2, виктория (?), 16:42, 25/10/2010 [ответить]  
  • +/
    ком
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру