SORU
2 Mayıs 2011, PAZARTESİ


En yakın dize maç başlarken

Bir şekilde test bir dize için birden fazla dizeleri ve yakından benzer bir dize geri dönmek istiyorum:

TEST STRING: THE BROWN FOX JUMPED OVER THE RED COW

CHOICE A   : THE RED COW JUMPED OVER THE GREEN CHICKEN
CHOICE B   : THE RED COW JUMPED OVER THE RED COW
CHOICE C   : THE RED FOX JUMPED OVER THE BROWN COW

Eğer bu doğru olsaydı () En yakın dize "TEST STRİNG" olmalıdır "SEÇENEK C". Bunu yapmanın en kolay yolu nedir?

Üzerinde VB.net Lua, JavaScript de dahil olmak üzere birden çok dilde bu uygulama planlıyorum. Bu noktada, sahte kod kabul edilebilir. Eğer belirli bir dil için bir örnek sağlayabilir, bu çok takdir!

CEVAP
2 Mayıs 2011, PAZARTESİ


Çeşitli bilgilerin bir veritabanında bir petrol Kulesi hakkında kullanıcı girilen bilgileri arama geldiğinde bu sorun yaklaşık bir yıl önce sunuldu. Amaç, en yaygın unsurlar ile veritabanı girişi teşhis edebilecek bulanık dize arama çeşit yapmak için.

Başka bir dize veya ifade çevirmek için araştırma kaç dize veya ifade için yapılması gerektiğini belirler Levenshtein distance algoritma, uygulama dahil bir parçası.

Uygulama geldim up ile nispeten basit, ve işin içinde ağırlıklı bir karşılaştırma boyu iki sözcük, numara değişimi arasındaki her cümle ve her kelime olabilir bu hedef girişi.

Bu makalede benim en ilgili içerik burada eklemek için yapacağım çok özel bir site


Bulanık Dizge ile Eşleşen iki kelime veya cümleleri benzerlik insan gibi bir tahmini gerçekleştirme sürecidir. Birçok durumda, tanımlama kelimeleri içeren ya da birbirine en çok benzeyen ifadeler. Bu makalede, bulanık dize eşleştirme sorunu için bir çözüm ve bize daha önce sıkıcı kullanıcı katılımı gerekli olan görevleri otomatik hale getirmek için izin verecek olan, çeşitli problemleri çözme yararlılığını açıklar.

Giriş

Bulanık dize eşleştirme yapmak gerek aslında Meksika Körfezi Doğrulayıcı aracını geliştirirken ortaya çıktı. Ne vardı bir veritabanı bilinen Meksika Körfezi petrol kuyuları ve platformlar, ve insanlar sigorta satın alma verecekti bize bazı kötü yazılan bilgi hakkında varlıklarını olduğumuz için maç için veritabanı bilinen platformlar. Çok az bilgi verildi, elimizden gelen bir sigortacı "" bir atıfta olduklarını ve doğru bilgileri çağırabilir. tanımak için güveniyor. Bu otomatik bir çözüm işinize yarayacak.

Bir gün bulanık dize eşleştirme yöntemleri araştırdım ve sonunda Wikipedia çok yararlı Levenshtein mesafe algoritması sendeledi.

Uygulama

Bunun arkasındaki teori hakkında okuduktan sonra, ve optimize etmek için yollar uygulanmaktadır bulundu. Bu benim kod gibi VBA nasıl göründüğünü

