我构建了一个简单的 PHP 拼写检查和建议应用程序,它使用 PHP 的similar_text() 和 levenshtein() 函数来比较字典中加载到数组中的单词。
- 它是如何工作的:首先我将字典的内容加载到一个数组中。
- 我将用户的输入拆分为单词并对每个单词进行拼写检查。
- 我通过检查单词是否在字典数组中来进行拼写检查。
- 如果是,那么我会回应祝贺信息并继续前进。
- 如果不是,我遍历字典数组,将字典数组中的每个单词与假设的拼写错误进行比较。
- 如果输入的单词(小写且没有标点符号)与字典数组中的单词有 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>