python-在字符串列表中,找到至少出现在y个条目中的,至少包含n个连续标记的所有模式

时间:2019-02-21 02:21:56

标签: python recursion

我要完成的任务是编写一个函数,该函数将在在字符串列表中搜索时识别至少出现在y个条目中的至少n个标记的所有模式。

例如:

list = ["Hello my name is foobar","Hello my favorite food is pizza","Hello my favorite food will never be broccoli","No my name is not barfoo", "Yes my name is foobar"]

然后

function(list, n=3, y=3)
["my name is"]

function(list, n=3, y=2)
["my name is", "my favorite food"]

我想将此功能与极大的列表一起使用。我正计划使用带有多个嵌套循环的蛮力方式,但这会非常慢。我想知道是否有更有效的方法来执行此类任务。

1 个答案:

答案 0 :(得分:0)

这是执行此操作的快速功能。在此功能中,每个句子都以n_tokens-gram的形式分隔。将set()包裹在ngrams周围将确保仅包含不同的ngrams,并且如果ngram在句子中多次出现,以后将不会重复计算。使用itertools组合句子中的word_gramsCounter将计算每个ngram的出现次数。最后,对gram_occur的计数进行评估,以查看最常出现的克数。结果将转换为符合您条件的字符串列表。

from nltk import ngrams
import itertools
from collections import Counter


def count_ngrams(l, n_tokens, min_occur):
    word_grams = [set(ngrams(s.split(), n_tokens)) for s in l]

    gram_occur = Counter(itertools.chain.from_iterable(word_grams))

    return [" ".join([*words]) for (words, n) in gram_occur.items() if n >= min_occur]