W zależności od przypadku możesz być zainteresowany użyciem jednej z następujących metod:
Metoda 0: użyj interfejsu API lub biblioteki
Zwykle jest kilka problemów z tymi bibliotekami, ponieważ niektóre z nich nie są dokładne dla małych tekstów, brakuje niektórych języków, są wolne, wymagają połączenia z Internetem, są płatne, ... Ale ogólnie rzecz biorąc, będą odpowiadać większości potrzeb .
Metoda 1: Modele językowe
Model języka daje nam prawdopodobieństwo wystąpienia sekwencji słów. Jest to ważne, ponieważ pozwala nam skutecznie wykryć język tekstu, nawet jeśli tekst zawiera słowa w innych językach (np. „Hola” oznacza „cześć” po hiszpańsku ” ).
Możesz użyć N modeli językowych (po jednym na język), aby ocenić swój tekst. Wykryty język będzie językiem modelu, który dał Ci najwyższy wynik.
Jeśli chcesz zbudować do tego prosty model językowy, wybrałbym 1-gram. Aby to zrobić, wystarczy policzyć, ile razy pojawiło się każde słowo z dużego tekstu (np. Korpus Wikipedii w języku „X”).
Wtedy prawdopodobieństwo wystąpienia słowa będzie równe jego częstotliwości podzielonej przez całkowitą liczbę przeanalizowanych słów (suma wszystkich częstości).
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")
Jeśli tekst do wykrycia jest dość duży, zalecam próbkowanie N losowych słów, a następnie użycie sumy logarytmów zamiast mnożenia, aby uniknąć problemów z precyzją zmiennoprzecinkową.
P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376
Metoda 2: Przecinające się zbiory
Jeszcze prostszym podejściem jest przygotowanie N zestawów (po jednym na język) z M najczęściej występującymi słowami. Następnie przetnij swój tekst z każdym zestawem. Zestaw z największą liczbą skrzyżowań będzie wykrytym językiem.
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)
...
Metoda 3: Kompresja zip
To bardziej ciekawostka niż cokolwiek innego, ale oto jest ... Możesz skompresować swój tekst (np. LZ77), a następnie zmierzyć odległość zip w odniesieniu do skompresowanego tekstu referencyjnego (język docelowy). Osobiście mi się to nie podobało, ponieważ jest wolniejsze, mniej dokładne i mniej opisowe niż inne metody. Niemniej jednak mogą istnieć interesujące zastosowania tej metody. Aby przeczytać więcej: Drzewa języków i zipowanie