我的代码确实适用于小样本,但不适用于大样本

Posted

技术标签:

【中文标题】我的代码确实适用于小样本,但不适用于大样本【英文标题】:My code does execute for small sample but not for a large 【发布时间】:2022-01-11 11:04:01 【问题描述】:

我尝试计算变量中单词出现的频率。变量计数超过 700.000 个观察值。输出应返回包含出现次数最多的单词的字典。我使用下面的代码来做到这一点:

d1 = 
for i in range(len(words)-1):
    x=words[i]
    c=0
    for j in range(i,len(words)):
        c=words.count(x)
    count=dict(x:c)
    if x not in d1.keys():
        d1.update(count)

我已经运行了前 1000 次观察的代码,它运行良好。输出如下所示:

[('semantic', 23),
 ('representations', 11),
 ('models', 10),
 ('task', 10),
 ('data', 9),
 ('parser', 9),
 ('language', 8),
 ('languages', 8),
 ('paper', 8),
 ('meaning', 8),
 ('rules', 8),
 ('results', 7),
 ('performance', 7),
 ('parsing', 7),
 ('systems', 7),
 ('neural', 6),
 ('tasks', 6),
 ('entailment', 6),
 ('generic', 6),
 ('te', 6),
 ('natural', 5),
 ('method', 5),
 ('approaches', 5)]

当我尝试运行它进行 100.000 次观察时,它会继续运行。我已经尝试了超过 24 小时,但仍然无法执行。有人有想法吗?

【问题讨论】:

定义一个字典并遍历列表一次。每次看到一个新单词时,您将其添加为值为 1 的键,否则如果该单词已存在于字典中,则增加其值。 有道理,我对python比较陌生,所以也许你可以帮我提供代码? 【参考方案1】:

您可以使用collections.Counter

from collections import Counter

counts = Counter(words)
print(counts.most_common(20))

【讨论】:

【参考方案2】:

@Jon 答案是您的最佳答案,但在某些情况下,collections.counter 会比迭代慢。 (特别是如果之后您不需要按频率排序)正如我在this question 中询问的那样

您可以通过迭代计算频率。

d1 = 
for item in words:
  if item in d1.keys():
    d1[item] += 1
  else:
    d1[item] = 1

# finally sort the dictionary of frequencies
print(dict(sorted(d1.items(), key=lambda item: item[1])))

但同样,对于您的情况,使用 @Jon 答案更快更紧凑。

【讨论】:

【参考方案3】:
#...
for i in range(len(words)-1):
    #...
    #...
    for j in range(i,len(words)):
        c=words.count(x)
    #...
    if x not in d1.keys():
        #...

我试图强调您的代码在上面遇到的问题。在英语中,这看起来像:

“重复计算我正在查看的单词之后每个单词出现的次数,对于整个列表中的每个单词。另外,请查看我正在构建的整个字典再次 用于列表中的每个单词,而我正在构建它。”

这比您需要做的工作要多得多;您只需要查看列表中的每个单词一次。您确实需要为每个单词在字典中查找一次,但是通过将字典转换为另一个列表并查看整个内容,查看 d1.keys() 会大大降低速度。以下代码将更快地完成您想要的操作:

words = ['able', 'baker', 'charlie', 'dog', 'easy', 'able', 'charlie', 'dog', 'dog']

word_counts = 

# Look at each word in our list once
for word in words:
    # If we haven't seen it before, create a new count in our dictionary
    if word not in word_counts:
        word_counts[word] = 0

    # We've made sure our count exists, so just increment it by 1
    word_counts[word] += 1

print(word_counts.items())

上面的例子会给出:

[
    ('charlie', 2),
    ('baker', 1),
    ('able', 2),
    ('dog', 3),
    ('easy', 1)
]

【讨论】:

以上是关于我的代码确实适用于小样本,但不适用于大样本的主要内容,如果未能解决你的问题,请参考以下文章

我的代码适用于 Firefox、Safari 和 MS Edge,但不适用于 Chrome

我的代码适用于输入文件,但不适用于其他文件。 (调试断言错误)

相同的逻辑适用于c ++,但不适用于python以获得堆栈中的最大值,我的代码中是不是缺少某些东西

代码适用于localhost但不适用于实时服务器

iOS 8 代码适用于 iPhone 5s 但不适用于 iPhone 5

地理位置API不适用于移动设备