Подтвердить что ты не робот

Как определить (естественный) язык документа?

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

Есть ли какой-либо "стандартный" алгоритм для этой проблемы, который может быть реализован через несколько часов? Или, альтернативно, бесплатная библиотека .NET или инструментарий, который может это сделать? Я знаю о LingPipe, но это

  • Java
  • Не бесплатно для использования в "полу-коммерческих"

Эта проблема кажется удивительно трудной. Я проверил API Google AJAX Language API (который я нашел, сначала просматривая этот сайт), но это было смешно плохо. Для шести веб-страниц на немецком языке, на которые я указал, только одно предположение было правильным. Другие догадки были шведскими, английскими, датскими и французскими...

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

4b9b3361

Ответ 1

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

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

Ответ 2

Проблема с использованием списка стоп-слов - одна из надежных задач. Остановка списков слов в основном представляет собой набор правил, по одному правилу на слово. Методы, основанные на правилах, как правило, менее надежны для невидимых данных, чем статистические методы. Некоторые проблемы, с которыми вы столкнетесь, - это документы, которые содержат одинаковое количество стоп-слов с каждого языка, документы, которые не имеют стоп-слов, документы, которые останавливают слова с неправильного языка и т.д. Методы, основанные на правилах, не могут ничего делать, t.

Один подход, который не требует, чтобы вы сами реализовали Naive Bayes или любой другой сложный алгоритм математического или машинного обучения, - это подсчет символов и триграмм символов (в зависимости от того, есть ли у вас много или немного данных для начала - - bigrams будет работать с меньшими данными обучения). Запускать подсчеты на нескольких документах (чем лучше, чем лучше) на исходном языке, а затем построить упорядоченный список для каждого языка по количеству отсчетов. Например, английский был бы "th" как самый распространенный bigram. С вашими заказанными списками в руке подсчитайте битрамы в документе, который вы хотите классифицировать и упорядочить. Затем пройдите через каждый из них и сравните его местоположение в отсортированном списке неизвестных документов с его рангом в каждом из учебных списков. Дайте каждому биграмму оценку для каждого языка как

1 / ABS(RankInUnknown - RankInLanguage + 1).

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

Он все равно будет смущен документами, которые содержат одинаковые симметричные числа bigram. Если вы можете получить достаточно данных о тренировках, использование триграмм сделает это менее вероятным. Но использование триграмм означает, что вам также потребуется, чтобы неизвестный документ был длиннее. Для действительно коротких документов может потребоваться отбросить до одного символа (unigram).

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

Ответ 3

Английский и немецкий языки используют один и тот же набор букв, за исключением ä, ö, ü и ß (eszett). Вы можете искать эти буквы для определения языка.

Вы также можете посмотреть на этот текст (Сравнение двух схем идентификации языков) от Grefenstette. Он смотрит на триграммы и короткие слова. Общие триграммы для немецких en_, er_, _de. Общие триграммы для английского языка the_, he_, the...

Theres также Bob Carpenters Как LingPipe выдает идентификатор языка?

Ответ 4

Я считаю, что стандартная процедура заключается в измерении качества предлагаемого алгоритма с тестовыми данными (т.е. с corpus). Определите процент правильного анализа, который вы хотите получить алгоритму, а затем запустите его по нескольким документам, которые вы классифицировали вручную.

Что касается конкретного алгоритма: использование списка стоп-слов звучит отлично. Другим подходом, который, как сообщается, является использование Байесовский фильтр, например. SpamBayes. Вместо того, чтобы тренировать его в ветчине и спаме, обучите его английскому и немецкому языкам. Используйте часть своего тела, запустите это через spambayes, а затем проверьте его на полных данных.

Ответ 5

Определение языка не очень сложно концептуально. Пожалуйста, посмотрите мой ответ на связанный вопрос и другие ответы на тот же вопрос.

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

Действия

  • Возьмите два корпуса для двух языков и извлеките символы символа, биграммы, триграммы и разделители с пробелами (слова). Следите за их частотой. Этот шаг создает вашу "языковую модель" для обоих языков.

  • С учетом фрагмента текста, обозначьте те же самые символы char, триграммы и разделители с пробелами и соответствующие им "относительные частоты" для каждого корпуса. Если в вашей модели отсутствует конкретная "функция" (char bigram/trigram или токен), обработайте ее "сырое количество" как 1 и используйте ее для вычисления своей "относительной частоты".

  • Произведение относительных частот для конкретного языка дает "оценку" для языка. Это наивно-наивное приближение вероятности того, что предложение принадлежит этому языку.

  • Побеждает высший выигрышный язык.

