Левенштейн қашықтығы - Levenshtein distance - Wikipedia

Жылы ақпарат теориясы, лингвистика және есептеу техникасы, Левенштейн қашықтығы Бұл жолдық метрика екі реттіліктің айырмашылығын өлшеуге арналған. Бейресми түрде, екі сөздің арасындағы Левенштейн қашықтығы - бір сөзді екінші сөзге өзгерту үшін қажет бір таңбалы түзетулердің (кірістіру, жою немесе ауыстыру) минималды саны. Ол кеңестік математиктің есімімен аталады Владимир Левенштейн, бұл қашықтықты 1965 жылы қарастырған.[1]

Левенштейн қашықтығы деп те аталуы мүмкін қашықтықты өңдеудегенмен, бұл термин қашықтықтан метриканың үлкен тобын білдіруі мүмкін, бірақ ол жалпыға бірдей белгілі қашықтықты өңдеу.[2]:32 Бұл тығыз байланысты жолдарды туралап туралау.

Анықтама

Екі жіптің арасындағы Левенштейн қашықтығы (ұзындығы және сәйкесінше) арқылы беріледі қайда

қайда кейбір жолдар - бұл бірінші символдан басқаларының тізбегі , және болып табылады жолдың үшінші таңбасы , 0 таңбасынан басталады.

Минимумдағы бірінші элемент жойылуға сәйкес келетінін ескеріңіз (бастап дейін ), екіншісі кірістіруге, үшіншісі ауыстыруға арналған.

Бұл анықтама тікелей сәйкес келеді аңқау рекурсивті енгізу.

Мысал

Ауыстыру құнын 1 ретінде және жою немесе кірістіруді 0,5 ретінде пайдаланып, екі сөзге арналған қашықтық матрицасын өзгертіңіз.

Мысалы, «котенка» мен «отыру» арасындағы Левенштейннің арақашықтығы 3-ке тең, өйткені келесі үш редакция бірінің бірін екіншісіне өзгертеді және оны үш редакциядан азырақ орындау мүмкін емес:

  1. кitten → сitten («s» - ді «k» орнына ауыстыру)
  2. отыруen → отыруменn («и» -ні «е» -ге ауыстыру)
  3. отыру → отыруж (соңында «g» қою).

Жоғарғы және төменгі шектер

Левенштейн қашықтығының бірнеше қарапайым жоғарғы және төменгі шектері бар. Оларға мыналар жатады:

  • Бұл кем дегенде екі ішектің өлшемдерінің айырмашылығы.
  • Бұл ұзын жіптің ұзындығы.
  • Жолдар тең болған жағдайда ғана нөлге тең.
  • Егер жіптердің өлшемдері бірдей болса, онда Хамминг қашықтығы - Левенштейн қашықтығының жоғарғы шегі. Хамминг қашықтығы - бұл екі ішектегі сәйкес таңбалар әртүрлі болатын позициялар саны.
  • Екі жіптің арасындағы Левенштейн арақашықтығы олардың үшінші жіптен Левенштейн арақашықтықтарының қосындысынан үлкен емес (үшбұрыш теңсіздігі ).

Ұзындығы бірдей екі жіптің арасындағы Левенштейн қашықтығы Хамминг қашықтығынан қатаң аз болатын мысал «кемшілік» және «көгал» арқылы берілген. Мұнда Левенштейннің арақашықтығы 2-ге тең (алдыңғы жағынан «f» алып тастаңыз; соңында «n» енгізіңіз). The Хамминг қашықтығы 4.

Қолданбалар

Жылы жолдарды шамамен сәйкестендіру, мақсат - көптеген айырмашылықтар күтілетін жағдайларда көптеген ұзын мәтіндердегі қысқа жолдар үшін матчтарды табу. Мысалы, қысқа жолдар сөздіктен болуы мүмкін. Мұнда жолдардың біреуі әдетте қысқа, ал екіншісі ерікті түрде ұзын. Оның көптеген қосымшалары бар, мысалы, емле тексерушілер, үшін түзету жүйелері таңбаларды оптикалық тану, және бағдарламалық қамтамасыздандыруға негізделген табиғи тілдегі аударма аударма жады.

Левенштейн қашықтығын екі ұзын жолдың арасында да есептеуге болады, бірақ оны есептеуге кететін шығын, бұл екі жол ұзындығының көбейтіндісімен шамалас пропорционалды болып табылады. Осылайша, көмектесу үшін пайдаланылған кезде анық емес жолдарды іздеу сияқты қосымшаларда жазба байланысы, салыстырылған жолдар салыстыру жылдамдығын жақсартуға көмектесетін қысқа болады.[дәйексөз қажет ]

