2010-02-24 4 views
25

Предположим, что у нас есть текстовый файл с содержимым: «Je SUIS ип кавалер Ьотте ...»Как узнать, на каком языке написан текстовый файл?

другой с: «Я смелый человек»

третий с текстом на немецком языке: «Гуттен Морген. Ви-гет?»

Как написать функцию, которая сообщила бы нам: с такой вероятностью текст в первом файле находится на английском языке, а во втором - французский и т. Д.?

Ссылки на книги/готовые решения приветствуются. Я пишу на Java, но при необходимости могу изучить Python.

Мои комментарии

  1. Там в один небольшой комментарий, мне нужно добавить. Текст может содержать фразы на разных языках, как часть целого или в результате ошибки. В классической литературе у нас есть много примеров, потому что члены аристократии были многоязычны. Таким образом, вероятность лучше описывает ситуацию, так как большинство частей текста находятся на одном языке, а другие могут быть написаны в другом.
  2. API Google - подключение к Интернету. Я бы предпочел не использовать удаленные функции/службы, поскольку мне нужно сделать это самостоятельно или использовать загружаемую библиотеку. Я бы хотел провести исследование по этой теме.
+0

@EugeneP: французский был бы более «Je suis un bel homme ...»;), но язык-детектор вряд ли обнаружит эту ошибку (или, по крайней мере, очень необычное использование). – SyntaxT3rr0r

+0

@WizardOfOdds Je suis un bonhomme alors, merci, quand meme;) – EugeneP

+2

Также надеюсь, что вы уже проверили это: http://stackoverflow.com/questions/1383503/how-to-determine-the-natural-language-of- a-document –

ответ

19

Существует пакет под названием JLangDetect, который, кажется, делает именно то, что вы хотите:

langof("un texte en français") = fr : OK 
langof("a text in english") = en : OK 
langof("un texto en español") = es : OK 
langof("un texte un peu plus long en français") = fr : OK 
langof("a text a little longer in english") = en : OK 
langof("a little longer text in english") = en : OK 
langof("un texto un poco mas largo en español") = es : OK 
langof("J'aime les bisounours !") = fr : OK 
langof("Bienvenue à Montmartre !") = fr : OK 
langof("Welcome to London !") = en : OK 
// ... 

Edit: Кевин отметил, есть подобная функциональность в Nutch project обеспечивается пакетом org.apache.nutch.analysis.lang.

+0

Почему нет немецкого примера? – Chris

+0

@ Крис Ну, хороший вопрос. Я знаю только одну фразу, давайте посмотрим, смогу ли я правильно ее написать. – EugeneP

+0

Я не знаю, но немецкий язык указан как поддерживаемый язык. –

0

У вас есть подключение к Интернету, если вы затем Google Language API был бы идеальным для вас.

// This example request includes an optional API key which you will need to 
// remove or replace with your own key. 
// Read more about why it's useful to have an API key. 
// The request also includes the userip parameter which provides the end 
// user's IP address. Doing so will help distinguish this legitimate 
// server-side traffic from traffic which doesn't come from an end-user. 
URL url = new URL(
    "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&" 
    + "q=Paris%20Hilton&key=INSERT-YOUR-KEY&userip=USERS-IP-ADDRESS"); 
URLConnection connection = url.openConnection(); 
connection.addRequestProperty("Referer", /* Enter the URL of your site here */); 

