Python - обозначьте буквами подсчет частот и перевод

Я использую Python 3.1, но я могу понизить в случае необходимости.

У меня есть ASCII-файл, содержащий рассказ, записанный на одном из языков, алфавит которых может быть представлен с верхним и или более низким ASCII. Я хочу:

1) Обнаружьте кодирование в меру моих способностей, доберитесь, своего рода метрика уверенности (варьировался бы в зависимости от длины файла, правильно?)

2) Автоматически переведите все это с помощью некоторой бесплатной онлайн службы или библиотеки.

Дополнительный вопрос: Что, если текст записан на языке, где требуется 2 или больше байта для представления одной буквы и метки порядка байтов, не должно там помогать мне?

Наконец, как я имею дело с пунктуацией и misc символами, такими как пространство? Это будет происходить более часто, чем некоторые буквы, правильно? Как насчет того, что пунктуация и символы могут иногда смешиваться - могло бы быть два представления запятой, два представления для того, что похоже на "a" и т.д.?

Да, я прочитал статью Joel Spolsky на Unicode. Помогите мне с по крайней мере некоторыми из этих объектов.

Спасибо!

P.S. Это не домашняя работа, но это в самообразовательных целях. Я предпочитаю пользоваться библиотекой частоты буквы, которая является открытым исходным кодом и читаемый в противоположность тому, который закрывается, эффективен, но получает преуспевшее задание.

6
задан Craig McQueen 10 February 2010 в 00:58
поделиться

4 ответа

По сути, есть три основные задачи для реализации описанного приложения:

  • 1a) Определить кодировку символов входящего текста
  • 1b) Определить язык вводимого текста
  • 2) Получите текст, переведенный как текст, с помощью API одного из онлайн-сервисов

Для 1a вы можете взглянуть на decodeh.py Помимо самого сценария, он предоставляет множество очень полезных ресурсов, касающихся наборов символов и кодировки в целом. CharDet , упомянутый в другом ответе, также кажется заслуживающим внимания.

Как только кодировка символов известна, как вы предлагаете, вы можете решить 1b), вычислив частотный профиль символов текста и сопоставив его с известными частотами. Несмотря на простоту, этот подход обычно обеспечивает приличный коэффициент точности, хотя он может быть слабым для более коротких текстов, а также для текстов, которые следуют определенным шаблонам; например, текст на французском языке со многими ссылками на единицы в метрической системе будет иметь необычно высокую долю букв M, K и C.

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

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

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

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

2
ответ дан 17 December 2019 в 00:09
поделиться

Если у вас есть файл ASCII, то я могу со 100% уверенностью сказать, что он закодирован в ASCII. Кроме того, попробуйте chardet. Но знание кодировки не обязательно достаточно, чтобы определить, на каком языке он написан.

Что касается многобайтовых кодировок, то единственный надежный способ работы с ними - надеяться, что они содержат символы латинского алфавита, и искать, какая половина пары содержит NULL. В противном случае обрабатывайте его как UTF-8, если вы не знаете лучшего (Shift-JIS, GB2312 и т.д.).

О, и UTF-8. UTF-8, UTF-8, UTF-8. Я не думаю, что могу подчеркнуть это достаточно. И на случай, если я этого не сделал... UTF-8.

2
ответ дан 17 December 2019 в 00:09
поделиться

Я дал несколько условных ответов, однако ваш вопрос немного расплывчатый и непоследовательный. Пожалуйста, отредактируйте ваш вопрос и дайте ответы на мои вопросы ниже.

(1) Вы говорите, что файл ASCII, но вы хотите определить кодировку? А? Разве ответ не "ascii"? Если вам действительно нужно определить кодировку, используйте chardet

(2) Автоматически переводить что? кодировку? язык? Если язык, то известен ли вам входной язык или вы пытаетесь определить и его? Чтобы определить язык, попробуйте guess-language ... обратите внимание, что его нужно подправить для лучшего определения японского языка. См. эту тему SO, где отмечается проблема с японским языком, а также подчеркивается, что для ЛЮБОЙ программы для определения языка вам нужно удалить из текста все шумы HTML/XML/Javascript/etc, иначе результат будет сильно смещен в сторону языков, использующих только ASCII, таких как английский (или каталонский!).

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

(4) Ваши вопросы о пунктуации и пробелах: зависит от вашей цели (в которой мы пока не уверены). Если цель - определение языка, то идея состоит в том, чтобы стандартизировать текст; например, заменить все пробелы (букву или апостроф) одним пробелом, затем удалить все пробелы впереди/после пробела, затем добавить 1 пробел впереди и 1 пробел позади - больше точности достигается, если рассматривать биграммы начала/конца слова как триграммы. Обратите внимание, что, как обычно при обработке текста, вы должны сразу декодировать ваш ввод в юникод и в дальнейшем работать с юникодом.

1
ответ дан 17 December 2019 в 00:09
поделиться

Частота символов довольно проста

Я только что заметил, что вы используете Python3.1, так что это еще проще

>>> from collections import Counter
>>> Counter("Μεταλλικα")
Counter({'α': 2, 'λ': 2, 'τ': 1, 'ε': 1, 'ι': 1, 'κ': 1, 'Μ': 1})

Для старых версий Python:

>>> from collections import defaultdict
>>> letter_freq=defaultdict(int)
>>> unistring = "Μεταλλικα"
>>> for uc in unistring: letter_freq[uc]+=1
... 
>>> letter_freq
defaultdict(<class 'int'>, {'τ': 1, 'α': 2, 'ε': 1, 'ι': 1, 'λ': 2, 'κ': 1, 'Μ': 1})
2
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

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