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

  1. Открываются, новый терминал
  2. Находят, что под управлением контейнерный идентификатор docker ps
  3. Уничтожает контейнер docker kill ${containerId}
21
задан Robert Petermeier 6 September 2009 в 13:32
поделиться

10 ответов

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

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

6
ответ дан 29 November 2019 в 21:24
поделиться

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

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

Есть еще Боба Карпентера. Как LingPipe выполняет языковой идентификатор?

4
ответ дан 29 November 2019 в 21:24
поделиться

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

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

3
ответ дан 29 November 2019 в 21:24
поделиться

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

Один из подходов, который не требует от вас реализации наивного Байеса или любого другого сложного математического или машинного алгоритма обучения самостоятельно, - это подсчет символьных биграмм и триграмм (в зависимости от того, много ли у вас данных для начнем с - биграммы будут работать с меньшим количеством обучающих данных). Выполните подсчет нескольких документов (чем больше, тем лучше) известного исходного языка, а затем создайте упорядоченный список для каждого языка по количеству подсчетов. Например, в английском языке наиболее распространенной биграммой будет «th». Имея в руках свои упорядоченные списки, подсчитайте биграммы в документе, который вы хотите классифицировать, и расположите их по порядку. Затем просмотрите каждый из них и сравните его положение в отсортированном списке неизвестных документов с его рангом в каждом из обучающих списков. Дайте каждой биграмме оценку для каждого языка как

1 / ABS (RankInUnknown - RankInLanguage + 1) .

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

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

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

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

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

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

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

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

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

6
ответ дан 29 November 2019 в 21:24
поделиться

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

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

1
ответ дан 29 November 2019 в 21:24
поделиться

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

2
ответ дан 29 November 2019 в 21:24
поделиться

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

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

1
ответ дан 29 November 2019 в 21:24
поделиться

Вы можете использовать Google Language Detection API.

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

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 /

Другой сценарий Python: http://www.halotis.com/2009/09/15/google-translate-api-python-script/

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

Текущие коды языков можно получить по адресу: http://www.iana.org/assignments/language-subtag-registry

1
ответ дан 29 November 2019 в 21:24
поделиться

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

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

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

3
ответ дан 29 November 2019 в 21:24
поделиться

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

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

Шаги :

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

  2. Для данного фрагмента текста определите символьные биграммы, триграммы и символы, разделенные пробелами, и их соответствующие «относительные частоты» для каждого корпуса. Если конкретная «функция» (символьная биграмма / триграмма или токен) отсутствует в вашей модели, обработайте ее «необработанный счетчик» как 1 и используйте его для вычисления «относительной частоты».

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

  4. Выигрывает язык с более высокой оценкой.

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

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

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

Примечание 3: описанный мной алгоритм является «очень наивной» версией « наивного байесовского алгоритма ».

3
ответ дан 29 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

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