Лингвистикада Левенштейн арақашықтығы метрикалық өлшем ретінде қолданылады лингвистикалық қашықтық, немесе екі тілдің бір-бірінен қаншалықты айырмашылығы бар.[3] Бұл байланысты өзара түсініктілік, лингвистикалық арақашықтық неғұрлым жоғары болса, өзара түсініктілік соғұрлым төмен болады, ал тілдік арақашықтық неғұрлым төмен болса, соғұрлым өзара түсініктілік жоғары болады.

Басқа өңделген қашықтық көрсеткіштерімен байланыс

Басқа да танымал шаралары бар қашықтықты өңдеу, олар әр түрлі рұқсат етілген редакциялау операцияларының жиынтығы арқылы есептеледі. Мысалы,

Қашықтықты өңдеу әдетте рұқсат етілген өңдеу операцияларының белгілі бір жиынтығымен есептелген параметрленетін метрика ретінде анықталады және әр операцияға шығындар тағайындалады (мүмкін шексіз). Мұны ДНҚ одан әрі жалпылайды реттілікті туралау сияқты алгоритмдер Smith – Waterman алгоритмі, бұл операцияның құны оның қолданылатын жеріне байланысты болады.

Левенштейн қашықтығын есептеу

Рекурсивті

Бұл тікелей, бірақ тиімсіз, рекурсивті Хаскелл жүзеге асыру l Қашықтық екі жолды алатын функция, с және т, олардың ұзындығымен бірге және олардың арасындағы Левенштейн қашықтығын қайтарады:

l Қашықтық :: ( Теңдеу а ) => [а] -> [а] -> Intl Қашықтық [] т = ұзындығы т   - s бос болса, қашықтық t-дегі таңбалардың саны боладыl Қашықтық с [] = ұзындығы с   - Егер t бос болса, қашықтық s-дегі таңбалардың саны боладыl Қашықтық (а:s ') (б:t ') =  егер    а == б  содан кейін    l Қашықтық s ' t '         - Егер бірінші таңбалар бірдей болса, оларды елемеуге болады  басқа    1 + минимум             - Әйтпесе, мүмкін болатын үш әрекетті де қолданып, ең жақсысын таңдаңыз      [ l Қашықтық (а:s ') t ' - таңба енгізілді (b енгізілді)      , l Қашықтық s ' (б:t ') - таңба жойылды (жойылды)      , l Қашықтық s ' t '     - таңба ауыстырылды (b орнына ауыстырылды)      ]

Бұл іске асыру өте тиімсіз, өйткені ол сол астарлардың Левенштейн арақашықтығын бірнеше рет есептейді.

Тиімді әдіс қашықтықты есептеуді ешқашан қайталамайды. Мысалы, барлық ықтимал префикстердің Левенштейн қашықтығы массивте сақталуы мүмкін қайда бұл соңғы арасындағы қашықтық жолдың таңбалары с және соңғысы жолдың таңбалары т. Кестені 0-ші қатардан бастап бір қатарға тұрғызу оңай, егер бүкіл кесте тұрғызылса, қалаған қашықтық соңғы жол мен бағандағы кестеде болады, бұл барлық таңбалар арасындағы қашықтықты білдіреді с және барлық кейіпкерлер т.

Толық матрицамен қайталанатын

Ескерту: Бұл бөлімде 0 негізінің орнына 1 негізді жолдар қолданылады

Левенштейн қашықтығын есептеу егер біз а деп есептесек, бақылауға негізделген матрица Левенштейн арақашықтығын бәрінің арасында ұстап тұру префикстер бірінші жолдың және екіншісінің барлық префикстерінің, содан кейін а-да матрицадағы мәндерді есептей аламыз динамикалық бағдарламалау сән, сөйтіп екі жолдың арасындағы қашықтықты соңғы мән ретінде табыңыз.

Бұл алгоритм, төменнен жоғарыға мысал динамикалық бағдарламалау, 1974 жылғы мақалада нұсқаларымен талқыланады The Жолдардан жолдарға түзету мәселесі Роберт А. Вагнер және Майкл Дж. Фишер.[4]

Бұл тікелей псевдокод функцияға енгізу Левенштейн қашықтығы екі ішекті алады, с ұзындығы м, және т ұзындығы nжәне олардың арасындағы Левенштейн қашықтығын қайтарады:

