
Формулировка задачи
- нужно по фрагменту текста определить его язык. Длина фрагмента — от нескольких слов до нескольких десятков предложений. Это может быть связный текст или, например, заголовок статьи;
- текст дан в кодировке UTF-8;
- набор интересующих меня языков жестко задан. Количество языков — 5..10. В рабочем приложении можно даже ограничиться меньшим количеством, чтобы увеличить точность определения;
- текст может содержать включения других языков. Нужно определить основной (более 60% слов, например);
- для моей задачи не всегда нужно точно определять. Например, чаще всего не нужно различать украинский и русский;
- автор текста знает язык, на котором пишет.
Думаю, нужно последовательно анализировать много параметров.
Ради эксперимента я попробовал визуально определять незнакомый язык текста. Например, запросто отличу португальский от немецкого, хотя не знаю ни тот ни другой.
Алгоритм моих действий примерно такой:
- смотрю на набор символов, которые встречаются в словах. Причем, именно по словам, а не по всему тексту, т.к. в тексте могут быть «иностранные» слова. На этом этапе уже можно исключить две трети языков.
- ищу характерные союзы и предлоги — по ним можно разделить языки с одинаковым набором символов
- пытаюсь прочитать текст, исходя из предположения, что он написан на языке, который определился. Мне сложно сказать, что происходит на этом этапе… Думаю, это сложный анализ грамматики языка. Я распознаю известные мне слова, проверяю окончания.
Несколько примеров несостоятельных алгоритмов
vitali.at.tut.by — статистический алгоритм, основанный на подсчете количества двухбуквенных сочетаний в тексте. Протестировать не удалось, т.к. бинарник с сайта удалили.
Перловый модуль.
Живой пример, который сказал, что эта статья написана на турецком.
Еще есть статья про нейросетевые классификаторы и семантический анализ:
В полиграммной модели со степенью n и основанием M текст представляется вектором {fi}, i = 1..Mn, где fi – частота встречаемости i-ой n-граммы в тексте.n-грамма является последовательностью подряд идущих n – символов вида a1…an-1an...— нихрена не понял
Дальше искать не стал.
Пример состоятельного алгоритма
Переводчик Google прекрасно определяет язык по нескольким словам. Его не сбивает с толку даже включение «иностранного» слова в предложение.