【问题标题】:Counting frequency of ngramsngram的计数频率
【发布时间】:2016-03-22 14:24:40
【问题描述】:

我已经通过这个 Python 脚本使用 ngram 将文本拆分为后续单词:

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

【问题讨论】:

  • 你用的是python 2.7吗?
  • 最好将 Python 3 用于 NLP 任务,因为 Python 3 具有出色的文本功能:/
  • 在 Python 3 中你已经看到了юм байгаан
  • 我正在使用 Enthought Canopy,由于某些原因导致大数据 Canopy 失败。
  • 1. --> 将您的输出写入文件 (utf-8) 并使用可处理 utf-8 2 的编辑器打开此文件。 --> 查看我对您的其他问题的完整回答 Redirecting the print output to a .txt file in Python

标签: python parsing encoding split counter


【解决方案1】:

据我所知,对于您的问题的第一部分,您正在阅读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

【讨论】:

  • 据我所知,most-common 函数还有其他规则来决定输出中包含的内容。由于他的要求是按排序顺序多次出现的所有内容,我认为这就是解决方案。你会改变什么?
  • 啊,确实,我没有注意到这些值是排序的。
  • 它就像一个魅力。非常感谢。最后一件事,如何将结果保存到 .txt 文件中?我在最后添加了以下代码但没有工作 output = open("output.txt", "w") output.write(result) output.close()
  • 你不能简单地将对象写入文件。您可以为此使用pickle 模块,或者您可以将打印输出重定向到文件。你到底想达到什么目标?
  • 如何将打印输出重定向到文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2018-09-04
  • 2021-06-08
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多