2010-02-24 21 views
13

İki altyazı dosyam var. OnlarınMetin benzerliği algoritması

Bazen sadece bir dosyada "rüzgâr ... müzik çalıyor esiyor" gibi yorumların olduğunu benzer metin aynı metni temsil veya olmadığını söyleyen bir işlev gerekir. Ancak içeriğin% 80'i aynı olacak. Fonksiyon TRUE değerini döndürmelidir (dosyalar aynı metni temsil eder). 1 yerine l gibi Ve bazen orada hatalı yazımlar - burada (bir L): O bagaj 1eft. Elbette, işlev TRUE değerini döndürmesi gerektiği anlamına gelir.

Yorumlarım:
metinlerinin benzerliği yüzdesini dönmelidir fonksiyonu - burada olarak düşünülebilir edeceğimi -

"tüm insanlar mutlu değildi" "tüm insanlar mutlu" ve KABUL yanlış yazım, bu yüzden aynı metin olarak kabul edilir. Kesin olmak gerekirse, işlev döndürme yüzdesi daha düşük olacak, ancak ifadelerin benzer olduğunu söyleyecek kadar yüksek olacaktır.

Levenshtein'i bir dosyaya mı yoksa sadece bir arama dizgisine mi uygulamak istediğinizi düşünün. Algoritmanın bir bütün olarak dosyaya uygulanması gerekir. Yine de çok uzun bir ip olacak.

+2

metinlerinin benzerliği yüzdesini dönmelidir fonksiyonu ve TRUE veya FALSE için eşiğe karar verirsiniz. – YOU

+0

Benzerlik ölçütleriniz hakkında çok dikkatli olmanız gerekecek ve bence bu, yapmaya çalıştığınız şeyin en zor kısmı olabilir.Mesela "bütün insanlar mutluydu" ve "tüm insanlar mutlu değillerdi" metinsel olarak benzer ama anlam bakımından tamamen tersi. Benzer ve farklı metinlerin bazı örnekleri yardımcı olabilir. – glenatron

+1

Soundex'e (http://en.wikipedia.org/wiki/Soundex) göz atın ve aradığınız bir şey olup olmadığına bakın. –

cevap

11

Levenshtein algoritması: sıfır sonucu dışında http://en.wikipedia.org/wiki/Levenshtein_distance

şey metni "özdeş" olmadığı anlamına gelir. "Benzer", ne kadar uzak/yakınında olduklarının bir ölçüsüdür. Sonuç bir tamsayıdır.

+2

+1: Tamsayı sonucunun, tüm dosyanın benzerliğini belirlemek için normalleştirilmesi gerekir. Örneğin. Benzerlik = Levenshtein Mesafe/Num. Karakterler. Ayrıca, bu algoritmayı uygulamadan önce yazım hatalarını düzeltmek için dosyanın ön işlemesini öneririm. http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html#getLevenshteinDistance(java.lang: – Adamski

+0

Apache Commons 'StringUtils' içinde Levenshtein mesafenin bir uygulama yoktur. string, java.lang.String) –

+2

@Fabian: http://php.net/manual/en/function.levenshtein.php – soulmerge

2

approximate grep'a bir göz atın. Bu size, işaretçiyi verebilir, ancak bahsettiğiniz gibi büyük metin parçaları üzerinde neredeyse tamamen kesindir.

DÜZENLEME: sizin için bir fonksiyon yazmak zorunda kalacak gibi görünüyor, Agrep orijinal sürümü açık kaynak değildir, bu yüzden Çok fazla burada bekliyoruz http://en.wikipedia.org/wiki/Agrep

2

den ÖSS sürümlerinin bağlantılarını alabilirsiniz özel ihtiyaçlarınız. Varolan bir dosya karşılaştırma uygulamasıyla başlamanızı öneririm (belki de diff zaten ihtiyacınız olan her şeye sahiptir) ve girişiniz için iyi sonuçlar sağlamak için bunu geliştirin.

+0

tarihinde Levenshtein uygulamak veya bilinen bir yazı tipi boyutu (ve yüz) ile metin oluşturmak isteyip düşünün ve sonra piksel karşılaştırmak etmeyin. bu şekilde, benzer görünümlü şekle sahip semboller benzer görünebilir ve bunu algılaması daha kolaydır. – Chii

+0

@Chii ama daha büyük bir simge üzerinde kayan sayfanın geri kalanını her şeye fırlatacaktı. –

+0

Soruyu sanmıyorum OCR ile ilgisi vardır, ancak sadece düz metin – stillstanding

5

Açıkladığınız sorun için (yani büyük dizeleri hesaplama), term frequency vektörlerindeki 0 (tamamen farklı) ile 1 (aynı) arasında bir sayı döndüren Cosine Similarity kullanabilirsiniz.

Burada açıklanan birkaç uygulamalarda bakmak isteyebilirsiniz: Cosine Similarity