Похоже, что хорошим подходом здесь было бы использование модели скрытого распределения Дирихле , которая является примером того, что известно как topi c модели .
A LDA
- это модель без присмотра, которая находит похожие группы среди набора наблюдений, которые затем можно использовать для назначения topi c каждому из них. Здесь я расскажу go, что может быть подходом для решения этой проблемы путем обучения модели с использованием предложений в столбце text
. Хотя в случае, если phrases
достаточно репрезентативны и содержат необходимую информацию для сбора моделями, они также могут быть хорошим (возможно, лучшим) кандидатом для обучения модели, хотя об этом вы лучше судите сами.
Перед тем, как приступить к обучению модели, вам необходимо применить некоторые этапы предварительной обработки, в том числе токенизацию предложений, удаление стоп-слов, лемматизацию и основание. Для этого вы можете использовать nltk
:
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import lda
from sklearn.feature_extraction.text import CountVectorizer
ignore = set(stopwords.words('english'))
stemmer = WordNetLemmatizer()
text = []
for sentence in df.text:
words = word_tokenize(sentence)
stemmed = []
for word in words:
if word not in ignore:
stemmed.append(stemmer.lemmatize(word))
text.append(' '.join(stemmed))
Теперь у нас есть более подходящий корпус для обучения модели:
print(text)
['great game lot amazing goal team',
'goalkeeper team made misteke',
'four grand slam championchips',
'best player three-point line',
'Novak Djokovic best player time',
'amazing slam dunk best player',
'deserved yellow-card foul',
'free throw point']
Затем мы можем преобразовать текст в матрицу подсчета токенов. через CountVectorizer
, то есть входное значение, которое будет ожидать LDA
:
vec = CountVectorizer(analyzer='word', ngram_range=(1,1))
X = vec.fit_transform(text)
Обратите внимание, что вы можете использовать параметр ngram
для расширения диапазона n-граммы, который вы хотите рассмотреть, чтобы обучить модель. Например, установив ngram_range=(1,2)
, вы получите элементы, содержащие все отдельные слова, а также 2-grams
в каждом предложении, вот пример, который обучил CountVectorizer
с ngram_range=(1,2)
:
vec.get_feature_names()
['amazing',
'amazing goal',
'amazing slam',
'best',
'best player',
....
Преимущество использования n-grams
состоит в том, что вы также можете найти Key-Phrases
, кроме простых слов.
Затем мы можем обучить LDA
с любым количеством тем, которые вы хотите, в этом случае я ' Я просто выберу темы 3
(обратите внимание, что это не имеет никакого отношения к столбцу topics
), который вы можете считать Key-Phrases
- или words
в данном случае - который вы упомянули. Здесь я буду использовать lda
, хотя есть несколько вариантов, таких как gensim . Каждому топи c будет соответствовать набор слов из словаря, с которым он был обучен, причем каждое слово имеет оценку , измеряющую релевантность слова в топи c.
model = lda.LDA(n_topics=3, random_state=1)
model.fit(X)
Через topic_word_
теперь мы можем получить эти баллы , связанные с каждым топи c. Мы можем использовать argsort
для сортировки вектора оценок и использовать его для индексации вектора имен объектов, который мы можем получить с помощью vec.get_feature_names
:
topic_word = model.topic_word_
vocab = vec.get_feature_names()
n_top_words = 3
for i, topic_dist in enumerate(topic_word):
topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1]
print('Topic {}: {}'.format(i, ' '.join(topic_words)))
Topic 0: best player point
Topic 1: amazing team slam
Topic 2: yellow novak card
Печатные результаты в этом случае он действительно много значит, так как модель была обучена с использованием образца из вопроса, однако вы должны увидеть более ясные и содержательные темы , тренируясь со всем своим корпусом.
Также обратите внимание, что для этого примера я использую весь словарный запас для обучения модели. Однако, похоже, что в вашем случае более разумным было бы разделить текстовый столбец на группы в соответствии с различными topics
, которые у вас уже есть, и обучить отдельную модель для каждой группы . Но, надеюсь, это даст вам хорошее представление о том, как действовать.