Python ngrams的计数频率

Python ngrams的计数频率,python,parsing,encoding,split,counter,Python,Parsing,Encoding,Split,Counter,我使用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\xd

我使用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来获取每个后续单词组合的频率计数,并打印出现超过2次的所有ngram(按值排序)。我已经试了好几个小时了,但还是不能让它显示出我想要的样子

输入示例:

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')
将其转换为可读字符串

至于你问题的第2部分,我已经扩展了你的代码,并加入了一个
计数器

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
这也适用于包含UMLAUT的文件:

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

编辑:我添加了代码以将输出保存到文件
output.txt

您是否使用python 2.7?最好使用python 3执行NLP任务,因为python 3具有优越的文本功能:/python 3中您会看到
ббббббб
我正在使用Enthude,由于某些原因,大型数据存储失败。1。-->将输出写入文件(utf-8),并使用处理utf-8以及2的编辑器打开此文件。-->请看我对您的另一个问题的完整答案。据我所知,
最常见的
函数还有其他规则来决定输出中包含的内容。由于他的要求是每件事情都要按顺序多次出现,我认为这就是解决办法。你会改变什么?啊,事实上,我没有注意到这些值是被排序的。它就像一个符咒。非常感谢你。最后一件事,如何将结果保存到.txt文件中?我在结尾添加了下面的代码,但没有工作output=open(“output.txt”,“w”)output.write(result)output.close()您不能简单地将对象写入文件。您可以使用
pickle
模块进行此操作,也可以将打印输出重定向到文件。您到底想要实现什么?如何将打印输出重定向到文件?