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、segurança など) を含むさまざまな言語の文字列や、非ラテン アルファベット (ギリシャ語、アラビア語など) の文字列をチェックする必要があります。

これらの場合の問題は、ASCII 以外の単語が正しくセグメント化されておらず、Hunspell に送信された「スペルミス」の単語が実際には完全な単語ではなく部分文字列であることです (必要に応じて、セグラン)。

問題が発生した場所を追跡しようとしましたが、文字列がリソースに変換されたとき (またはその後のどこか) に、上記のリンクされたクラスの 072 行目にあるに違いないと思います。行 072 には以下が含まれます。

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

クラスはコメントされていないので、そこで何が起こっているのかよくわかりません。

誰かが同様の問題に対処しましたか、または誰かが助けてくれますか?

このクラスは、examples/HunspellBased.php ファイル ( http://titirit.users.phpclasses.org/package/5597-PHP-Check-spelling-of-text-and-get-fix-suggestions.htmlからダウンロードしたパッケージ) に含まれています。 )。Enchant を使用しようとしましたが、まったく機能しませんでした。

ありがとうございました!乾杯、マヌエル

4

2 に答える 2

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 に答える
0

あなたの問題は、HTML エンティティか、辞書ファイルの問題だと思います。

Mozilla アドオンからダウンロードしたポルトガル語辞書で例を試してみると、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

ここpt_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 に答える