'Calculate the Levenshtein Distance between two strings (the number of insertions,
'deletions, and substitutions needed to transform the first string into the second)
Public Function LevenshteinDistance(ByRef S1 As String, ByVal S2 As String) As Long
    Dim L1 As Long, L2 As Long, D() As Long 'Length of input strings and distance matrix
    Dim i As Long, j As Long, cost As Long 'loop counters and cost of substitution for current letter
    Dim cI As Long, cD As Long, cS As Long 'cost of next Insertion, Deletion and Substitution
    L1 = Len(S1): L2 = Len(S2)
    ReDim D(0 To L1, 0 To L2)
    For i = 0 To L1: D(i, 0) = i: Next i
    For j = 0 To L2: D(0, j) = j: Next j

    For j = 1 To L2
        For i = 1 To L1
            cost = Abs(StrComp(Mid$(S1, i, 1), Mid$(S2, j, 1), vbTextCompare))
            cI = D(i - 1, j)   1
            cD = D(i, j - 1)   1
            cS = D(i - 1, j - 1)   cost
            If cI <= cD Then 'Insertion or Substitution
                If cI <= cS Then D(i, j) = cI Else D(i, j) = cS
            Else 'Deletion or Substitution
                If cD <= cS Then D(i, j) = cD Else D(i, j) = cS
            End If
        Next i
    Next j
    LevenshteinDistance = D(L1, L2)
End Function

Basit, hızlı ve çok kullanışlı bir ölçü. Bu kullanarak, iki dizeleri benzerlik değerlendirmek için iki ayrı Ölçümler yaptım. Ben bir tane "" diyorum "". valueWords valuePhrase valuePhrase sadece Levenshtein mesafe arasındaki iki sözcük, ve valueWords böler dize tek tek kelimeler, temel sınırlayıcıları gibi boşluk, tire ve eklemek istediğiniz bir şey var ve karşılaştırır her kelime, her sözcük, özetle en kısa Levenshtein mesafe bağlayan herhangi iki kelime. Aslında, bir bilgi olup olmadığını ölçer 'cümle' kelimesi gerçekten bilge bir permütasyon gibi bir yer. Yan bir proje en etkili yolu, bir dize sınırlayıcı dayalı bölme Olası geliyor gibi birkaç gün geçirdim.

valueWords, valuePhrase ve işlevi Bölünmüş:

Public Function valuePhrase#(ByRef S1$, ByRef S2$)
    valuePhrase = LevenshteinDistance(S1, S2)
End Function

Public Function valueWords#(ByRef S1$, ByRef S2$)
    Dim wordsS1$(), wordsS2$()
    wordsS1 = SplitMultiDelims(S1, " _-")
    wordsS2 = SplitMultiDelims(S2, " _-")
    Dim word1%, word2%, thisD#, wordbest#
    Dim wordsTotal#
    For word1 = LBound(wordsS1) To UBound(wordsS1)
        wordbest = Len(S2)
        For word2 = LBound(wordsS2) To UBound(wordsS2)
            thisD = LevenshteinDistance(wordsS1(word1), wordsS2(word2))
            If thisD < wordbest Then wordbest = thisD
            If thisD = 0 Then GoTo foundbest
        Next word2
foundbest:
        wordsTotal = wordsTotal   wordbest
    Next word1
    valueWords = wordsTotal
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' SplitMultiDelims
' This function splits Text into an array of substrings, each substring
' delimited by any character in DelimChars. Only a single character
' may be a delimiter between two substrings, but DelimChars may
' contain any number of delimiter characters. It returns a single element
' array containing all of text if DelimChars is empty, or a 1 or greater
' element array if the Text is successfully split into substrings.
' If IgnoreConsecutiveDelimiters is true, empty array elements will not occur.
' If Limit greater than 0, the function will only split Text into 'Limit'
' array elements or less. The last element will contain the rest of Text.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function SplitMultiDelims(ByRef Text As String, ByRef DelimChars As String, _
        Optional ByVal IgnoreConsecutiveDelimiters As Boolean = False, _
        Optional ByVal Limit As Long = -1) As String()
    Dim ElemStart As Long, N As Long, M As Long, Elements As Long
    Dim lDelims As Long, lText As Long
    Dim Arr() As String

    lText = Len(Text)
    lDelims = Len(DelimChars)
    If lDelims = 0 Or lText = 0 Or Limit = 1 Then
        ReDim Arr(0 To 0)
        Arr(0) = Text
        SplitMultiDelims = Arr
        Exit Function
    End If
    ReDim Arr(0 To IIf(Limit = -1, lText - 1, Limit))

    Elements = 0: ElemStart = 1
    For N = 1 To lText
        If InStr(DelimChars, Mid(Text, N, 1)) Then
            Arr(Elements) = Mid(Text, ElemStart, N - ElemStart)
            If IgnoreConsecutiveDelimiters Then
                If Len(Arr(Elements)) > 0 Then Elements = Elements   1
            Else
                Elements = Elements   1
            End If
            ElemStart = N   1
            If Elements   1 = Limit Then Exit For
        End If
    Next N
    'Get the last token terminated by the end of the string into the array
    If ElemStart <= lText Then Arr(Elements) = Mid(Text, ElemStart)
    'Since the end of string counts as the terminating delimiter, if the last character
    'was also a delimiter, we treat the two as consecutive, and so ignore the last elemnent
    If IgnoreConsecutiveDelimiters Then If Len(Arr(Elements)) = 0 Then Elements = Elements - 1

    ReDim Preserve Arr(0 To Elements) 'Chop off unused array elements
    SplitMultiDelims = Arr
