Pull to refresh

Как определить язык текста?

Reading time 2 min
Views 39K
imageХочется раз и навсегда решить проблему определения языка пользовательского ввода на сайте. Представьте, что я делаю многоязычный Habrahabr :-) и не хочу спрашивать у пользователя, на каком языке он пишет. Думаю, компьютер должен справится с такой проблемой.



Формулировка задачи

  • нужно по фрагменту текста определить его язык. Длина фрагмента — от нескольких слов до нескольких десятков предложений. Это может быть связный текст или, например, заголовок статьи;
  • текст дан в кодировке UTF-8;
  • набор интересующих меня языков жестко задан. Количество языков — 5..10. В рабочем приложении можно даже ограничиться меньшим количеством, чтобы увеличить точность определения;
  • текст может содержать включения других языков. Нужно определить основной (более 60% слов, например);
  • для моей задачи не всегда нужно точно определять. Например, чаще всего не нужно различать украинский и русский;
  • автор текста знает язык, на котором пишет.
Существующие решения не подходят. Проблема в том, что их делали математики и программисты. Эти решения, в основном, анализируют один параметр и выдают странные вероятности того, что текст написан на каком-то языке. А мне нужны не вероятности. Мне нужно язык определить :-). Вторая проблема — статистические алгоритмы разваливаются на текстах, содержащими включения других языков.

Думаю, нужно последовательно анализировать много параметров.

Ради эксперимента я попробовал визуально определять незнакомый язык текста. Например, запросто отличу португальский от немецкого, хотя не знаю ни тот ни другой.

Алгоритм моих действий примерно такой:
  • смотрю на набор символов, которые встречаются в словах. Причем, именно по словам, а не по всему тексту, т.к. в тексте могут быть «иностранные» слова. На этом этапе уже можно исключить две трети языков.
  • ищу характерные союзы и предлоги — по ним можно разделить языки с одинаковым набором символов
  • пытаюсь прочитать текст, исходя из предположения, что он написан на языке, который определился. Мне сложно сказать, что происходит на этом этапе… Думаю, это сложный анализ грамматики языка. Я распознаю известные мне слова, проверяю окончания.

Несколько примеров несостоятельных алгоритмов

vitali.at.tut.by — статистический алгоритм, основанный на подсчете количества двухбуквенных сочетаний в тексте. Протестировать не удалось, т.к. бинарник с сайта удалили.
Перловый модуль.
Живой пример, который сказал, что эта статья написана на турецком.
Еще есть статья про нейросетевые классификаторы и семантический анализ:
В полиграммной модели со степенью n и основанием M текст представляется вектором {fi}, i = 1..Mn, где fi – частота встречаемости i-ой n-граммы в тексте.n-грамма является последовательностью подряд идущих n – символов вида a1…an-1an...
— нихрена не понял

Дальше искать не стал.


Пример состоятельного алгоритма

Переводчик Google прекрасно определяет язык по нескольким словам. Его не сбивает с толку даже включение «иностранного» слова в предложение.


P.S.

Еще у меня есть странное желание проделать это на стороне клиента, с использованием javascript. Не думаю, что анализ нескольких слов требует обращения к Google Language API…

P.S. 2

В итоге использовал Google Language API… Подозреваю, что в спорных случаях они используют поиск по словарю, а я этого не могу себе позволить на стороне клиента.

Tags:
Hubs:
+30
Comments 73
Comments Comments 73

Articles