Bulanık dizilerdeki bir dilbilgisini tanıma


13

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şturun

Dezavantajı: 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.

Bir ek ağacı oluşturun

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 kuvvet

Her 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.


Bir tür otoregresif bir model kullanmayı düşündünüz mü? en.wikipedia.org/wiki/Autoregressive_model
jcrudy

Ne istediğini ve nedenini gerçekten anlamıyorum. Ancak belki sıkıştırma algoritmaları bir şekilde yardımcı olabilir.
Gerenuk

1
Levenshtein mesafesine dayanarak bugün yaptığım bir deney ekledim. Umut verici görünüyor. Ayrıca, girişimi biraz düzenledim, bu yüzden umarım daha açıktır. Önerileriniz için teşekkür ederim, bir göz atacağım.
OoDeLally

@Gerenuk Böyle harika bir yorum!
uhbif19

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.