提取几个句子共有的 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]))
...
我正在尝试提取几个句子中常见的 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]))
...