Как определить язык

Есть ли хорошие механизмы с открытым исходным кодом для определения того, на каком языке находится текст, возможно, с метрикой вероятности? Тот, который я могу запустить локально и не запрашивать Google или Bing? Я хотел бы определить язык для каждой страницы в примерно 15 миллионах страниц текста OCR.

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

7 ответов

Решение

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

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

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

Тогда выпустите это как открытый источник. И вуаля, у вас есть движок с открытым исходным кодом для определения языка текста!

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

Попробуйте CLD2:

Монтаж

sudo -H pip install cld2-cffi

Бежать

import cld2

res = cld2.detect("This is a sample text.")
print(res)
res = cld2.detect("Dies ist ein Beispieltext.")
print(res)
res = cld2.detect("Je ne peut pas parler cette language.")
print(res)
res = cld2.detect(" هذه هي بعض النصوص العربية")
print(res)
res = cld2.detect("这是一些阿拉伯文字")  # Chinese?
print(res)
res = cld2.detect("これは、いくつかのアラビア語のテキストです")
print(res)
print("Supports {} languages.".format(len(cld2.LANGUAGES)))

дает

Detections(is_reliable=True, bytes_found=23, details=(Detection(language_name=u'ENGLISH', language_code=u'en', percent=95, score=1675.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0)))
Detections(is_reliable=True, bytes_found=27, details=(Detection(language_name=u'GERMAN', language_code=u'de', percent=96, score=1496.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0)))
Detections(is_reliable=True, bytes_found=38, details=(Detection(language_name=u'FRENCH', language_code=u'fr', percent=97, score=1134.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0)))
Detections(is_reliable=True, bytes_found=48, details=(Detection(language_name=u'ARABIC', language_code=u'ar', percent=97, score=1263.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0)))
Detections(is_reliable=False, bytes_found=29, details=(Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0)))
Detections(is_reliable=True, bytes_found=63, details=(Detection(language_name=u'Japanese', language_code=u'ja', percent=98, score=3848.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0), Detection(language_name=u'Unknown', language_code=u'un', percent=0, score=0.0)))
Supports 282 languages.

другие

Я не думаю, что вам нужно что-то очень сложное - например, чтобы определить, является ли документ на английском языке с довольно высокой степенью достоверности, просто проверить, содержит ли он N наиболее распространенных английских слов - что-то вроде:

"the a an is to are in on in it"

Если бы он содержал все это, я бы сказал, что это почти наверняка английский.

Проверьте Франка на Github. Он написан на JavaScript, так что вы можете использовать его в браузере и, возможно, в Node.

  • Франк поддерживает больше языков, чем любая другая библиотека или Google;
  • франк легко разветвляется для поддержки 335 языков; Франк так же, как
  • Быстро, как у конкурентов.

В качестве альтернативы вы можете попробовать гем Ruby WhatLanguage, он приятный и простой, и я использовал его для анализа данных в Твиттере. Проверьте: http://www.youtube.com/watch?v=lNqZ2cqOReo&list=UUJ_3fstMOH-g4yBxtvgAWkw&index=0&feature=plcp для быстрой демонстрации

Другие вопросы по тегам