PHP の similar_text() 関数と levenshtein() 関数を使用して、配列に読み込まれた辞書の単語を比較する単純な PHP スペルチェッカーおよび提案アプリケーションを作成しました。
- 仕組み: まず、辞書の内容を配列に読み込みます。
- ユーザーの入力を単語に分割し、各単語のスペル チェックを行います。
- 辞書である配列に単語が含まれているかどうかをチェックして、スペルチェックを行います。
- そうであれば、お祝いのメッセージをエコーして次に進みます。
- そうでない場合は、ディクショナリ配列内の各単語と想定されるスペルミスを比較して、ディクショナリ配列を反復処理します。
- 入力された単語 (小文字で句読点なし) が辞書配列内の単語と 90% 以上類似している場合、その単語を辞書配列から提案の配列にコピーします。
- 90% 以上の類似度比較を使用して提案が見つからなかった場合は、levenshtein() を使用してより自由な比較を行い、提案配列に提案を追加します。
- 次に、提案配列を繰り返し処理し、各提案をエコーします。
これがゆっくりと実行されていることに気付きました。気付くのに十分遅い。そして、このスペル チェッカーの速度と効率を改善するにはどうすればよいか考えていました。
すべての変更、改善、提案、およびコードは歓迎され、高く評価されます。
コードは次のとおりです (構文が強調表示されたコードについては、こちらを参照してください)。
<?php
function addTo($line) {
return strtolower(trim($line));
}
$words = array_map('addTo', file('dictionary.txt'));
$words = array_unique($words);
function checkSpelling($input, $words) {
$suggestions = array();
if (in_array($input, $words)) {
echo "you spelled the word right!";
}
else {
foreach($words as $word) {
$percentageSimilarity = 0.0;
$input = preg_replace('/[^a-z0-9 ]+/i', '', $input);
similar_text(strtolower(trim($input)), strtolower(trim($word)), $percentageSimilarity);
if ($percentageSimilarity >= 90 && $percentageSimilarity<100) {
if(!in_array($suggestions)){
array_push($suggestions, $word);
}
}
}
if (empty($suggestions)) {
foreach($words as $word) {
$input = preg_replace('/[^a-z0-9 ]+/i', '', $input);
$levenshtein = levenshtein(strtolower(trim($input)), strtolower(trim($word)));
if ($levenshtein <= 2 && $levenshtein>0) {
if(!in_array($suggestions)) {
array_push($suggestions, $word);
}
}
}
}
echo "Looks like you spelled that wrong. Here are some suggestions: <br />";
foreach($suggestions as $suggestion) {
echo "<br />".$suggestion."<br />";
}
}
}
if (isset($_GET['check'])) {
$input = trim($_GET['check']);
$sentence = '';
if (stripos($input, ' ') !== false) {
$sentence = explode(' ', $input);
foreach($sentence as $item){
checkSpelling($item, $words);
}
}
else {
checkSpelling($input, $words);
}
}
?>
<!Doctype HTMl>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Spell Check</title>
</head>
<body>
<form method="get">
<input type="text" name="check" autocomplete="off" autofocus />
</form>
</body>
</html>