Vakaya bağlı olarak, aşağıdaki yöntemlerden birini kullanmak ilginizi çekebilir:
Yöntem 0: Bir API veya kitaplık kullanın
Genellikle, bu kütüphanelerde bir kaç sorun vardır çünkü bunlardan bazıları küçük metinler için doğru değildir, bazı diller eksiktir, yavaştır, internet bağlantısı gerektirir, özgür değildir, ... Ancak genel olarak konuşursak, çoğu ihtiyaca uygun olacaktır. .
Yöntem 1: Dil modelleri
Bir dil modeli bize bir dizi kelime olasılığını verir. Bu önemlidir, çünkü metin başka dillerde sözcükler içerse bile (örneğin: "'Hola' ispanyolca'da 'merhaba' anlamına gelir) bile bir metnin dilini sağlam bir şekilde algılamamıza izin verir .
Metninizi puanlamak için N dil modelini (her dil için bir tane) kullanabilirsiniz. Tespit edilen dil, size en yüksek puanı veren modelin dili olacaktır.
Bunun için basit bir dil modeli oluşturmak istiyorsanız, 1 gram tercih ederim. Bunu yapmak için, yalnızca büyük bir metindeki her kelimenin (örneğin "X" dilinde Wikipedia Corpus) görünme sayısını saymanız gerekir.
Daha sonra, bir kelimenin olasılığı, analiz edilen toplam kelime sayısına (tüm frekansların toplamı) bölünmesiyle elde edilen frekans olacaktır.
the 23135851162
of 13151942776
and 12997637966
to 12136980858
a 9081174698
in 8469404971
for 5933321709
...
=> P("'Hola' means 'hello' in spanish") = P("hola") * P("means") * P("hello") * P("in") * P("spanish")
Algılanacak metin oldukça büyükse, N rastgele kelimeyi örneklemenizi ve ardından kayan nokta hassasiyet sorunlarını önlemek için çarpma yerine logaritma toplamını kullanmanızı öneririm.
P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376
Yöntem 2: Kesişen kümeler
Daha da basit bir yaklaşım, en sık kullanılan M kelimeyi içeren N küme (dil başına bir) hazırlamaktır. Sonra metninizi her setle kesiştirin. En yüksek sayıda kesişme noktasına sahip olan set, tespit edilen diliniz olacaktır.
spanish_set = {"de", "hola", "la", "casa",...}
english_set = {"of", "hello", "the", "house",...}
czech_set = {"z", "ahoj", "závěrky", "dům",...}
...
text_set = {"hola", "means", "hello", "in", "spanish"}
spanish_votes = text_set.intersection(spanish_set)
english_votes = text_set.intersection(english_set)
czech_votes = text_set.intersection(czech_set)
...
Yöntem 3: Zip sıkıştırması
Bu, her şeyden çok bir merak, ama işte burada ... Metninizi sıkıştırabilir (örn. LZ77) ve sonra zip mesafesini referans sıkıştırılmış metne (hedef dil) göre ölçebilirsiniz. Kişisel olarak, diğer yöntemlere göre daha yavaş, daha az doğru ve daha az açıklayıcı olduğu için beğenmedim. Yine de, bu yöntem için ilginç uygulamalar olabilir. Daha fazlasını okumak için: Dil Ağaçları ve Sıkıştırma