我要完成的任务是编写一个函数,该函数将在在字符串列表中搜索时识别至少出现在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"]
我想将此功能与极大的列表一起使用。我正计划使用带有多个嵌套循环的蛮力方式,但这会非常慢。我想知道是否有更有效的方法来执行此类任务。
答案 0 :(得分:0)
这是执行此操作的快速功能。在此功能中,每个句子都以n_tokens
-gram的形式分隔。将set()
包裹在ngrams
周围将确保仅包含不同的ngrams
,并且如果ngram
在句子中多次出现,以后将不会重复计算。使用itertools
组合句子中的word_grams
,Counter
将计算每个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]