如何实现我的算法文本更正以替换文本中的单词?



简介

帮助我创建一个新函数或更改函数correct(),以便结果以case-insensitive方式适用于输入文本。


用法

correct()方法的示例用法:

$text = "Точик ТОЧИК точик ТоЧиК тоЧИК";
$text = correct($text, $base_words);
echo "$text";

预期成果

输入:Точик ТОЧИК точик ТоЧиК тоЧИК
输出:Тоҷик ТОҶИК тоҷик ТоҶиК тоҶИК


法典

以下是下面的所有数组和函数,因此您可以轻松复制它们:

$default_words = array
(
'бур',
'кори',
'давлати',
'забони',
'фанни'
);
$base_words = array
(
"точик"    => "тоҷик",
"точики"   => "тоҷики",
"точикон"  => "тоҷикон",
"чахонгир" => "ҷаҳонгир",
"галат"    => "ғалат",
"уктам"    => "ӯктам",
);
$base_special_words = array
(
"кори хатти"     => "кори хаттӣ",
"хатти аз"       => "хаттӣ аз",
"забони точики"  => "забони тоҷикӣ",
"точики барои"   => "тоҷикӣ барои",
"забони давлати" => "забони давлатӣ",
"давлати дар"    => "давлатӣ дар",
"микёси чахони"  => "миқёси ҷаҳонӣ",
);

function correct($request, $dictionary)
{
$search  = array("ғ","ӣ","ҷ","ҳ","қ","ӯ","Ғ","Ӣ","Ҷ","Ҳ","Қ","Ӯ");
$replace = array("г","и","ч","х","к","у","Г","И","Ч","Х","К","У");
$request = str_replace($search, $replace, $request); // replace special letters to default cyrillic letters
$result = preg_replace_callback("/pL+/u", function ($m) use ($dictionary) {
$word = mb_strtolower($m[0]);
if (isset($dictionary[$word])) {
$repl = $dictionary[$word];
// Check for some common ways of upper/lower case
// 1. all lower case
if ($word === $m[0]) return $repl;
// 2. all upper case
if (mb_strtoupper($word) === $m[0]) return mb_strtoupper($repl);
// 3. Only first letters are upper case
if (mb_convert_case($word,  MB_CASE_TITLE) === $m[0]) return mb_convert_case($repl,  MB_CASE_TITLE);
// Otherwise: check each character whether it should be upper or lower case
for ($i = 0, $len = mb_strlen($word); $i < $len; ++$i) {
$mixed[] = mb_substr($word, $i, 1) === mb_substr($m[0], $i, 1) 
? mb_substr($repl, $i, 1)
: mb_strtoupper(mb_substr($repl, $i, 1));
}
return implode("", $mixed);
}
return $m[0]; // Nothing changes
}, $request);

return $result;
}

问题

如何正确更正输入文本?

输入
Кори хатти аз фанни забони точики барои забони давлати дар микёси чахони.
输出
Кори хаттӣ аз фанни забони тоҷикӣ барои забони давлатӣ дар миқёси ҷаҳонӣ.

在这里,您很可能需要使用 3 个数组逐步修复文本。我的算法没有给出合适的结果。所以我创建了一个由两个单词($base_special_words)组成的数组。

我的算法通过字典中的单词更正句子:

第 1 步。

您需要根据句子中出现的单词从$base_special_words数组的元素创建一个temp array。临时数组如下所示:

$temp_for_base_special_words = array
(
"кори хатти",
"хатти аз",
"забони точики",
"точики барои",
"забони давлати",
"давлати дар",
"микёси чахони",   
);

所有这些词都在句子中相遇。然后我们去掉 temp 数组中的那些单词。从句子中剪掉这些单词后,句子看起来像这样:

切割前的全句:
Кори хатти аз фанни забони точики барои забони давлати дар микёси чахони. Точик мард аст.
句子的删减部分:
Кори хатти аз забони точики барои забони давлати дар микёси чахони
切割后的句子:
фанни. Точик мард аст.

第 2 步。

然后,将使用数组 $default_words 检查句子的其余部分,并从句子中剪切此数组中的单词。

第 2 步中切割前的句子:
фанни. Точик мард аст.
切割部分:
фанни
切割后的句子:
. Точик мард аст.
带有剪切单词的数组:
$temp_for_default_words = array("фанни");

第 3 步。

从句子的其余部分剪切 $base_words 数组中可用的单词。

第 3 步中切割前的句子:
. Точик мард аст.
切割部分:
Точик
切割后的句子:
. мард аст.
带有剪切单词的数组:
$temp_for_base_words = array ("точик");

报价的其余部分必须暂时剪切和隐藏,以便无法对其进行处理。

隐藏的句子部分:
. мард аст.

最后,您需要使用字典替换使用三个新数组并返回隐藏部分。

纠正步骤

第 1 步。

用法 '$temp_for_base_special_words':
使用$temp_for_base_special_words值查找 with keys($temp_for_base_special_words[$value]) 的值,$base_special_words并将该键替换为输入文本中的值。

第 2 步。

用法 '$temp_for_default_words':
使用$temp_for_default_words值查找 with 键($temp_for_default_words[$value]) 中的值$base_default_words并将该键替换为输入文本中的值。

第 3 步。

用法 '$temp_for_default_words':
使用$temp_for_base_words值查找 with 键($temp_for_base_words[$value]) 的值$base_words并将该键替换为输入文本中的值。

第 4 步。

将文本的隐藏部分返回到输入坐标

@ctwheels想告诉你的是使用str_ireplace(文档),如果你想纠正不区分大小写的单词。

<?php
$test="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
$word=explode(" ",$test); //This function is need for take all the words individually, the link of the function is above
foreach($word as $key=>$value)
if (array_key_exists($value,$YourArrayWithCorrectWord))
$word[$key]=$YourArrayWithCorrectWord[$value]; //This, if i don't make mistakes, take the correct word and assigns to the wrong word.
$TestCorrect=implode(" ",$word);
?>

如果你有什么不明白的地方,写信给我。

我希望我能帮助你。

文档: 这里是爆炸的文档

这里记录了内爆

这里是array_key_exsist的文档

附言此方法存在无法同时更正两个或多个单词的问题。

最新更新