функциясы Левенштейн қашықтығы(char с[1..м], char т[1..n]):  // барлық i мен j үшін, d [i, j] Левенштейн аралығын ұстайды  // s-дің алғашқы i таңбалары және t-дің алғашқы j таңбалары  жариялаңыз int г.[0..м, 0..n]   орнатылды әрқайсысы элемент жылы г. дейін нөл   // бастапқы префикстерді бос жолға айналдыруға болады  // барлық таңбаларды тастау  үшін мен бастап 1 дейін м:      г.[мен, 0] := мен   // мақсатты префикстерге бос бастапқы префикстен қол жеткізуге болады  // әр кейіпкерді кірістіру арқылы  үшін j бастап 1 дейін n:      г.[0, j] := j   үшін j бастап 1 дейін n:      үшін мен бастап 1 дейін м:          егер с[мен] = т[j]:            ауыстыру құны := 0          басқа:            ауыстыру құны := 1          г.[мен, j] := минимум(г.[мен-1, j] + 1,                   // жою                             г.[мен, j-1] + 1,                   // кірістіру                             г.[мен-1, j-1] + ауыстыру құны)  // ауыстыру   қайту г.[м, n]

Нәтижесінде алынған матрицаның екі мысалы (белгіленген санның үстінен қозғалғанда, сол санды алу әрекеті көрінеді):

The өзгермейтін бүкіл алгоритм бойынша сақталса, біз бастапқы сегментті өзгерте аламыз с[1..мен] ішіне т[1..j] минимумды қолдану г.[мен,j] операциялар. Соңында массивтің төменгі оң жақ элементінде жауап бар.

Екі матрицалық жолмен қайталанатын

Егер кестеге түзетілген кіріс жолдарын қайта қалпына келтіргісі келмесе (алдыңғы жол мен ағымдағы жол есептеліп жатса), кестенің тек екі жолы керек болады.

Левенштейн қашықтығы келесі алгоритмді қолдану арқылы қайталанатын түрде есептелуі мүмкін:[5]

функциясы Левенштейн қашықтығы(char с[0..м-1], char т[0..n-1]):    // бүтін қашықтықтағы екі жұмыс векторын құру    жариялаңыз int v0[n + 1]    жариялаңыз int v1[n + 1]    // v0 инициализациясы (қашықтықтардың алдыңғы қатары)    // бұл жол A [0] [i]: бос s үшін қашықтықты өңдеу    // қашықтық тек t-ден жойылатын таңбалардың саны    үшін мен бастап 0 дейін n:        v0[мен] = мен    үшін мен бастап 0 дейін м-1:        // алдыңғы v0 жолынан v1 (ағымдағы жол арақашықтықтарын) есептеу        // v1-нің бірінші элементі A [i + 1] [0]        // өңдеу қашықтығы - бос t-ге сәйкес келетін s (i + 1) белгілерін жою        v1[0] = мен + 1        // жолдың қалған бөлігін толтыру үшін формуланы қолданыңыз        үшін j бастап 0 дейін n-1:            // A [i + 1] [j + 1] үшін шығындарды есептеу            жою құны := v0[j + 1] + 1            кірістіру құны := v1[j] + 1            егер с[мен] = т[j]:                ауыстыру құны := v0[j]            басқа:                ауыстыру құны := v0[j] + 1;            v1[j + 1] := минимум(жою құны, кірістіру құны, ауыстыру құны)        // келесі итерация үшін v1-ге (ағымдағы жол) v0-ге (алдыңғы жол) көшіріңіз        // v1-дегі мәліметтер әрқашан жарамсыз болғандықтан, көшірмесіз своп тиімді болуы мүмкін        айырбастау v0 бірге v1    // соңғы своптан кейін v1 нәтижелері енді v0    қайту v0[n]

Бұл екі жол нұсқасы оңтайлы емес - қажет жад көлемі бір жолға және қосымша (индекс) сөзге дейін азайтылуы мүмкін, бұл кэштің орналасуын жақсарту үшін қажет.[6]

Гиршбергтің алгоритмі осы әдісті біріктіреді бөлу және жеңу. Ол бірдей асимптотикалық уақыт пен кеңістік шектерінде ғана емес, қашықтықты өңдеудің оңтайлы реттілігін есептей алады.[7]

Адаптивті нұсқа

Динамикалық нұсқа - бұл идеалды енгізу емес. Адаптивті тәсіл талап етілетін жад көлемін азайтуы мүмкін және ең жақсы жағдайда уақыттың күрделілігін ең қысқа жолдың ұзындығында сызықтыққа дейін төмендетуі мүмкін, ал нашар жағдайда ең қысқа жолдың ұзындығында квадраттан аспауы мүмкін. . Кітапхананың тиімді функцияларын қолдануға болатын идея (std :: сәйкессіздік) жалпы префикстер мен суффикстердің бар-жоғын тексеріп, сәйкес келмегендіктен DP бөліміне сүңгу керек.[6]

Автоматтар

Levenshtein автоматтары жолдың берілген жолдан берілген константадан кіші өңдеу қашықтығына ие екендігін тиімді анықтау.[8]

