【问题标题】:Get rid of unigrams in a list if contained within bigrams or trigrams python如果包含在二元组或三元组 python 中,则删除列表中的一元组
【发布时间】:2020-10-09 00:41:44
【问题描述】:

假设我有一个 n-gram 列表,并且只有当它们已经包含在列表中的二元组或三元组中时,我才想删除任何一元组。

例如:

ngram_list = ["apple cider", "apple",  "cat man", "cat", "batman", "bat"]

我想结束的是:

ngram_list = ["apple cider", "cat man", "batman", "bat"]

在结果中,“apple”被删除,因为它包含在二元组“apple cider”中,而“cat”被删除,因为它包含在二元组“cat man”中,但“bat”仍然存在,因为即使“bat”是在“蝙蝠侠”中,“蝙蝠侠”不是二元组或三元组。

我想解决这个问题的方法是只留出一元组,遍历它们,然后在一个单独的列表中搜索每个一元组,其中只包含二元组和三元组……但我只是想知道什么是最有效的方法是什么?

【问题讨论】:

    标签: python-3.x list n-gram


    【解决方案1】:

    我将首先遍历所有输入 ngram,将 unigram 与其余部分分开,并从 (n+1)-gram 中建立一个嗡嗡声“看到”unigram 的列表,然后我会用它过滤输入:

    def clean_up(ngrams):
        seen = set()
        for ngram in ngrams:
            if ' ' in ngram:
                seen = seen.union(set(ngram.split()))
        return [ngram for ngram in ngrams if ngram not in seen]
    
    
    print(clean_up(ngram_list))
    # ['apple cider', 'cat man', 'batman', 'bat']
    

    如果您的 (n+1)-grams 比 unigrams 多得多,则可以通过保存第一次迭代的一些结果来加快速度:

    def clean_up2(ngrams):
        unigrams = []
        nplus1grams = []
        seen = set()
        for ngram in ngrams:
            if ' ' in ngram:
                nplus1grams.append(ngram)
                seen = seen.union(set(ngram.split()))
            else:
                unigrams.append(ngram)
        return nplus1grams + [unigram for unigram in unigrams if unigram not in seen]
    
    
    print(clean_up(ngram_list))
    # ['apple cider', 'cat man', 'batman', 'bat']
    

    虽然这需要更多的内存并且它不会(通常)保留输入的顺序,但它会将所有(幸存的)一元组放在最后。

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      相关资源
      最近更新 更多