String line; 
StringBuilder builder = new StringBuilder(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
while((line = reader.readLine()) != null) { 
builder.append(line); 
} 

JSONObject json = new JSONObject(builder.toString()); 
// now have some fun with the results... 

Если у вас нет других методов.

3

Посмотрите цепи Маркова.

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

5

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

Однако одно предложение, скорее всего, слишком короткое, чтобы дать какие-либо полезные статистические меры. Тогда у вас может быть больше удачи в сопоставлении отдельных слов со словарем.

2

Хотя более сложное решение, чем вы ищете, вы можете использовать Vowpal Wabbit и обучать его предложениями с разных языков.

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

http://hunch.net/~vw/

(Не обманывайтесь «онлайн» в подзаголовке проекта - это только mathspeak для Изучает без необходимости иметь весь учебный материал в памяти)

+0

Благодарим вас за ответ. – EugeneP

4

NGramJ, кажется, немного более уточненный:

http://ngramj.sourceforge.net/

он также имеет как символьные-ориентированные и байт-ориентированных профилей, поэтому он должен быть в состоянии определить набор символов тоже.

Для документов на нескольких языках вам необходимо идентифицировать набор символов (ICU4J имеет CharsetDetector, который может это сделать), а затем разделить текст на что-то резонансное, как несколько разрывов строк, или абзацы, если текст помечен.

+0

Спасибо за ваш ответ. – EugeneP

4

Попробуйте Nutch's Language Identifier. Он обучается с n-граммовыми профилями языков, а профиль доступных языков соответствует входному тексту. Интересно то, что вы можете добавить больше языков, если вам нужно.

+0

Мы используем идентификатор языка nutch с очень хорошими результатами. Это стандартная реализация модели bigram, которая работает для языков, разделяющих набор символов. –

2

Если вы заинтересованы в механизме, с помощью которого может быть обнаружено распознавание языка, я отсылаю вас к следующим article (на основе python), который использует (очень) наивный метод, но является хорошим введением к этой проблеме, в частности, и машинное обучение (просто большое слово) в целом.

Для реализаций java, JLangDetect и Nutch, как утверждают другие плакаты, довольно хороши. Также взгляните на Lingpipe, JTCL и NGramJ.


Для задачи, где у вас есть несколько языков в одной и той же странице, вы можете использовать детектор граничное предложение, чтобы расколоть страницу в предложениях, а затем попытаться определить язык каждого предложения. Предполагая, что предложение содержит только один (основной) язык, вы все равно должны получать хорошие результаты с любой из вышеперечисленных реализаций.

Примечание: детектор границы предложения (SBD) теоретически зависит от языка (проблема с куриным яйцом, так как вам нужен один для другого). Но для языков на латинском языке (английский, французский, немецкий и т. Д.), Которые в основном используют периоды (помимо восклицательных знаков и т. Д.) Для ограничения предложения, вы получите приемлемые результаты, даже если вы используете SBD, предназначенный для английского языка. Я написал основанный на правилах английский SBD, который отлично поработал для французского текста. Для реализаций взгляните на OpenNLP.

Альтернативный вариант использования SBD является использование скользящего окна, скажем, 10 жетонов (пробелы разделителями), чтобы создать псевдо-приговор (PS) и попытаться определить границу, где язык изменения. Это имеет тот недостаток, что если весь ваш документ имеет n токенов, вы будете выполнять приблизительно n-10 операций классификации по строкам длиной 10 токенов каждый. В другом подходе, если среднее предложение имеет 10 токенов, вы выполнили бы приблизительно n/10 операций классификации. Если n = 1000 слов в документе, вы сравниваете 990 операций против 100 операций: разность по порядку величины.


Если у вас короткие фразы (менее 20 символов), точность определения языка в моем опыте оставляет желать лучшего. В частности, в случае правильных существительных, а также существительных, которые одинаковы на разных языках, таких как «шоколад». Например. Является ли «Нью-Йорк» английским словом или французским словом, если оно появляется во французском предложении?

0

Модели bigram хорошо работают, просты в написании, просты в обучении и требуют лишь небольшого количества текста для обнаружения. Идентификатор языка nutch - это реализация Java, которую мы нашли и используем с тонкой оболочкой.

У нас были проблемы с моделью bigram для смешанного CJK и английского текста (т. Е. Твит в основном японский, но имеет одно английское слово). Это очевидно в ретроспективе, если посмотреть на математику (у японцев много других персонажей, поэтому вероятность любой пары невелика). Я думаю, вы могли бы решить это с помощью более сложного линейно-линейного сравнения, но я обманул и использовал простой фильтр, основанный на наборах символов, которые уникальны для определенных языков (т. Е. Если он содержит только унифицированный Хань, тогда это китайский, если он содержит некоторые Японская кана и унифицированный Хан, тогда это японский).

Смежные вопросы