Как реализовать текстовую коррекцию алгоритма для замены слов в тексте?

краткое

Помогите мне создать новую функцию или изменить функцию correct() чтобы результат работал case-insensitive к 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.

Вам нужно создать temp array из элементов массива $base_special_words из тех слов, которые встречаются в предложении. Массив temp выглядит так:

 $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 для поиска значений с ключами ( $temp_for_base_special_words[$value] ) в $base_special_words и замените эти ключи на значение в тексте ввода.

Шаг 2.

Использование `temp_for_default_words`:

Используя значения $temp_for_default_words для поиска значений с ключами ( $temp_for_default_words[$value] ) в $base_default_words и замените эти ключи на значение в тексте ввода.

Шаг 3.

Использование `temp_for_default_words`:

Используя значения $temp_for_base_words для поиска значений с ключами ( $temp_for_base_words[$value] ) в $base_words и замените эти ключи на значение в тексте ввода.

Шаг 4.

Возвращение скрытой части текста для ввода координат

Related of "Как реализовать текстовую коррекцию алгоритма для замены слов в тексте?"

То, что @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

PS У этого метода есть проблема, что вы не можете исправить два или более слова вместе.