Частота счета 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 

По первой части вашего вопроса, насколько я вижу, вы читаете из кодированного файла 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 .