【问题标题】:An alternative for binary search on a frozenset in Python在 Python 中对冻结集进行二分搜索的替代方法
【发布时间】:2020-09-14 13:45:59
【问题描述】:


我需要对frozenset 执行二分搜索,但由于索引在frozenset 上不起作用,我不能使用bisect 库。我想将 freezeset 转换为列表以使事情变得简单,但问题是转换 (list(frozenset)) 会打乱顺序,然后我无法执行二进制搜索。你建议什么解决方案?
为了更清楚,让我解释一下我到底在做什么:在 NLP 任务中,我需要从文本中删除停用词,所以我从 scikit-learn 导入了停用词(它比 NLTK 拥有更好的停用词集合在我看来):
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
它返回一个frozenset,其中停用词按字母顺序排列。现在我想从我的文本中删除停用词,最好使用二进制搜索检查标记是否在停用词中(显然因为我有按字母顺序排列的停用词,并且执行二进制搜索很有效)。所以如下:

import bisect

bisect.bisect(ENGLISH_STOP_WORDS, word)

这就是我卡住的地方!我期望使用上面的代码在停用词列表中找到所需的索引,然后将我的词与列表中它之前和之后的词进行比较。但我得到这个错误: TypeError: 'frozenset' object does not support indexing.

仅供参考,我没有尝试过其他库停用词列表(spaCy、gensim 等),所以我不知道它们在这种情况下是否能更好地工作。但这里的重点是学习处理冻结集上的二进制搜索。 提前致谢。

【问题讨论】:

  • it returns a frozenset in which the stopwords are in alphabetical order 是一个令人惊讶的句子。集合和冻结集合是无序集合
  • 你不需要对集合进行二分搜索。集合直接通过in 运算符支持有效的成员资格测试,这就是它们的全部意义所在!
  • @jasonharper 我不知道这个事实。谢谢你的观点。
  • 对于那些感兴趣的人,我发现我的朋友@amirhossein 发给我的this video 真的很有帮助。

标签: python binary-search stop-words bisect frozenset


【解决方案1】:

如果您想知道该词是否为停用词,只需执行以下操作:

if word in ENGLISH_STOP_WORDS:
    pass

【讨论】:

  • 谢谢@Sylvaus,但我们能确定in 执行二分搜索,所以它会很有效吗?
  • @ArashAshrafzadeh in 的集合是 O(1),甚至比 O(logn) 的二分查找还要快。但你也想要索引对吗?
  • @RoadRunner-MSFT 哦,我不知道你提到的这一点。不,我不需要索引,只有成员检查就足够了。非常感谢!
  • 当您想了解标准容器上大多数操作的时间复杂度时,可以使用此link
  • @Sylvaus 我不知道这些。感谢您的链接。
猜你喜欢
  • 2013-07-11
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多