Как я определяю язык текстового документа в Java?

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

9
задан Mansfield 7 June 2012 в 16:26
поделиться

5 ответов

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

  • посмотрите на частоты групп букв n (скажите, группы из 3 букв или триграмм) в Вашем тексте и видят, подобны ли они частотам, найденным для языка, Вы тестируете против
  • посмотрите на то, соответствуют ли экземпляры частых слов на данном языке freuencies, найденному в Вашем тексте (это имеет тенденцию работать лучше на более длинные тексты),
  • текст содержит символы, которые сильно сужают его к конкретному языку? (например, если текст содержит перевернутый вопросительный знак существует хороший шанс, это является испанским),
  • можете Вы "свободно анализировать" определенные функции в тексте, который указал бы на конкретный язык, например, если он содержит соответствие к следующему регулярному выражению, Вы могли бы взять это в качестве сильной подсказки, что язык является французским:

    \bvous\s +\p {L} +ez\b

Для запущения Вас вот, частые триграммные и подсчеты слов для английского, французского и итальянского языка (скопированный и вставляемый из некоторого кода - я оставлю его как осуществление для парсинга их):

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

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

10
ответ дан 4 December 2019 в 13:50
поделиться

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

1
ответ дан 4 December 2019 в 13:50
поделиться

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

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

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

1
ответ дан 4 December 2019 в 13:50
поделиться

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

1
ответ дан 4 December 2019 в 13:50
поделиться

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

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

Удачи.

0
ответ дан 4 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: