1

我正在尝试使用 HunSpellChecker 类拼写检查字符串(请参阅https://web.archive.org/web/20130311163032/http://www.phpkode.com/source/s/php-spell-checker/php- spell-checker/HunSpellChecker.class.php ) 和 hunspell 拼写引擎。相关函数复制到这里:

public function checkSpelling ($text, $locale, $suggestions = true) {
     
    $text = trim($text);
     
    if ($this->textIsHtml == true) {
        $text = strtr($text, "\n", ' ');
    } elseif ($text == "") {
        $this->spellingWarnings[] = array(self::SPELLING_WARNING__TEXT_EMPTY=>"Text empty");
        return false;
    }
     
    $descspec = array(
                      0=>array('pipe', 'r'),
                      1=>array('pipe', 'w'),
                      2=>array('pipe', 'w')
                );
     
    $pipes = array();
    $cmd  = $this->hunspellPath;
    $cmd .= ($this->textIsHtml) ? " -H ":"";
    $cmd .= " -d ".dirname(__FILE__)."/dictionaries/hunspell/".$locale;
     
    $process = proc_open($cmd, $descspec, $pipes);
     
    if (!is_resource($process)) {
        $this->spellingError[] = array(self::SPELLING_ERROR__INTERNAL_ERROR=>"Hunspell process could not be created.");
        return false;
    }
     
    fwrite($pipes[0], $text);
    fclose($pipes[0]);
     
    $out = '';
    while (!feof($pipes[1])) {
        $out .= fread($pipes[1], 4096);
    }
    fclose($pipes[1]);
     
    // check for errors
    $err = '';
    while (!feof($pipes[2])) {
        $err .= fread($pipes[2], 4096);
    }
    if ($err != '') {
        $this->spellingError[] = array(self::SPELLING_ERROR__INTERNAL_ERROR=>"Spell checking error: ".$err);
        fclose($pipes[2]);
        return false;
    }
    fclose($pipes[2]);
     
    proc_close($process);
     
    if (strlen($out) === 0) {
        $this->spellingError[] = array(self::SPELLING_WARNING__EMPTY_RESULT=>"Empty result");
        return false;
    }
     
    return $this->parseHunspellOutput(explode("\n", $out), $locale, $suggestions);
}

它适用于 ASCII 字符串,但我必须检查不同语言的字符串,这些字符串具有重音字符(necessário、segrança 等)或非拉丁字母(希腊语、阿拉伯语等)。

在这些情况下的问题是非 ASCII 单词被错误地分段,并且发送到 Hunspell 的“拼写错误”的单词实际上是一个子字符串而不是完整的单词(necess,segran)。

我试图跟踪问题发生的位置,并且我假设它必须在上面链接的类的第 072 行中,当字符串被转换为资源时(或之后的某个地方)。第 072 行包含:

fwrite($pipes[0], $text);

该课程没有评论,所以我不确定那里发生了什么。

有没有人处理过类似的问题,或者有人可以提供任何帮助吗?

该类包含在文件示例/HunspellBased.php 中(从http://titirit.users.phpclasses.org/package/5597-PHP-Check-spelling-of-text-and-get-fix-suggestions.html下载的包)。我尝试使用 Enchant,但我根本无法让它发挥作用。

谢谢!干杯,曼努埃尔

4

2 回答 2

0

我认为您的问题要么是 HTML 实体,要么是您的字典文件有问题。

使用从Mozilla add-ons下载的葡萄牙语词典尝试您的示例,我只能在使用 HTML 编码实体时重现您的问题。即segurança很好,但是segurança正如你所说的那样被分段。

我不认为这是班级的问题。该类所做的只是将文本通过管道传输到命令行程序。您可以通过直接使用程序来消除 PHP 类的问题,如下所示:

php-spell-checker/dictionaries/hunspell根据上面的代码,将工作目录更改为您拥有字典的位置。准备一个包含要测试的重音单词的文本文件,然后执行以下操作:

hunspell -l -d pt-PT test.text

或者对于 HTML:

hunspell -l -d pt-PT -H test.html

wherept_PT表示葡萄牙语词典文件对的名称,即pt-PT.affpt–PT.dic

没有输出意味着没有错误。如果您仅在使用 HTML 实体时获得“必要”之类的部分词,那么这就是您的问题。如果不是,那么它要么是某种其他类型的字符串编码问题,要么是您正在使用的字典的问题。

我怀疑这是 hunspell 的 HTML 解析器的一个限制——它忽略了 HTML 标记和其他标点实体,但不会包含和解码中间有实体的单词。

解决此问题的唯一方法(假设 HTML 是您的问题)是在将 HTML 发送到拼写检查之前进行自己的预处理。PHPhtml_entity_decode将转换ç -> ç,因此您可以尝试在每个字符串上调用它。理想情况下,您会解析 HTML DOM 并仅提取文本节点。

如果 HTML 不是您的问题,请检查字符串是否为有效的 UTF-8。

尝试另一个字典文件失败。我从 Mozilla 获取的那个可以很好地处理纯文本。只需将.xpi文件重命名为.gzip,使用您拥有的任何解压缩软件将其展开,然后将.dic.aff文件复制到您的字典文件夹中。

于 2014-07-09T10:29:44.110 回答
0

我认为您可以添加 After :

$cmd  = $this->hunspellPath;
$cmd .= ($this->textIsHtml) ? " -H ":"";
$cmd .= " -d ".dirname(__FILE__)."/dictionaries/hunspell/".$locale;

添加

$cmd .= " -i UTF-8";
于 2016-06-22T22:29:48.627 回答