计算ngrams的频率

时间:2016-03-22 14:24:40

标签: python parsing encoding split counter

我使用带有此Python脚本的ngrams将文本拆分为后续单词:

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

1 个答案:

答案 0 :(得分:3)

对于您的问题的第一部分,据我所知,您正在阅读decode('utf8')编码文件。您可以对结果数据调用encode('utf8')进行解码。要打印结果,假设您的终端可以处理它,请再次使用Counter将其转换为可读字符串。

至于问题的第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

对于示例文本文件,输出如下:

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

编辑:我添加了代码以将输出保存到文件 Dim deleteItem() As String = Split(TextBox2.Text, ", ") Array.Resize(deleteItem, deleteItem.Length - 1) For i = 0 To UBound(deleteItem) TextBox2.Text = deleteItem(i) Next