Как определить язык текстового документа в Java? - PullRequest
9 голосов
/ 10 января 2009

Существует ли существующая библиотека Java, которая может сказать мне, содержит ли строка текст на английском языке или нет (например, мне нужно иметь возможность различать текст на французском или итальянском языках - функция должна возвращать false для французского и итальянского языков, и true для английского)?

Ответы [ 6 ]

10 голосов
/ 10 января 2009

Существуют различные методы, и надежный метод может комбинировать различные:

  • посмотрите на частоты групп 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 (более сложно, вы могли бы взвесить в соответствии с положением в списке)
  • в конце, предположим, что язык с самым высоким баллом
  • при желании сделать то же самое для общих слов (объединить баллы)

Очевидно, что тогда это можно уточнить, но вы можете обнаружить, что это простое решение достаточно хорошо для того, что вы хотите, так как вы по сути интересуетесь "английский или нет".

2 голосов
/ 23 сентября 2013

Вы пробовали Apache Tika. Он имеет хороший API для определения языка и поддерживает другой язык, загружая соответствующий профиль.

1 голос
/ 10 января 2009

Если вы смотрите на отдельные символы или слова, это сложная проблема. Однако, поскольку вы работаете с целым документом, у вас может быть некоторая надежда. К сожалению, я не знаю существующей библиотеки для этого.

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

Некоторые из лучших списков слов для английского языка - те, которые используются Scrabble игроками. Эти списки, вероятно, существуют и для других языков. Необработанные списки трудно найти через Google, но они есть.

1 голос
/ 10 января 2009

Вот интересное сообщение в блоге , в котором обсуждается эта концепция. Примеры приведены в Scala, но вы должны иметь возможность применять те же общие понятия к Java.

1 голос
/ 10 января 2009

Вы можете попробовать сравнить каждое слово с английским, французским или итальянским словарем. Имейте в виду, что некоторые слова могут встречаться в нескольких словарях.

0 голосов
/ 10 января 2009

Нет "хорошего" способа сделать это ИМО. Все ответы могут быть очень сложными по этой теме. Очевидная часть заключается в проверке символов на французском + итальянском, а не на английском, а затем возвращении false.

Однако, что если слово французское, но не имеет специальных символов? Поиграйте с мыслью, что у вас есть целое время. Вы можете сопоставить каждое слово из словарей, и если отправитель имеет больше французских, чем английских, это не английский Это предотвратит использование общих слов на французском, итальянском и английском языках.

Удачи.

...