ngrams的计数频率
Counting frequency of 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 来获取每个后续单词组合的频率计数,并打印出现超过 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 部分,我已经扩展了你的代码并包含了一个 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
编辑: 我添加了代码以将输出保存到文件 output.txt
.
我使用 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 部分,我已经扩展了你的代码并包含了一个 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
编辑: 我添加了代码以将输出保存到文件 output.txt
.