Примечание 1: Мы рассматриваем "исходный счет" как 1 для функций, которые не встречаются в нашей языковой модели. Это потому, что на самом деле эта функция имела бы очень маленькую ценность, но поскольку у нас есть конечный корпус, мы, возможно, еще не столкнулись с этим. Если вы считаете, что значение count равно нулю, ваш весь продукт также будет равен нулю. Чтобы этого избежать, мы предполагаем, что это событие 1 в нашем корпусе. Это называется сглаживанием сложения. Существуют другие методы сглаживания продвижения.

Примечание 2: Поскольку вы будете умножать большое количество фракций, вы можете легко запустить до нуля. Чтобы этого избежать, вы можете работать в логарифмическом пространстве и использовать это уравнение для вычисления вашей оценки.

                a X b =  exp(log(a)+log(b))

Примечание 3: Алгоритм, который я описал, является "очень наивной" версией " алгоритм Наивного Байеса".

Ответ 6

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

Ответ 7

Если вы хотите сгибать мышцы программирования, пытаясь решить проблему самостоятельно, я призываю вас; однако колесо существует, если вы хотите, чтобы вы его использовали.

Windows 7 поставляется с этой встроенной функциональностью. Компонент под названием "Расширенные лингвистические службы" (ELS) имеет возможность обнаруживать скрипты и естественные языки, а также в ящике на любой машине Windows 7 или Windows Server 2008. В зависимости от того, есть ли у вас такие доступные машины и что вы имеете в виду, когда говорите "бесплатно", это сделает это за вас. В любом случае, это альтернатива Google или другим производителям, упомянутым здесь.

http://msdn.microsoft.com/en-us/library/dd317700(v=VS.85).aspx

И если вы хотите получить доступ к этому из .NET, здесь есть информация о нем:

http://windowsteamblog.com/blogs/developers/archive/2009/05/18/windows-7-managed-code-apis.aspx

Надеюсь, что это поможет.

Ответ 8

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

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

Ответ 9

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

Если ваш метод нуждается в улучшении, попробуйте утянуть свои слова остановки от редкости в большом корпусе английского и немецкого языков. Или вы могли бы использовать более сложную технику, такую ​​как обучение марковская модель или Байесовский классификатор. Вы можете расширить любой из алгоритмов, чтобы посмотреть n-grams (например, две или три последовательности слов) или другие функции в текст.

Ответ 10

Вы можете использовать API обнаружения Google Language.

Вот небольшая программа, которая его использует:

baseUrl = "http://ajax.googleapis.com/ajax/services/language/detect"

def detect(text):
    import json,urllib
    """Returns the W3C language code of a natural language"""

    params = urllib.urlencode({'v': '1.0' , "q":text[0:3000]}) # only use first 3000 characters                    
    resp = json.load(urllib.urlopen(baseUrl + "?" + params))
    try:
        retText = resp['responseData']['language']
    except:
        raise
    return retText


def test():
    print "Type some text to detect its language:"
    while True:
        text = raw_input('#>  ')
        retText = detect(text)
        print retText


if __name__=='__main__':
    import sys
    try:
        test()
    except KeyboardInterrupt:
        print "\n"
        sys.exit(0)

Другие полезные ссылки:

Google объявляет API (и демо):      http://googleblog.blogspot.com/2008/03/new-google-ajax-language-api-tools-for.html

Оболочка Python:      http://code.activestate.com/recipes/576890-python-wrapper-for-google-ajax-language-api/

Другой питон script:       http://www.halotis.com/2009/09/15/google-translate-api-python-script/

RFC 1766 определяет языки W3C

Получить текущие коды языков:   http://www.iana.org/assignments/language-subtag-registry

Ответ 11

Вы пробовали Apache Tika? Он может определять язык данного текста:

http://www.dovetailsoftware.com/blogs/kmiller/archive/2010/07/02/using-the-tika-java-library-in-your-net-application-with-ikvm

У меня нет опыта работы с .Net, но эта ссылка может помочь. Если вы можете выполнить банку в своей среде, попробуйте следующее:

 java -jar tika-app-1.0.jar -l http://www.admin.ch/

Вывод:

de

Надеюсь, что это поможет.