【问题标题】:How to make my python code more effective?如何让我的python代码更有效?
【发布时间】:2014-12-07 00:53:20
【问题描述】:

我正在构建用于 SVM 的单词 n-gram 训练向量。我运行了我的代码,但花了我太多时间,超过 10 个小时。你有什么方法让它更快吗?

def wordNgrams(s,n):
    """Calculate word n-grams and return a dictionary"""
    input = s.split(' ')
    output = {}
    for i in xrange(len(input)-n+1):
        g = " ".join(input[i:i+n]).lower()
        output.setdefault(g,0)
        output[g] += 1
    return output

res 是 10000 个字符串的列表,每个字符串平均有 300 个单词。 global_vector 是 200000 个单词 2-gram 的排序列表。

X = []
for i in xrange(10000):
     word_dic = wordNgrams(res[i], 2)
     vector1 = {key : 1 if key in word_dic else 0 for key in global_vector}
     od = OrderedDict(sorted(vector1.items(), key = lambda t : t[0]))
     X.append(od.values())

说实话,需要 2 或 3 个小时是很常见的。但是我花了10多个小时。我真的没有我应该做的。请帮我。

【问题讨论】:

  • 这似乎不是很有用。您附加到 X 的值不会按任何特定顺序排列(字典没有顺序)。我不确定0s 和1s 的任意排序列表有什么用。你能澄清一下输出应该是什么吗?
  • 我已经编辑了问题。我想要做的是添加与排序的单词 n-gram 列表 global_vector 相对应的 0 和 1 的向量。但是我花了10多个小时。能给我一个更有效的方法吗?

标签: python nlp svm


【解决方案1】:

我认为你在循环中运行的sorted 调用是唯一可以优化的东西。其他一切似乎都是渐近最优的(可以通过各个地方的小因素来改善事物,但不能通过大量因素)。

如果您的global_vector 已经排序,您可以通过直接创建结果列表来避免对结果进行排序,而不是先通过无序的字典。这是一个使用列表推导的快速版本:

X = []
for text in res:
    word_dic = wordNgrams(text, 2)
    X.append([1 if bigram in word_dic else 0 for bigram in global_vector])

这应该是O(M*N) + O(M*P),其中Mres 的长度,Nglobal_vector 的长度,P 是文本的平均长度。由于额外的排序,您的原始代码在第一个术语中包含了一个额外的 log(N) 因子。

【讨论】:

  • 感谢您的回答。你的意思是我不需要对vector1字典进行排序?
  • 我接受了你的回答。非常感谢。但是你能解释一下为什么我不需要对字典vector1进行排序吗? X 中的这些向量是否与 global_vector 对应的正确顺序?
  • @wanglan8498:使用字典丢弃了您在global_vector 中的顺序。但是你从一开始就从来没有真正需要过字典。只需直接从一个列表 (global_vector) 转到另一个列表(0s 和 1s 的列表)。
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
相关资源
最近更新 更多