【问题标题】:Bigram detection: Comparing a string with a list in order to merge certain substringsBigram 检测:将字符串与列表进行比较以合并某些子字符串
【发布时间】:2017-12-03 02:29:19
【问题描述】:

考虑到我有一个字符串:

text = "You are good at data mining and machine learning"

还有一个可能的二元组列表:

bigrams = ["data mining", "machine learning"]

我如何检测文本中的那些二元组并将两个单词合并在一起,这样我的结果将是一个字符串,如:

new_text = "You are good at data_mining and machine_learning"

我需要将其应用于更大的字符串(语料库)和更长的二元组列表。

我用 string.replace() 试过了:

new_text = [x.replace(" ","_") for x in text if x in bigrams]

但这会导致一个空列表。

【问题讨论】:

  • 不是我认为最高效的,但for bigram in bigrams: text = text.replace(bigram,bigram.replace(' ','_'))

标签: python string list substring


【解决方案1】:

你可以用优雅的方式来做,例如:

input_list = text.split(" ")

def ngrams(input_list, n):
  return zip(*[input_list[i:] for i in range(n)])

在你的情况下,n 应该是 2。这将返回一个包含所有二元组合的元组列表。之后,您可以简单地使用列表推导来再次连接每个元组

list_of_bigrams = [bigram[0] + "_" + bigram[1] for bigram in ngrams(input_list,2)]

【讨论】:

    【解决方案2】:

    最简单的方法:

    for bigram in bigrams:
        text = text.replace(bigram, "_".join(split(bigram)))
    

    或者正如克里斯所说的

    for bigram in bigrams:
        text = text.replace(bigram, bigram.replace(" ", "_"))
    

    我不确定哪个更快。

    【讨论】:

      【解决方案3】:

      这使用re 并调用replace 将空格转换为仅匹配的克的下划线。

      >>> import re
      >>> bigrams = ["data mining", "machine learning"]
      >>> text = "You are good at data mining and machine learning"
      >>> re.sub('('+'|'.join('\\b'+re.escape(g)+'\\b' for g in bigrams)+')', 
      ...        lambda m: m.group(0).replace(' ', '_'), text)
      'You are good at data_mining and machine_learning'
      

      理想情况下,这是最有效的解决方案,因为可以及时找到字符串中一组字符串的不重叠出现,这主要取决于字符串的长度而不是字符串集的大小,一旦该集合被前缀索引。

      【讨论】:

        猜你喜欢
        • 2017-02-20
        • 1970-01-01
        • 2020-07-10
        • 2020-12-18
        • 1970-01-01
        • 2021-08-27
        • 2012-08-31
        • 2017-10-22
        • 1970-01-01
        相关资源
        最近更新 更多