Как кластеризовать предложения с помощью n-грамматического перекрытия в Python? - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно сгруппировать предложения в соответствии с общими 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-грамм

1 Ответ

0 голосов
/ 21 мая 2019

Чтобы лучше понять вашу проблему, вы можете объяснить цель и ожидаемый результат.Использование Ngrams - это то, что нужно делать очень осторожно, при использовании Nграмм вы увеличиваете количество измерений вашего набора данных.Я советую вам сначала использовать TD-IDF и только тогда, если вы не достигли минимальной частоты попаданий, вы переходите на n-граммы.Если вы сможете лучше объяснить свою проблему, я смогу помочь вам.

...