使用LSA、PLSA、HDP-LDA和lda2vec进行文本主题分类
import numpy as np
from sklearn.decomposition import TruncatedSVD
from sklearn.decomposition import LatentDirichletAllocation
from gensim.models import LdaModel
from gensim.models import LdaMulticore
from gensim.models import HdpModel
from gensim.models import Word2Vec
from gensim.models import Phrases
from gensim.models.ldamodel import LdaModel
from gensim.models.doc2vec import TaggedDocument
from gensim.models import Lda2Vec
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import normalize
def preprocess_text(text):
# 文本预处理,例如去除标点符号、停用词等
# 返回处理后的文本字符串
processed_text = text.lower()
# 进行其他预处理步骤
return processed_text
def train_lsa(texts, num_topics):
# LSA主题模型训练
vectorizer = CountVectorizer(preprocessor=preprocess_text)
X = vectorizer.fit_transform(texts)
X = normalize(X, norm='l1')
svd = TruncatedSVD(n_components=num_topics)
X_topics = svd.fit_transform(X)
topic_names = ['Topic {}'.format(i) for i in range(num_topics)]
return X_topics, topic_names
def train_plsa(texts, num_topics):
# PLSA主题模型训练
vectorizer = CountVectorizer(preprocessor=preprocess_text)
X = vectorizer.fit_transform(texts)
X = normalize(X, norm='l1')
plsa = LatentDirichletAllocation(n_components=num_topics)
plsa.fit(X)
X_topics = plsa.transform(X)
topic_names = ['Topic {}'.format(i) for i in range(num_topics)]
return X_topics, topic_names
def train_hdp_lda(texts, num_topics):
# HDP-LDA主题模型训练
vectorizer = CountVectorizer(preprocessor=preprocess_text)
X = vectorizer.fit_transform(texts)
id2word = dict((v, k) for k, v in vectorizer.vocabulary_.items())
corpus = [[(id2word[word_id], word_count) for word_id, word_count in zip(doc.indices, doc.data)] for doc in X]
hdp = HdpModel(corpus, id2word)
X_topics = hdp.transform(corpus)
topic_names = ['Topic {}'.format(i) for i in range(num_topics)]
return X_topics, topic_names
def train_lda2vec(texts, num_topics):
# lda2vec主题模型训练
sentences = [text.split() for text in texts]
phrases = Phrases(sentences)
bigram = Phraser(phrases)
sentences = bigram[sentences]
word2vec = Word2Vec(sentences, size=100, min_count=1, window=5, iter=10)
doc_vectors = [np.mean([word2vec[word] for word in sentence], axis=0) for sentence in sentences]
doc_vectors = np.array(doc_vectors)
lda2vec = Lda2Vec(num_topics=num_topics)
lda2vec.fit(doc_vectors)
X_topics = lda2vec.transform(doc_vectors)
topic_names = ['Topic {}'.format(i) for i in range(num_topics)]
return X_topics, topic_names
def print_topic_distribution(X_topics, topic_names):
for i, topics in enumerate(X_topics):
print('Comment {}:'.format(i))
for topic_idx, topic_prob in enumerate(topics):
print(' Topic {}: {}'.format(topic_names[topic_idx], topic_prob))
# 示例数据
texts = [
'This is a great product. I highly recommend it.',
'I'm not satisfied with this item. It's of poor quality.',
'The customer service was excellent. They were very helpful.',
'The shipping took too long. I'm disappointed.',
'I love this product. It's exactly what I was looking for.',
'The price is too high for the quality. Not worth it.'
]
num_topics = 3
# LSA主题模型训练和主题分布打印
X_topics, topic_names = train_lsa(texts, num_topics)
print('LSA Results:')
print_topic_distribution(X_topics, topic_names)
# PLSA主题模型训练和主题分布打印
X_topics, topic_names = train_plsa(texts, num_topics)
print('PLSA Results:')
print_topic_distribution(X_topics, topic_names)
# HDP-LDA主题模型训练和主题分布打印
X_topics, topic_names = train_hdp_lda(texts, num_topics)
print('HDP-LDA Results:')
print_topic_distribution(X_topics, topic_names)
# lda2vec主题模型训练和主题分布打印
X_topics, topic_names = train_lda2vec(texts, num_topics)
print('lda2vec Results:')
print_topic_distribution(X_topics, topic_names)
这段代码会将示例数据进行预处理,并使用LSA、PLSA、HDP-LDA和lda2vec这些主题模型进行训练。然后,它会打印每个评论文本中每一类主题的数量。注意,这里的示例数据只包含了6个评论文本,结果可能不够准确。实际应用中,需要更大的数据集来训练模型并获取更准确的主题分布。
原文地址: https://www.cveoy.top/t/topic/bgL6 著作权归作者所有。请勿转载和采集!