Temelde Öğeler listesini içeren metin belgelerim var.
Her Öğe, farklı türlerden birkaç simgeden oluşan bir gruptur: FirstName, LastName, BirthDate, PhoneNumber, City, Occupation, vb. Bir token, bir grup kelimedir.
Öğeler birkaç satırda uzanabilir.
Bir belgedeki öğeler yaklaşık olarak aynı belirteç sözdizimine sahiptir, ancak tam olarak aynı olmaları gerekmez.
Öğeler arasında ve Öğeler içinde daha fazla / daha az simge olabilirler.
FirstName LastName BirthDate PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber
Occupation UnrecognizedToken
FirstName LastName PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber
City Occupation
Amaç, kullanılan dilbilgisini tanımlamak, ör.
Occupation City
ve sonunda tam olarak eşleşmediklerini düşünseniz bile tüm Eşyaları tanımlayın.
Kısa ve okunabilir kalmak için, bunun yerine bu token türlerini belirtmek için A, B, C, D, ... bazı takma adlarını kullanalım.
Örneğin
A B C
D F
A B C
D E F
F
A B C
D E E F
A C B
D E F
A B D C
D E F
A B C
D E F G
Burada Öğe sözdiziminin
A B C
D E F
çünkü diziye en uygun olanıdır.
Sözdizimi (belirteç türleri ve siparişleri) bir belgeden diğerine çok değişebilir. örneğin başka bir belge bu listeye sahip olabilir
D A
D A
D
D A
B
D A
Amaç, söz dizimini önceden bilmeden bulmaktır .
Artık yeni bir çizgi de bir jeton olarak kabul ediliyor. Bir belge daha sonra 1 boyutlu bir belirteç dizisi olarak temsil edilebilir:
Burada tekrarlanan dizi A B C B
, en az çatışmayı oluşturan jeton olduğu için olabilir.
Hadi biraz karmaşıklaştıralım. Artık her tokenin belirlenmiş bir türü yok. Gerçek dünyada, bazı token türlerinden her zaman% 100 emin değiliz. Bunun yerine, belirli bir tipte olma olasılığını veriyoruz.
A 0.2 A 0.0 A 0.1
B 0.5 B 0.5 B 0.9 etc.
C 0.0 C 0.0 C 0.0
D 0.3 D 0.5 D 0.0
İşte elde etmek istediğim şeyin soyut bir grafiği:
A olarak kabul edilen çözüm: Bir token yamasının dönüşümü
Bu çözüm, birkaç token yamasıyla bir evrişim uygulamak ve en az çatışmayı yaratan olanı almaktan ibarettir.
Buradaki zor kısım, gözlem dizisi boyunca yuvarlanacak potansiyel yamaları bulmaktır. Bunun için birkaç fikir, ama çok tatmin edici bir şey yok:
Jetonlar arasındaki geçişin bir Markov modelini oluşturunDezavantajı: Markov modelinin hafızası olmadığı için geçiş emirlerini kaybedeceğiz. Örneğin tekrarlanan dizi ise A B C B D
, A-> B'nin C-> B'den önce meydana gelmesi gerçeğini kaybederiz.
DNA / RNA'daki nükleobazları (GTAC) analiz etmek için biyolojide yaygın olarak kullanılmaktadır. Dezavantajı: Sonek ağaçları, kesin belirteçlerin (örn. Karakterler) tam olarak eşleştirilmesi için iyidir. Ne kesin dizilerimiz ne de kesin jetonlarımız var.
Kaba kuvvetHer boyutta her kombinasyonu deneyin. Aslında işe yarayabilir, ancak (uzun (uzun)) zaman alabilir.
B olarak kabul edilen çözüm: Soneklerin Levenshtein mesafelerinin bir tablosunu oluşturun
Sezgi, her sonek ile her sonek arasındaki mesafeyi hesaplarken bazı yerel mesafe minimumları olabileceğidir.
Uzaklık işlevi Levenshtein uzaklığıdır, ancak gelecekte her belirteç için sabit bir tür yerine belirli türlerde olma olasılığını hesaba katmak için onu özelleştirebileceğiz.
Bu gösteride basit kalmak için sabit tip jetonları kullanacağız ve jetonlar arasındaki mesafeyi hesaplamak için klasik Levenshtein'i kullanacağız.
Örneğin giriş sırasına sahip olalım ABCGDEFGH ABCDEFGH ABCDNEFGH
.
Her son ekin mesafesini her sonekle (eşit boyutta kırpılmış olarak) hesaplıyoruz:
for i = 0 to sequence.lengh
for j = i to sequence.lengh
# Create the suffixes
suffixA = sequence.substr(i)
suffixB = sequence.substr(j)
# Make the suffixes the same size
chunkLen = Math.min(suffixA.length, suffixB.length)
suffixA = suffixA.substr(0, chunkLen)
suffixB = suffixB.substr(0, chunkLen)
# Compute the distance
distance[i][j] = LevenshteinDistance(suffixA, suffixB)
Aşağıdaki sonucu alıyoruz (beyaz küçük mesafe, siyah büyük):
Şimdi, kendisine kıyasla herhangi bir sonekin boş bir mesafeye sahip olacağı açıktır. Ama biz kendisiyle eşleşen sonekle (tamamen veya kısmen) ilgilenmiyoruz, bu yüzden o kısmı kırpıyoruz.
Sonekler aynı boyuta kırpıldığından, uzun dizeyi karşılaştırmak her zaman küçük dizeleri karşılaştırmaktan daha büyük bir mesafe verecektir.
Sağdan başlayarak (+ P) düzgün bir şekilde sola doğru kaybolan bir ceza ile bunu telafi etmeliyiz.
Tüm davalara uyan iyi bir ceza işlevinin nasıl seçileceğinden henüz emin değilim.
Burada, aşırı sağa, soldan 0'a doğru sollayarak (+ P = 6) bir ceza uygularız.
Şimdi açıkça 2 net çapraz çizginin ortaya çıktığını görebiliyoruz. Bu sırayla 3 Öğe (Öğe1, Öğe2, Öğe3) vardır. En uzun satır, Item1 ile Item2 ve Item2 ile Item3 arasındaki eşleşmeyi temsil eder. En uzun ikinci öğe Öğe1 ile Öğe3 arasındaki eşleşmeyi temsil eder.
Şimdi bu verileri kullanmak için en iyi yoldan emin değilim. En yüksek çapraz çizgileri almak kadar basit mi?
Varsayalım.
Her jetondan başlayan çapraz çizginin ortalama değerini hesaplayalım. Sonucu aşağıdaki resimde görebiliriz (matrisin altındaki vektör):
Her bir Maddenin başlangıcına uyan 3 yerel minima açıkça vardır. Fantastik görünüyor!
Şimdi sıraya biraz daha kusur ekleyelim:
ABCGDEFGH ABCDEFGH TROLL ABCDEFGH
Açıkçası şimdi, çapraz ortalama vektörlerimiz dağılmış durumda ve bundan daha fazla yararlanamayız ...
Benim varsayımım, bunun, tüm bir bloğun eklenmesinin çok fazla cezalandırılmayabileceği özelleştirilmiş bir mesafe fonksiyonu (Levenshtein yerine) ile çözülebileceğidir. Bundan emin değilim.
Sonuç
Araştırılan evrişim-tabanlı çözümlerin hiçbiri sorunumuza uymuyor gibi görünüyor.
Levenshtein-mesafeye dayalı çözüm, özellikle olasılık tabanlı tip belirteçlerle uyumlu olduğu için umut verici görünüyor. Ama henüz sonuçlarından nasıl yararlanacağından emin değilim.
İlgili bir alanda deneyiminiz ve bize vermeniz için birkaç iyi ipucu ya da keşfedilecek diğer teknikleriniz varsa çok minnettar olurum. Şimdiden çok teşekkür ederim.