1
0
mirror of https://github.com/php/doc-ru.git synced 2026-04-25 00:08:24 +02:00
Files
archived-doc-ru/reference/strings/functions/levenshtein.xml
T
Sergey Panteleev 6d43fd64d7 Исправление форматирования
[skip-spellcheck]
[skip-lint]
2022-12-27 03:42:36 +03:00

220 lines
7.4 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: a484d5d2bbad7e385a8864370b5280c4e05add8c Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.levenshtein" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>levenshtein</refname>
<refpurpose>Вычисляет расстояние Левенштейна между двумя строками</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>int</type><methodname>levenshtein</methodname>
<methodparam><type>string</type><parameter>string1</parameter></methodparam>
<methodparam><type>string</type><parameter>string2</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>insertion_cost</parameter><initializer>1</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>replacement_cost</parameter><initializer>1</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter>deletion_cost</parameter><initializer>1</initializer></methodparam>
</methodsynopsis>
<para>
Расстояние Левенштейна - это минимальное количество вставок, замен и
удалений символов, необходимое для преобразования
<parameter>string1</parameter> в <parameter>string2</parameter>.
Сложность алгоритма равна <literal>O(m*n)</literal>,
где <literal>n</literal> и <literal>m</literal> - длины строк
<parameter>string1</parameter> и <parameter>string2</parameter> (неплохо по
сравнению с <function>similar_text</function>, имеющей сложность <literal>O(max(n,m)**3)</literal>,
но всё же довольно много).
</para>
<para>
Если <parameter>insertion_cost</parameter>, <parameter>replacement_cost</parameter> и/или <parameter>deletion_cost</parameter> не равны <literal>1</literal>,
алгоритм адаптируется для выбора самых дешёвых преобразований.
Например. если <code>$insertion_cost + $deletion_cost &lt; $replacement_cost</code>,
замены не будут выполняться, вместо этого будут выполняться вставки и удаления.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>string1</parameter></term>
<listitem>
<para>
Одна из строк, для которых вычисляется расстояние Левенштейна.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>string2</parameter></term>
<listitem>
<para>
Одна из строк, для которых вычисляется расстояние Левенштейна.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>insertion_cost</parameter></term>
<listitem>
<para>
Определяет стоимость вставки.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>replacement_cost</parameter></term>
<listitem>
<para>
Определяет стоимость замены.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>deletion_cost</parameter></term>
<listitem>
<para>
Определяет стоимость удаления.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Эта функция возвращает расстояние Левенштейна между двумя строками.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
До этой версии <function>levenshtein</function> нужно было вызывать
с двумя или пятью аргументами.
</entry>
</row>
<row>
<entry>8.0.0</entry>
<entry>
До этой версии, <function>levenshtein</function> возвращала
значение <literal>-1</literal>, если одна из строк аргумента более 255 символов.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример использования <function>levenshtein</function></title>
<programlisting role="php">
<![CDATA[
<?php
// введённое слово с опечаткой
$input = 'carrrot';
// массив сверяемых слов
$words = array('apple','pineapple','banana','orange',
'radish','carrot','pea','bean','potato');
// кратчайшее расстояние пока ещё не найдено
$shortest = -1;
// проходим по словам для нахождения самого близкого варианта
foreach ($words as $word) {
// вычисляем расстояние между входным словом и текущим
$lev = levenshtein($input, $word);
// проверяем полное совпадение
if ($lev == 0) {
// это ближайшее слово (точное совпадение)
$closest = $word;
$shortest = 0;
// выходим из цикла - мы нашли точное совпадение
break;
}
// если это расстояние меньше следующего наименьшего расстояния
// ИЛИ если следующее самое короткое слово ещё не было найдено
if ($lev <= $shortest || $shortest < 0) {
// устанивливаем ближайшее совпадение и кратчайшее расстояние
$closest = $word;
$shortest = $lev;
}
}
echo "Вы ввели: $input\n";
if ($shortest == 0) {
echo "Найдено точное совпадение: $closest\n";
} else {
echo "Вы не имели в виду: $closest?\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Вы ввели: carrrot
Вы не имели в виду: carrot?
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>soundex</function></member>
<member><function>similar_text</function></member>
<member><function>metaphone</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->