Существуют различные методы, и надежный метод может комбинировать различные:
- посмотрите на частоты групп n букв (скажем, группы из 3 букв или триграмм ) в вашем тексте и посмотрите, похожи ли они на найденные частоты для языка, с которым вы тестируете
- посмотрите, соответствуют ли частые слова в данном языке частоте встречаемости в вашем тексте (это работает лучше для длинных текстов )
- содержит ли текст символов , что сильно сужает его до определенного языка? (например, если текст содержит перевернутый вопросительный знак, есть большая вероятность, что он испанский)
можете ли вы "свободно анализировать" определенные функции в тексте, которые указывают на конкретный язык, например, если оно содержит соответствие следующему регулярному выражению, вы можете принять это как убедительный признак того, что язык является французским:
\ bvous \ S + \ р {Ь} + эз \ Ъ * +1027 *
Для начала, вот частые триграммы и количество слов для английского, французского и итальянского языков (скопированы и вставлены из некоторого кода - я оставлю это в качестве упражнения для их анализа):
Locale.ENGLISH,
"he_=38426;the=38122;nd_=20901;ed_=20519;and=18417;ing=16248;to_=15295;ng_=15281;er_=15192;at_=14219",
"the=11209;and=6631;to=5763;of=5561;a=5487;in=3421;was=3214;his=2313;that=2311;he=2115",
Locale.FRENCH,
"es_=38676;de_=28820;ent=21451;nt_=21072;e_d=18764;le_=17051;ion=15803;s_d=15491;e_l=14888;la_=14260",
"de=10726;la=5581;le=3954;" + ((char)224) + "=3930;et=3563;des=3295;les=3277;du=2667;en=2505;un=1588",
Locale.ITALIAN,
"re_=7275;la_=7251;to_=7208;_di=7170;_e_=7031;_co=5919;che=5876;he_=5622;no_=5546;di_=5460",
"di=7014;e=4045;il=3313;che=3006;la=2943;a=2541;in=2434;per=2165;del=2013;un=1945",
(Количество триграмм на миллион символов; количество слов на миллион слов. Символ '_' представляет границу слова.)
Насколько я помню, цифры приведены в Оксфордском справочнике по вычислительной лингвистике и основаны на выборке газетных статей. Если у вас есть набор текста на этих языках, достаточно легко самостоятельно получить похожие цифры.
Если вы хотите действительно быстрый и грязный способ применения вышеперечисленного, попробуйте:
- учитывайте каждую последовательность из трех символов в вашем тексте (заменяя границы слов на '_')
- для каждой триграммы, которая соответствует одной из частых для данного языка, увеличьте «оценку» этого языка на 1 (более сложно, вы могли бы взвесить в соответствии с положением в списке)
- в конце, предположим, что язык с самым высоким баллом
- при желании сделать то же самое для общих слов (объединить баллы)
Очевидно, что тогда это можно уточнить, но вы можете обнаружить, что это простое решение достаточно хорошо для того, что вы хотите, так как вы по сути интересуетесь "английский или нет".