gpt4 book ai didi

perl - 如何使用 Perl 的 Text::Aspell 对文本进行拼写检查?

转载 作者:行者123 更新时间:2023-12-04 16:23:12 24 4
gpt4 key购买 nike

我想在我的 Perl 程序中添加拼写检查。看起来像 Text::Aspell应该做我需要的,但它只提供检查单个单词的功能。

use strict;
use warnings;
use Text::Aspell;

my $input = "This doesn't look too bad. Me&you. with/without. 1..2..3..go!";
my $aspell = Text::Aspell->new();
$aspell->set_option('lang', 'en');
print "$input: ", $aspell->check($input), "\n";

打印出来:

This doesn't look too bad. Me&you. with/without. 1..2..3..go!: 0

很明显它只需要单个单词,那么我如何将文本分成单词?一个简单的 split 在空白处:

foreach my $word (split /\s/, $input) {
next unless($word =~ /\w/);
print "$word: ", $aspell->check($word), "\n";
}

这会导致没有空格的标点符号出现问题:

This: 1
doesn't: 1
look: 1
too: 1
bad.: 0
Me&you.: 0
with/without.: 0
1..2..3..go!: 0

我想我可以提一下标点符号:

foreach my $word (split qr{[,.;!:\s#"\?&%@\(\)\[\]/\d]}, $input) {
next unless($word =~ /\w/);
print "$word: ", $aspell->check($word), "\n";
}

这会得到合理的输出:

This: 1
doesn't: 1
look: 1
too: 1
bad: 1
Me: 1
you: 1
with: 1
without: 1
go: 1

但看起来很笨拙,我想知道是否有更简单(我要编写的代码更少,不那么脆弱)的方式。

如何对文本进行拼写检查?

最佳答案

Text::Aspell 没有检查整个字符串的选项,而是只检查单个单词。我建议不要自己拆分字符串,而是使用已经为您执行此操作的模块,例如 Text::SpellChecker .例如:

use strict;
use warnings;
use Text::SpellChecker;
use feature 'say';

my $input = "This doesn't look too bad. Me&you. with/without. 1..2..3..go!";
my $checker = Text::SpellChecker->new(text => $input);
$checker->set_options(aspell => { 'lang' => 'en' });

while (my $word = $checker->next_word) {
say "Invalid word: $word";
}

或者,

my $checker = Text::SpellChecker->new(text => $input);
$checker->set_options(aspell => { 'lang' => 'en' });

if ($checker->next_word) {
say "The string is not valid.";
} else {
say "The string is valid.";
}

documentation模块的 展示了如何以交互方式替换错误的单词:

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;
}

如果您想单独检查输入字符串的每个单词,您可以查看 Text::SpellCheck 如何将字符串拆分为单词(由 next_word 函数完成)。它使用以下正则表达式:

while ($self->{text} =~ m/\b(\p{L}+(?:'\p{L}+)?)/g) { 
...
}

关于perl - 如何使用 Perl 的 Text::Aspell 对文本进行拼写检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69444407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com