Частота счета ngrams
Я разделил текст на последующие слова, используя ngrams с этим скриптом Python:
from nltk.util import ngrams sentence = open('text.txt', "r") n = 2 sixgrams = ngrams(sentence.read().split(), n) for grams in sixgrams: print (grams)
Теперь я столкнулся с двумя следующими проблемами.
1 . Мой результат выглядит так
('\xd1\x8e\xd0\xbc', '\xd0\xb1\xd0\xb0\xd0\xb9\xd0\xb3\xd0\xb0\xd0\xb0\xd0\xbd')
Возможно, потому, что файл text.txt имеет русские кириллические символы и закодирован в UTF-8. Есть ли способ увидеть мой результат в человеко-читаемом формате в Python?
2 . Я попытался использовать Collections.Counter, чтобы получить количество совпадений каждой последующей комбинации слов и напечатать все ngrams, которые появляются более чем в 2 раза (отсортировано по значению). Я пробовал его часами, не могу показать, как я хочу.
пример ввода:
Diddle diddle dumpling my son Diddle diddle my son
пример вывода:
Diddle diddle 2 diddle dumpling 2 dumpling my 1 my son 2 son Diddle 1 Diddle my 1 my son 1
выход с лимитом 2:
Diddle diddle 2 diddle dumpling 2 my son 2
- Группировка констант в python
- Как исправить кодировку в Python Mechanize?
- Python – сокращение цикла if / for
- Функция Python open («x», «r»), откуда я могу узнать, какой кодировке должен иметь файл?
- Должны ли операторы импорта Python всегда находиться в верхней части модуля?
По первой части вашего вопроса, насколько я вижу, вы читаете из кодированного файла UTF-8
. Вы можете вызвать decode('utf8')
на результирующие данные для его декодирования. Для печати результата, если ваш терминал может его обработать, снова используйте encode('utf8')
чтобы преобразовать его в читаемую строку.
Что касается второй части вашего вопроса, я расширил ваш код и включил Counter
:
from nltk.util import ngrams import collections with open("text.txt", "rU") as f: sixgrams = ngrams(f.read().decode('utf8').split(), 2) result = collections.Counter(sixgrams) print result with open("output.txt", "w") as f: for item, count in sorted(result.iteritems()): if count >= 2: text = "{} {}".format(" ".join(item).encode('utf8'), count) print text print >>f, text
Для вашего примера текстового файла вывод выглядит следующим образом:
Counter({('Diddle', 'diddle'): 2, ('my', 'son'): 2, ('dumpling', 'my'): 1, ('son', 'Diddle'): 1, ('diddle', 'dumpling'): 1, ('diddle', 'my'): 1}) Diddle diddle 2 my son 2
Это также работает с файлом, который содержит умлауты:
Counter({(u'D\xf6ddle', u'diddle'): 2, (u'my', u'son'): 2, (u'dumpling',u'my'): 1, (u'diddle', u'dumpling'): 1, (u'son', u'D\xf6ddle'): 1, (u'diddle', u'my'): 1}) Döddle diddle 2 my son 2
EDIT: я добавил код для сохранения вывода в файл output.txt
.
- Какой самый элегантный способ преобразования запросов запросов на ответ DRF в Django?
- TensorFlow: как выставить мут-мул тензор партии по весовой переменной?
- php, python и utf-8
- «Интерфейсы» в Python: да или нет?
- Как я могу понять плохо кодированное сообщение?
- Предотвращение ошибок кодирования в Python
- Строковый литерал байта с символами не-ascii
- Укажите кодировку исходного файла Python из командной строки
- Python: предложение о том, как улучшить запись в потоковой текстовый файл в Python
- Python UTF-8 не может декодировать байт на 32-битной машине
- Как подключить Unicode к родному приложению в PowerShell