Как сгенерировать список предложений для данного слова в Perl?

#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», оставлены в качестве упражнения.