#regex #perl #perl-module
#регулярное выражение #perl #perl-модуль
Вопрос:
Я создал пользовательский словарь, который содержит список слов. Теперь план состоит в том, чтобы создать программу на Perl, которая берет слово и генерирует список слов (скажем, 5 из них), которые ближе всего (лексический порядок) к данному слову из этого словаря. Теперь я хотел бы знать, есть ли уже доступный модуль, который помогает мне это сделать. Если нет, то как мне добиться этого? Заранее спасибо
Комментарии:
1. Если бы у вас было
foot
, вы бы хотелиfooster, foosterer, footage, footback, football
?
Ответ №1:
Я предполагаю, что вы работаете над функцией автоматической коррекции. Я работал над аналогичной функцией, и Text::Проверка орфографии действительно мне очень помогла. Этот модуль использует aspell
или hunspell
в фоновом режиме, поэтому многоязычная поддержка также присутствует. Он проверяет слова с орфографической ошибкой и предоставляет предложения для того же.
use Text::SpellChecker;
($Text::SpellChecker::pre_hl_word,
$Text::SpellChecker::post_hl_word) = (qw([ ]));
my $checker = Text::SpellChecker->new(text => "Foor score and seven yeers ago");
while (my $word = $checker->next_word) {
print $checker->highlighted_text,
"n",
"$word : ",
(join "t", @{$checker->suggestions}),
"nChoose a new word : ";
chomp (my $new_word = <STDIN>);
$checker->replace(new_word => $new_word) if $new_word;
}
Надеюсь, это поможет.
Ответ №2:
Да, Search::Dict эффективно найдет слово или ближайшее слово в файле словаря. Эта программа найдет слова вокруг введенного слова.
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use v5.10;
use Search::Dict;
use POSIX qw(ceil floor);
my $target = shift;
my $Window_Size = 5;
my @window;
open my $fh, "/usr/share/dict/words";
# Find the spot in the file where the word
# is >= our word.
# Use dictinoary order and ignore case.
my $pos = look $fh, $target, 1, 1;
# Add the next words
for(1..ceil($Window_Size/2)) {
my $word = <$fh>;
chomp $word;
redo if $word eq $target;
push @window, $word;
}
# Read the previous block of words
my $string;
seek $fh, $pos - 256, 0;
read $fh, $string, 256;
my @previous_words = split /n/, $string;
# Add them to our list at the front.
for(1..floor($Window_Size/2)) {
unshift @window, pop @previous_words;
}
say join ", ", @window;
Например…
$ perl ~/tmp/test.plx foot
fooster, foosterer, footage, footback, football
Крайние случаи, например, что, если ваше слово «A» или «Zyzzogeton», оставлены в качестве упражнения.