【问题标题】:Separating suffixes using a dictionary使用字典分隔后缀
【发布时间】:2012-04-06 01:21:44
【问题描述】:

我需要从给定的单词中分离出所有可能的后缀(大约 1000 个)。我正在考虑使用字典。

这样做时,我会将后缀作为键(以及有关后缀的一些附加信息作为进一步处理所需的值)。如果最长可能的后缀是 4 个字母,我会在字典中搜索所有可能的组合。 例如: 给定一个单词:'abcdefg',我会在字典中搜索 'g'、'fg'、'efg' 和 'defg'。

我进行了一些研究,但没有发现 dict 有太多类似的用途。这可能是一个可行的解决方案,还是我在这里遗漏了什么?非常感谢您的帮助。

【问题讨论】:

  • 我不明白这个要求:你是从字符串生成后缀?使用 RE 时代码的外观如何?
  • networkx 可能更适合搜索。我不明白正则表达式部分,你只是用它们来分割你的后缀吗?
  • 我考虑过暂时使用正则表达式进行预处理,因为大多数后缀都可以分解成更小的块……但我并没有真正以书面形式表达这个想法,我将其编辑掉。
  • “后缀”是否只是从静态字符串中增加字母字符串?如果是这样,您不需要正则表达式。您是否匹配定义的后缀是否在字符串上?对于 1000 个元素,您可以使用列表、字典或集合——这取决于使您的数据更易于使用的原因。
  • 我会以相反的顺序搜索(即 4、3、2、1)。对我来说听起来更合理。

标签: python regex dictionary


【解决方案1】:

如果后缀不太长,您的解决方案听起来不错 - 每个单词只需查找几次字典,而且字典查找速度很快。我不认为任何更复杂的解决方案(比如使用 trie)在这里是值得的。对于仅删除后缀,您还可以使用集合而不是字典,但由于您需要为每个后缀提供额外信息,因此字典似乎是自然的选择。

【讨论】:

    【解决方案2】:

    最简单(可能不是最快)的方法是查找列表中的所有匹配项。如果有 1000 个项目,性能应该不会有太大问题。

    >>> sufx = ['foo', 'bar']
    >>> [s for s in sufx if 'bazbar'.endswith(s)]
    ['bar']
    >>>[s for s in sufx if 'bazbaz'.endswith(s)]
    []
    >>> [s for s in sufx if 'bazfoo'.endswith(s)]
    ['foo']
    

    【讨论】:

    • 这个算法的最坏情况是 O(n * k),其中 n 是后缀的数量 (len(sufx)),k 是要测试的字符串的长度。
    【解决方案3】:

    Time Complexity of a dict。字典的查找时间非常快(平均为 O(1)!)。对于此实现,查找最长后缀的平均时间复杂度为 O(k^2),其中 k 是单词的长度。由于 ''.join 操作,它是 k^2(需要类似的 O(n) 操作,如反转或字符串切片,因为字符串不支持 O(1) appendleft 操作)。

    简单的方法(针对 python 3 测试):

    >>> from collections import deque
    >>> word = "antidisestablishmentarianism"
    >>> suffixes = {'ism': 3, 'anism': 6, 'ment': 4, 'arianism': 12}
    >>> suffix = deque()
    >>> longest = None
    >>> for char in reversed(word):
    ...     suffix.appendleft(char)
    ...     suf = ''.join(suffix)
    ...     if suf in suffixes:
    ...         longest = suf
    ...
    >>> longest
    'arianism'
    

    【讨论】:

      【解决方案4】:

      我不确定我是否正确理解了您的用例。我想这是因为您正在处理后缀并且它们很难检测到。

      一种典型的方法(通常在索引情况下)是将字符串翻转并将后缀作为前缀处理。然后,您可以在反向后缀(因此是前缀)的排序列表中进行简单的二进制搜索。

      【讨论】:

        【解决方案5】:

        如果我理解你想要做什么,你应该使用标准库中的 re 模块。

        文档在这里:

        http://docs.python.org/library/re.html#module-re

        这里有一个关于副词的例子:

        http://docs.python.org/library/re.html#finding-all-adverbs

        至于将它们作为键存储在字典中,对我来说似乎很好。特别是,如果您想对具有您关心的后缀的单词进行其他处理。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-05
          • 1970-01-01
          • 2014-02-11
          • 1970-01-01
          • 2017-01-07
          • 2020-02-13
          • 1970-01-01
          • 2021-01-18
          相关资源
          最近更新 更多