提取几个句子共有的 ngram

Extract ngrams that are common for several sentences

我正在尝试提取几个句子中常见的 ngram。

我有:
我的数据由单独的句子组成:

data = [
    'Design and architecture project',
    'Web inquiry for products',
    'Software for non-profit project',
    'Web inquiry for vendors'
]

我是做什么的:

from nltk import everygrams
from collections import Counter

full_corpus = ' '.join(data)
ngram_counts = Counter(everygrams(full_corpus.split(), 2, 5))
repeated_ngrams = [(' '.join(ngram), count) for ngram, count in list(ngram_counts.items()) if count > 1]
print(repeated_ngrams)

我得到的是:
[('project Web', 2), ('project Web inquiry', 2), ('project Web inquiry for', 2), ('Web inquiry', 2), ('Web inquiry for', 2), ('inquiry for', 2)]

我现在得到的问题:
通过这种方法,一些 ngram 由来自不同句子的单词组成。条目 ('project Web', 2), ('project Web inquiry', 2), ('project Web inquiry for', 2) 被认为是不正确的。

我想得到的:
[('Web inquiry', 2), ('Web inquiry for', 2), ('inquiry for', 2)]

有人可以帮我解决这个问题吗?这似乎是一项常见的任务,但我找不到任何有关正确解决方案的信息。

任务背后的目标:
我将使用提取的 ngram 为用户建议自动完成。例如,当用户输入 'inquiry' 时建议单词 'for' 是明智的。 但是,如果基于当前提取的 ngram,在用户键入单词 'project' 后会建议单词 'web',那将是错误的。


更新:我想我有一个解决方案,但我不确定它是否最优:

end_token = "<end>"
marked_data = [f"{entry} {end_token}" for entry in data]

full_corpus = " ".join(marked_data)
ngram_counts = Counter(everygrams(full_corpus.split(), 2, 5))
repeated_ngrams = [
    (" ".join(ngram), count)
    for ngram, count in list(ngram_counts.items())
    if count > 1 and end_token not in ngram
]
print(repeated_ngrams)

一个可能的解决方案是 运行 everygrams 分别为每个句子:

...
import itertools
...

ngram_counts = Counter(itertools.chain.from_iterable(
  [everygrams(el.split(), 2, 5) for el in data]))
...