pspell и aspell с php для немецкого языка
Я пытаюсь использовать pspell в сочетании с aspell для PHP.
Я установил его таким образом:
sudo apt-get install libpspell-dev
sudo apt-get install php5-pspell
sudo apt-get install aspell-de
После этого вот пример кода:
$pspell_link = pspell_new("de");
var_dump(pspell_check($pspell_link, "Verkäuferin"));
if (!pspell_check($pspell_link, "Verkäuferin")) {
$vorschlaege = pspell_suggest($pspell_link, "verkäuferin");
foreach ($vorschlaege as $vorschlag) {
echo "Mögliche Schreibweise:" . $vorschlag . "<br>";
}
}
Есть две проблемы:
- Этот пример не понимает умлауты по-немецки
- Для субстантивных они должны быть в верхнем регистре, так что pspell_check возвращает true. Когда у меня есть слова в нижнем регистре, как стать правдой? Например, "Ball" вернет true, но "ball" вернет false. Как решить, что для "шарика" чек также вернет true?
2 ответа
Попробуйте указать кодировку символов. Я смог заставить ваш код работать, просто изменив первую строку на:
$pspell_link = pspell_new("de", "", "", "utf-8");
Кроме того: Хотя это и позволило Verkäuferin пройти проверку орфографии, мой сервер не смог правильно выводить буквы с умлаутами, пока я не вставил эту строку в файл php.ini.
default_charset = "utf-8"
Для получения дополнительной информации о кодировке символов с помощью PHP эта страница выглядит полезной:
http://kore-nordmann.de/blog/php_charset_encoding_FAQ.html
Что касается вашего второго вопроса, хотя пакет aspell, который использует PHP, поддерживает сопоставление без учета регистра, к сожалению, PHP не позволяет вам выбирать эту опцию. Вот лучшее решение, которое я мог придумать:
$pspell_link = pspell_new("de", "", "", "utf-8");
$wort = "verkäuferin";
$richtig = pspell_check($pspell_link, $wort);
if (!$richtig) {
$vorschlaege = pspell_suggest($pspell_link, $wort);
// make a copy of the array with all words in lowercase, so we can still
// display the original suggestions if necessary
$kleinschrift_vorschlaege = array_map('strtolower', $vorschlaege);
// convert the original word to lowercase before comparing it
$richtig = in_array(strtolower($wort), $kleinschrift_vorschlaege);
}
echo "'$wort' ist " . ($richtig ? "" : "nicht") . " richtig buchstabiert.<br/>";
if (!$richtig) {
echo "Mögliche Schreibweisen:<br/>";
foreach ($vorschlaege as $vorschlag) {
echo " " . $vorschlag . "<br/>";
}
}
Есть простое решение. Просто сделай это:
$word = ucfirst($word); //Always capitalize to avoid case sensitive error
if (!pspell_check($dict, $word)) {
$suggestions = pspell_suggest($dictionary, $word);
}