End Function

Benzerlik ölçüleri

Sadece iki dize arasındaki mesafeyi hesaplayan iki ölçü bu, bir üçüncü, bir optimizasyon algoritması maçlar en fazla sayıda ulaşmak için çalıştırabilirsiniz hangi değişkenler bir dizi var. Bulanık dize eşleştirme, kendisi, bir bulanık bilim ve oluşturarak doğrusal bağımsız ölçümler için ölçüm dize benzerlik ve sahip bilinen bir set dizeleri dileğiyle maç için birbirimizi bulabiliriz parametreleri bu, bizim için özel stilleri dizeleri, ver en iyisi bulanık MAÇ SONUÇLARI.

Başlangıçta, metrik amacı giderek permuted önlemler için tam bir eşleşme için, ve arama değerlerini artırmak için düşük bir arama değeri var. Elverişsiz bir durumda, bu oldukça kolay iyi tanımlanmış permütasyon bir dizi kullanarak, ve son formülü istediğiniz gibi artan değerleri arama sonuçları oldukları gibi mühendislik tanımlamak için.

Fuzzy String Matching Permutations

Fuzzy String Matching Value Phrase

Fuzzy String Matching Value Words

Gördüğünüz gibi, bulanık dize eşleştirme ölçütleri olan son iki ölçümleri, zaten maç içindir bu dizeler için düşük puanlar (çapraz aşağı) vermek için doğal bir eğilim var. Bu çok iyi.

Uygulama Bulanık eşleşen optimizasyonu sağlamak için, her bir ağırlık ölçüsü. Gibi, bulanık dize eşleştirme her uygulama parametreleri ağırlık farklı olabilir. Final skoru formülü tanımlar ölçüler ve ağırlıklar sadece bir kombinasyonudur:

value = Min(phraseWeight*phraseValue, wordsWeight*wordsValue)*minWeight
        Max(phraseWeight*phraseValue, wordsWeight*wordsValue)*maxWeight
        lengthWeight*lengthValue

Bir optimizasyon algoritması (sinir ağları, çok boyutlu ayrık bir sorun, çünkü en iyi burada) kullanarak, hedef şimdi eşleşme sayısını maksimize etmektir. Doğru sayısı bu son ekran görüntüsünde görüldüğü gibi birbirlerine her set maçlarını, algılayan bir fonksiyon oluşturdum. Bir sütun veya satır alır bir nokta ise en düşük puan atanan dize olması gerektiği gibi uyumlu ve kısmi puan vermiş ise kravat için en düşük puan, ve doğru maç arasında bağlı eşleşen dizeleri. Ben o zaman optimize. Yeşil bir cep mevcut en iyi satır eşleşen bir sütun olduğunu görebilirsiniz, ve hücrenin etrafında mavi bir kare mevcut en iyi sütun eşleşen satır. Alt köşesindeki skor başarılı sayısı ile eşleşir ve bu iyileştirme bizim sorunumuz ne olduğunu kabaca maksimize etmektir.