Жақындау

Левенштейн ұзындығы екі жіп арасындағы қашықтық n бола алады жуықталған фактор шеңберінде

қайда ε > 0 уақыт бойынша реттелетін еркін параметр болып табылады O(n1 + ε).[9]

Есептеудің күрделілігі

Левенштейннің екі жіптің арақашықтығы көрсетілген n уақытында есептеу мүмкін емес O(n2 - ε) нөлден үлкен кез келген ε үшін уақыт бойынша күшті экспоненциалды гипотеза жалған[10]

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Влади́мир И. Левенштейн (1965). Двоичные коды с исправлением выпадений, вставок и замещений символов [Жоюды, кірістіруді және қайтаруды түзетуге қабілетті екілік кодтар]. Доклады Академий Наук СССР (орыс тілінде). 163 (4): 845–8. Ағылшын тілінде: Левенштейн, Владимир И. (1966 ж. Ақпан). «Жоюды, кірістіруді және қайтаруды түзетуге қабілетті екілік кодтар». Кеңестік физика Доклады. 10 (8): 707–710. Бибкод:1966SPhD ... 10..707L.
  2. ^ Наварро, Гонсало (2001). «Жолдарды шамамен сәйкестендіру үшін экскурсия» (PDF). ACM Computing Surveys. 33 (1): 31–88. CiteSeerX  10.1.1.452.6317. дои:10.1145/375360.375365. S2CID  207551224.
  3. ^ Jan D. ten Thije; Луджер Зеераерт (2007 ж. 1 қаңтар), Рецептивті көптілділік: лингвистикалық талдаулар, тілдік саясат және дидактикалық тұжырымдамалар, Джон Бенджаминс баспа компаниясы, 2007 ж., ISBN  978-90-272-1926-8, ... Түсініктіліктің лингвистикалық арақашықтықпен кері байланысы бар деп есептесек ... мазмұндағы сөздер туыстық қатынастардың проценттік қатынасы (тікелей немесе синоним арқылы) ... лексикалық туыстық ... грамматикалық туыстық ...
  4. ^ Вагнер, Роберт А .; Фишер, Майкл Дж. (1974), «Сапты-ішекті түзету мәселесі», ACM журналы, 21 (1): 168–173, дои:10.1145/321796.321811, S2CID  13381535
  5. ^ Хьельмквист, Стен (2012 ж. 26 наурыз), Levenshtein алгоритмі жылдам, жады тиімді
  6. ^ а б «Таза / Иосифович: өте жылдам левенштейндік арақашықтық функциясы». Архивтелген түпнұсқа 12 маусым 2018 ж. Бұл алады [sic] өте аз жадыны пайдаланудың жылдамдығы, көбінесе буферді толығымен кэште сақтайды және шығындарды қоспайтын кез-келген префикс пен постфиксті өткізіп жіберу арқылы жұмыс көлемін азайтады. [...] Мәселе мынада, сіз матрицадағы ұяшықты жаңартқыңыз келген кезде үш мәнді білуіңіз керек және олардың екеуі буферде сақтала алады, ал үшінші мән тіркелген жерде сақталады. Тікелей код.
  7. ^ Хиршберг, Д.С. (1975). «Максималды ортақ тізімдерді есептеудің сызықтық кеңістігінің алгоритмі» (PDF). ACM байланысы (Қолжазба ұсынылды). 18 (6): 341–343. CiteSeerX  10.1.1.348.4774. дои:10.1145/360825.360861. МЫРЗА  0375829. S2CID  207694727.
  8. ^ Шульц, Клаус У .; Михов, Стоян (2002). «Левенштейн-Автоматамен ішекті жылдам түзету». Халықаралық құжаттарды талдау және тану журналы. 5 (1): 67–85. CiteSeerX  10.1.1.16.652. дои:10.1007 / s10032-002-0082-8. S2CID  207046453.
  9. ^ Андони, Александр; Кравтхамер, Роберт; Онак, Кзиштоф (2010). Редакторлау қашықтығы мен асимметриялық сұраныстың күрделілігі үшін полигарифмдік жуықтау. IEEE симптомы. Информатика негіздері (ТОБ). arXiv:1005.4033. Бибкод:2010arXiv1005.4033A. CiteSeerX  10.1.1.208.2079.
  10. ^ Backurs, Arturs; Индик, Пиотр (2015). Қашықтықты өзгерту өте күшті квадраттық уақытта мүмкін емес (егер SETH жалған болмаса). Есептеу теориясы симпозиумында (STOC) қырық жетінші жылдық ACM. arXiv:1412.0348. Бибкод:2014arXiv1412.0348B.

Сыртқы сілтемелер