Gürültülü dizeler listesinden standart dizeyi ayıkla


10

Binlerce dizgi listem var ve her listenin yaklaşık 10 dizesi var. Belirli bir listedeki dizelerin çoğu çok benzerdir, ancak bazı dizeler diğerleriyle tamamen ilgisizdir ve bazı dizeler alakasız kelimeler içerir. Kanonik bir ipin gürültülü varyasyonları olarak düşünülebilir. Her liste bu standart dizeye dönüştürecek bir algoritma veya kütüphane arıyorum.

İşte böyle bir liste.

  • Yıldız Savaşları: Bölüm IV Yeni Bir Umut | StarWars.com
  • Yıldız Savaşları Bölüm IV - Yeni Bir Umut (1977)
  • Yıldız Savaşları: Bölüm IV - Yeni Bir Umut - Çürük Domates
  • Star Wars: Episode IV - A New Hope Online Ücretsiz İzle
  • Yıldız Savaşları (1977) - En Büyük Filmler
  • [REC] 4 afiş dıştan takma motorla ölüm vaat ediyor - SciFiNow

Bu liste için, normal ifadeyle eşleşen herhangi bir dize ^Star Wars:? Episode IV (- )?A New Hope$kabul edilebilir.

Andrew Ng'in Coursera'daki Machine Learning kursuna baktım, ancak benzer bir sorun bulamadım.


2
PS Bence aradığınız terim "standart"
Sean Owen

Normal ifadeyi tanımlamak istediğiniz "en olası" / "en uzlaşmacı" dize mi? Veya listedeki dizelerden biri mi?
MrMeritology

@MrMeritoloji Normal bir ifade aramıyorum. Sorumun doğru olduğunu düşündüğüm dizelerde ne kadar esnek olduğumu göstermek için sorumda düzenli bir ifade gösterdim.
lacton

TAMAM. Sonra aşağıda verdiğim cevap sizin için işe yarayacaktır.
MrMeritology

Bu NER (adlandırılmış varlık tanıma) altında mı gelir?
hippietrail

Yanıtlar:


4

Saf bir çözüm olarak önce listenin içinde en sık kullanılan jetonları içeren dizeleri seçmenizi öneririm. Bu şekilde alakasız iplerden kurtulabilirsiniz.

İkinci cümlede çoğunluk oyu yapardım. 3 cümleyi varsayarsak:

  • Yıldız Savaşları: Bölüm IV Yeni Bir Umut | StarWars.com
  • Yıldız Savaşları Bölüm IV - Yeni Bir Umut (1977)
  • Yıldız Savaşları: Bölüm IV - Yeni Bir Umut - Çürük Domates

Jetonları tek tek geçirdim. "Star" ile başlıyoruz. Tüm dize onunla başladığında kazanır. "Savaşlar" da kazanacak. Sıradaki ":". Ayrıca kazanacak.

Tüm jetonlar "Umut" a kadar çoğunluk oylamasıyla oylanacak. "Umut" un ardından bir sonraki belirteç "|" ya da "(" ya da "-") olacaktır.

Başka bir çözüm muhtemelen En Uzun ortak alt diziyi kullanmak olacaktır .

Dediğim gibi bu konuda fazla bir şey yok. Yani probleminize çok daha iyi çözümler olabilir :-)


3

İlk önce tüm dize çiftleri arasındaki düzenleme mesafesini hesaplayın. Bkz. Http://en.wikipedia.org/wiki/Edit_distance ve http://web.stanford.edu/class/cs124/lec/med.pdf . Ardından, bazı mesafe eşiğine göre aykırı dizeleri hariç tutun.

Kalan dizelerle, en merkezi dizeyi tanımlamak için mesafe matrisini kullanabilirsiniz. Kullandığınız yönteme bağlı olarak, bazı veriler için belirsiz sonuçlar alabilirsiniz. Hiçbir yöntem tüm olasılıklar için mükemmel değildir. Amaçlarınız için, tek ihtiyacınız olan belirsizlikleri gidermek için bazı sezgisel kurallardır - yani iki veya daha fazla aday seçin.

Belki dizeler listenizden "en merkezi" yi seçmek istemezsiniz, bunun yerine, aykırı olmayan tüm dizelerde ortak olan kalıbı yakalayan normal bir ifade oluşturmak istersiniz. Bunu yapmanın bir yolu, aykırı olmayan tüm dizelerden eşit uzaklıkta olan bir dizeyi sentezlemektir. Matristen gerekli düzenleme mesafesini hesaplayabilir ve ardından bu mesafeleri sınırlama olarak kullanarak rastgele düzenli olarak oluşturursunuz. Daha sonra aday düzenli ifadelerini test eder ve kısıtlamalara uyan ve aykırı olmayan listenizdeki tüm dizeleri kabul eden ilk ifadeyi kabul edersiniz. (Joker karakter olmayan karakterler olduğu için en uzun ortak alt dize listelerinden düzenli ifadeler oluşturmaya başlayın.)

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.