Fuzzy String Matching Optimized Metric

Algoritma harika bir başarı oldu, ve çözüm parametreleri bu tür bir sorun hakkında çok şey söylüyor. Optimize puanı 44, 48, mümkün olan en iyi skor olduğunu fark edeceksiniz. Sonunda 5 sütun yem ve herhangi bir maçta tüm satır değerlerini yok. Daha fazla yem var, o kadar zor doğal olarak en iyi eşleşmeyi bulmak için olacak.

Bu özel eşleştirme durumunda, uzunluğu dizeleri alakasız, çünkü biz bekliyor kısaltmalar temsil uzun kelimeler, optimal ağırlık uzunluk -0.3, yani biz değil cezalandırmak dizeleri değişir uzunluğu. Bu kısaltmalar beklentisiyle puanı azaltmak, kısmi kelime için daha fazla yer veren sözcük olmayan sadece daha az gerektiren maçlar dize daha kısa olduğu için oyuncu değişikliği üstünde uyuyor.

Kelime ağırlığı cümle iseniz, biz tam sözcükleri bir dize ve değeri eksik cezalandırmak anlamına gelir 0.5, daha tüm ifadeyi tek sağlam edilirken 1.0. Bu bir çok kişiyi gerçekten neyin önemli ya da değil, bu kombinasyon (bölge ve tehlike) tutulur olup olmadığını bulunduğu ortak (tehlike) bir kelime var, çünkü yararlıdır.

Son olarak, min ağırlığı 10 getirilmiştir ve 1 de max ağırlığı. Bunun ne demek olduğunu ise en iyi iki puan (değeri ifade ve değer kelime) değil, çok iyi bir maç büyük ölçüde cezalandırılmış, ama yok büyük ceza en kötü iki puan. Aslında, bu ihtiyacı önem veriyoryabu valueWord ya da iyi bir puan elde etmek için valuePhrase, ama her ikisi de değil. Bir tür" zihniyet. neden bu "al

Bu 5 ağırlıkları optimize edilmiş değeri bulanık dize eşleştirme yaşanıyor sıralama hakkında ne gerçekten büyüleyici. Bulanık dize eşleştirme tamamen farklı pratik durumda, bu parametreler çok farklı. 3 ayrı uygulamalar için şimdiye kadar kullanmadım.

Süre kullanılmayan son optimizasyon, bir kıyaslama oldu kağıda kurulan eşleşen sütunlar için kendileri için mükemmel sonuçlar aşağı, çapraz ve lets kullanıcı parametreleri değiştirmek için kontrol oranı olan puanları sapmak 0 ve not doğuştan benzerlikler arasında arama cümleleri (hangi olabilir teorik olarak kullanılabilir ofset yanlış pozitif sonuçlar)

Fuzzy String Matching Benchmark

Daha Fazla Uygulamalar

Bu çözüm mükemmel bir eşleşme yok hiçbir yerde kullanıcı bir bilgisayar sistemi dizeler kümesi bir dize tanımlamak sahip olmak istediği her yerde kullanılmak üzere bir potansiyele sahiptir. (Yaklaşık eşleşme başvuru ya da dizeleri gibi).


Ne yapmalı bu, muhtemelen kullanmak istiyorsanız bir kombinasyonu, yüksek seviyede sezgisel (bulma kelime bir cümle başka bir cümle, uzunluğu iki ifadeler, vb) ile birlikte uygulanması Levenshtein mesafe algoritması. ""Maç (bulanık) sezgisel bir tespit olduğunu benzerliği belirlemek için. herhangi ölçümler için bir ağırlık kümesi ile gelip gerekecek en iyi olduğuna karar vermek çünkü

Keşif ve ağırlıkları uygun seti ile karşılaştırıldığında programınızın hızlı olurdun kararlar olacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boniver

    boniver

    17 NİSAN 2006
  • CommonArtisan

    CommonArtisa

    7 Temmuz 2012
  • segtlim

    segtlim

    21 EKİM 2008