【问题标题】:Which data structure should I use to count words and the docs in which they appear?我应该使用哪种数据结构来计算单词和它们出现的文档?
【发布时间】:2017-02-25 22:56:10
【问题描述】:

我正在浏览一个文档列表,计算每个单词在全球范围内出现的次数,并存储在哪些文档中。因此,我需要一个数据结构,它或多或少是一个字典,键是单词,值是计数和文档 ID 列表。

我猜基本上是这样的? :

{
'word1': [num1, [id1, id2, id3]],
'word2': [num2, [id2, id4, id5]],
'word3': [num3, [id1, id4, id6, id]]
}

有这种事吗?

我需要的是:

  • 如果我推送的单词不存在,则必须创建一个新行,
  • num 字段必须易于递增,
  • ids 列表很容易用新文档更新id

我应该使用 dict 吗?或者是其他东西 ?我可以看到如何使用list['word', num, [id1, id2, id3]] 来处理每个单词,但我觉得代码对于这么简单的事情会非常复杂,所以我想知道是否还有其他一些我不知道的数据结构知道哪个更适合我使用吗?

【问题讨论】:

  • 主要用例是什么?例如你想知道有多少文档有一个特定的词吗?或者给定文档中有多少个独特的单词?这将对您应该键入的内容和您应该重视的内容产生影响。因此,首先要考虑如何使用您的结构。您需要随机访问还是顺序访问?
  • 我想显示 30 个最常用的词,这样我就可以知道最常提到的事情是什么(文档实际上是推文)。一旦找到它们,我就会删除所有其他单词。必须存储 ID,因为我希望其中给定单词的推文看起来很容易找到。我最感兴趣的是确保它相当快(它在一个每分钟可以运行多次的脚本中)。谢谢

标签: python-3.x data-structures counter


【解决方案1】:
from collection import defaultdict
import re

s = "the task is to find the frequency of words in multiple docs"
ids = { 'the': [1,2,4], 'frequency' : [2,3] , 'of' : [1,2,3,4,5], 'words': [8] }
d = defaultdict(int)

#build the histogram of words: 
for w in re.findall('\w+',s):
   d[w] += 1

#new dictionary of frequency and ids:
new_ids = defaultdict(list)

for k in d:
    new_ids[k].append(d[k])
for k in ids:
    new_ids[k].append(ids[k])

输出:

>>>new_ids
defaultdict(list,
            {'docs': [1],
             'find': [1],
             'frequency': [1, [2, 3]],
             'in': [1],
             'is': [1],
             'multiple': [1],
             'of': [1, [1, 2, 3, 4, 5]],
             'task': [1],
             'the': [2, [1, 2, 4]],
             'to': [1],
             'words': [1, [8]]})

换句话说,一种方法是结合默认字典以利用其功能轻松创建计数并将列表附加到值。

【讨论】:

    【解决方案2】:

    我建议使用链式概念进行散列。 请浏览文档here 最坏情况复杂度为 O(n)。

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多