Python_LDA实现方法详解
什么是LDA
LDA(Latent Dirichlet Allocation)是一种主题模型,它可以将每个文档视为多个主题的组合,而每个主题又是多个单词的组合。通过使用LDA模型,我们可以发现给定一个含有很多单词的文档集合,这些文档集合的主题分布以及每个文档的主题分布。
Python中的LDA实现
Python中有多个LDA库可供选择, 如 gensim
、 lda
、 sklearn
等,本文将以gensim
库为例进行介绍。
安装gensim
使用以下指令安装gensim
库:
pip install gensim
数据预处理
在开始使用LDA模型之前,我们需要进行数据预处理。以下是对文本进行预处理的示例代码:
import re
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])
def preprocess(text):
text = text.lower()
text = re.sub(r'\d+', '', text)
text = ' '.join([word for word in text.split() if word not in stop_words])
return text
构建文本词袋模型
在LDA算法中,我们需要将文档转换成词袋模型。以下是使用gensim
库构建文本词袋模型的示例代码:
from gensim import corpora
# 将文本列表转换成词袋模型
corpus = [dictionary.doc2bow(text.split()) for text in texts]
LDA模型训练
使用gensim
训练LDA模型,需要指定主题数、迭代轮数、词袋模型等参数,以下是示例代码:
from gensim.models.ldamodel import LdaModel
# 训练LDA模型
lda_model = LdaModel(corpus=corpus,
id2word=dictionary,
num_topics=20,
random_state=100,
update_every=1,
chunksize=100,
passes=10,
alpha='auto',
per_word_topics=True)
示例1:对新闻数据进行主题提取
以下示例展示如何使用gensim
库对新闻数据集进行主题提取。
首先,我们需要下载20 Newsgroups数据集并解压缩。然后,我们使用以下代码对每个文件进行预处理,构建词袋模型,训练LDA模型,提取主题。
import os
import glob
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
from nltk.stem.porter import PorterStemmer
from gensim import corpora, models
tokenizer = RegexpTokenizer(r'\b\w+\b')
en_stop = set(stopwords.words('english'))
p_stemmer = PorterStemmer()
def preprocess(text):
tokens = tokenizer.tokenize(text)
stopped_tokens = [token.lower() for token in tokens if token.lower() not in en_stop]
stemmed_tokens = [p_stemmer.stem(token) for token in stopped_tokens]
return stemmed_tokens
path = '20_newsgroups/*/*'
files = glob.glob(path)
texts = []
for file in files:
with open(file) as f:
text = f.read()
tokens = preprocess(text)
texts.append(tokens)
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
num_topics = 5
num_words = 5
ldamodel = models.ldamodel.LdaModel(corpus, num_topics=num_topics,
id2word=dictionary,
passes=20)
for i, topic in enumerate(ldamodel.print_topics(num_topics=num_topics, num_words=num_words)):
print("Topic {}: {}".format(i, topic))
上面的代码将输出每个主题的前五个单词(num_words=5
)。
示例2:使用LDA模型对新闻文章进行分类
我们可以使用训练好的LDA模型对新闻文章进行分类。以下是一个简单的示例代码:
import os
import glob
import pandas as pd
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
from nltk.stem.porter import PorterStemmer
from gensim import corpora, models
tokenizer = RegexpTokenizer(r'\b\w+\b')
en_stop = set(stopwords.words('english'))
p_stemmer = PorterStemmer()
def preprocess(text):
tokens = tokenizer.tokenize(text)
stopped_tokens = [token.lower() for token in tokens if token.lower() not in en_stop]
stemmed_tokens = [p_stemmer.stem(token) for token in stopped_tokens]
return stemmed_tokens
# 训练LDA模型
df = pd.read_csv('news_dataset.csv')
texts = [preprocess(text) for text in df['text'].values]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
ldamodel = models.ldamodel.LdaModel(corpus, num_topics=5,
id2word=dictionary,
passes=20)
def classify(text):
tokens = preprocess(text)
bow = dictionary.doc2bow(tokens)
topics = ldamodel.get_document_topics(bow)
return max(topics,key=lambda x:x[1])[0]
# 对新闻文章进行分类
results = []
with open('news_samples.txt') as f:
for line in f:
line = line.strip()
category = classify(line)
results.append((line, category))
# 输出分类结果
for result in results:
print(result)
上面的代码将输出新闻文章及其对应的主题类别。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python_LDA实现方法详解 - Python技术站