Python - подсчет частоты букв и перевод - PullRequest
6 голосов
/ 10 февраля 2010

Я использую Python 3.1, но при необходимости могу понизить рейтинг.

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

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

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

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

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

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

Спасибо!

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

Ответы [ 4 ]

2 голосов
/ 10 февраля 2010

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

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

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

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

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

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

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

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

2 голосов
/ 10 февраля 2010

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

Я только что заметил, что вы используете 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 голосов
/ 10 февраля 2010

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

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

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

1 голос
/ 10 февраля 2010

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

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

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

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

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

...