Мне нужно сгруппировать предложения в соответствии с общими n-граммами, которые они содержат.Я могу легко извлечь n-грамм с помощью nltk, но я не знаю, как выполнить кластеризацию на основе перекрытия n-грамм.Вот почему я не мог написать такой реальный код, в первую очередь извиняюсь за это.Я написал 6 простых предложений и ожидаемый результат, чтобы проиллюстрировать проблему.
import nltk
Sentences= """I would like to eat pizza with her.
She would like to eat pizza with olive.
There are some sentences must be clustered.
These sentences must be clustered according to common trigrams.
The quick brown fox jumps over the lazy dog.
Apples are red, bananas are yellow."""
sent_detector = nltk.data.load('tokenizers/punkt/'+'English'+'.pickle')
sentence_tokens = sent_detector.tokenize(sentences.strip())
mytrigrams=[]
for sentence in sentence_tokens:
trigrams=ngrams(sentence.lower().split(), 3)
mytrigrams.append(list(trigrams))
После этого я понятия не имею (я даже не уверен, в порядке ли эта часть), как кластеризовать их в соответствии с общими триграммами.Я попытался сделать с itertools-combinations
, но я заблудился, и я не знал, как создать несколько кластеров, так как количество кластеров не может быть известно без сравнения каждого предложения друг с другом.Ожидаемый результат приведен ниже, заранее спасибо за любую помощь.
Cluster1: 'I would like to eat pizza with her.'
'She would like to eat pizza with olive.'
Cluster2: 'There are some sentences must be clustered.'
'These sentences must be clustered according to common trigrams.'
Sentences do not belong to any cluster:
'The quick brown fox jumps over the lazy dog.'
'Apples are red, bananas are yellow.'
РЕДАКТИРОВАТЬ: Я попытался с combinations
еще раз, но он вообще не кластеризовался, просто вернул все пары предложений.(очевидно, я сделал что-то не так).
from itertools import combinations
new_dict = {k: v for k, v in zip(sentence_tokens, mytrigrams)}
common=[]
no_cluster=[]
sentence_pairs=combinations(new_dict.keys(), 2)
for keys, values in new_dict.items():
for values in sentence_pairs:
sentence1= values[0]
sentence2= values[1]
#print(sentence1, sentence2)
if len(set(sentence1) & set(sentence2))!=0:
common.append((sentence1, sentence2))
else:
no_cluster.append((sentence1, sentence2))
print(common)
Но даже если бы этот код работал, он не дал бы ожидаемого результата, так как я не знаю, как генерировать несколько кластеров на основе общих n-грамм