Python_LDA实现方法详解

Python_LDA实现方法详解

什么是LDA

LDA(Latent Dirichlet Allocation)是一种主题模型,它可以将每个文档视为多个主题的组合,而每个主题又是多个单词的组合。通过使用LDA模型,我们可以发现给定一个含有很多单词的文档集合,这些文档集合的主题分布以及每个文档的主题分布。

Python中的LDA实现

Python中有多个LDA库可供选择, 如 gensimldasklearn 等,本文将以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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解Python中的null是什么

    详解Python中的null是什么 在Python中,null是一个特殊的数据类型,用以表示不存在的变量或数值。在Python中,null被表示为None。 None的定义 None是Python中一个表示空值或无变量的特殊对象,它有自己的数据类型——NoneType。我们可以使用is关键字检查某个变量是否为None。 示例代码: >>> …

    python 2023年5月13日
    00
  • 如何在Python中从对数正态分布中生成随机数

    在Python中从对数正态分布中生成随机数的步骤如下: 步骤一:导入所需的库 使用Python生成从对数正态分布中随机数需要使用到numpy和scipy库,因此需要先导入这两个库。 import numpy as np from scipy.stats import lognorm 步骤二:设定分布的参数 对数正态分布是由三个参数确定的,即均值 $\mu$、…

    python-answer 2023年3月25日
    00
  • Python爬取网易云音乐上评论火爆的歌曲

    Python爬虫:网易云音乐评论爬取攻略 网易云音乐是一个非常受欢迎的音乐平台,用户可以在上面听歌、评论、分享等。在这种情况下,使用Python爬虫可以快速地获取网易云音乐上评论火爆的歌曲的评论信息。本攻略将介绍Python爬虫网易云音乐评论爬取攻略,包括数据获取、数据处理、数据存储和示例。 步骤1:获取数据 在Python中,我们可以使用requests库…

    python 2023年5月15日
    00
  • 使用 Selenium 和 Python 抓取后从 HTML 源中提取数据表

    【问题标题】:Extracting data tables from HTML source after scraping using Selenium & Python使用 Selenium 和 Python 抓取后从 HTML 源中提取数据表 【发布时间】:2023-04-05 12:06:01 【问题描述】: 我正在尝试从这个link 中抓取数…

    Python开发 2023年4月5日
    00
  • 寻找所有使用 python pacakges 的 github 项目 [关闭]

    【问题标题】:Looking for all github projects that use a python pacakges [closed]寻找所有使用 python pacakges 的 github 项目 [关闭] 【发布时间】:2023-04-02 22:09:01 【问题描述】: 我正在寻找一个工具、脚本、站点或其他任何东西,它可以向我显示利…

    Python开发 2023年4月8日
    00
  • 用python3教你任意Html主内容提取功能

    用Python3教你任意HTML主内容提取功能 在本文中,我们将介绍如何使用Python3提取HTML文档中的主要内容。我们将使用BeautifulSoup库和正则表达式来提取HTML文档中的主要内容。以下是详细的步骤和示例。 步骤1:安装BeautifulSoup库 在使用BeautifulSoup库之前,我们需要先安装它。以下是安装BeautifulSo…

    python 2023年5月15日
    00
  • python 写一个文件分发小程序

    下面是详细讲解“python 写一个文件分发小程序”的完整攻略: 1. 思路分析 首先需要读取一个巨型文件目录,这个目录中包含多个文件和子目录,需要依次遍历它们; 判断目录结构中是否有新文件加入,如果有则加入待分发队列中; 对于待分发的文件,需要定时检查目标位置是否已经存在该文件。如果不存在就将它发送到目标位置。 最好使用对象化的开发方式,以便复用代码。 2…

    python 2023年5月23日
    00
  • Python中的Function定义方法第1/2页

    下面是“Python中的Function定义方法”的完整攻略。 1. Function基础 1.1 什么是Function? 函数(Function)是一组可执行的代码块,用于完成特定的任务。Function是被封装的代码,可以接收参数并返回结果。 在Python中,一个函数通常由以下几部分组成: def function_name(parameters):…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部