【问题标题】:Fast removal of low frequency words in PythonPython中低频词的快速去除
【发布时间】:2018-11-11 04:31:43
【问题描述】:

在下面的代码中,lowFrequencyWords 是一个包含低频词的列表,而 doc 是一个标记列表。

doc=[w for w in doc if not w in lowFrequencyWords]

问题是这段代码永远存在。

我确定,但我认为问题在于从列表中删除中间元素的操作成本为 O(n),其中 n 是列表的大小。由于 lowFrequencyWords 的数量很大,python 必须重复很多次。我查找了链表,但我相信它们在 Python 中不可用。

【问题讨论】:

  • lowFrequencyWords 设为frozenset(lowFrequencyWords) 以...开始
  • 也使用doc[:] = [w for w in doc if w not in frozenset_of_lowFreq] 可能会有所帮助-不确定-有人告诉我那是某种就地替换可能会更快。别问我,只是听说...
  • 因为您主要使用 O(n) 查找来查看列表,但从未找到您的单词(它们的频率很低)。所以你基本上一直迭代所有的lowFreqWords。集合有不断的查找 - 比较快。 freezesets 只是集合的不可变表亲。
  • @PatrickArtner doc[:] = 与速度无关...只是可变性...a = [1, 2, 3]; b = a...然后a = [4, 5, 6]...您只需重新绑定名称@987654328 @ 到一个新列表,b 仍然指的是原始列表......如果你这样做 a[:] = [4, 5, 6] 那么你正在改变 ab 引用的基础列表,所以 b 也将是参考更新的列表。
  • @JonClements 感谢您的解释 - 这是我 15 个月前开始使用 pyhton 时得到的某种“晦涩”提示,但似乎从未正确理解。好的,从列表组合的“优化速度”类别中被禁止:)

标签: python-3.x nlp nltk


【解决方案1】:

来自 cmets:@Patrick Artner 将 lowFrequencyWords 设为以 freezeset(lowFrequencyWords) 开头的

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 2014-06-22
    • 2016-01-12
    • 2020-06-24
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多