深入Spark与LDA:大规模文本主题分析实战

使用LDA模型和Spark进行文本主题分析

本篇博客介绍了如何使用LDA(潜在狄利克雷分配)模型和Spark进行文本主题分析。我们的目标是从大量的用户评论中提取出主题。

1. 环境设置

首先,我们需要导入所需的库,包括jieba(用于中文分词),gensim(用于创建LDA模型),nltk(用于下载和使用停用词),json(用于处理json格式的数据),snownlp(用于情感分析),以及pyspark(用于处理大规模数据)。这里建议使用anaconda建立虚拟环境去运行。

image.png

然后,我们创建一个SparkSession并连接到远程的Spark服务器。

spark = SparkSession.builder.appName("RemoteSparkConnection").master("yarn").\config("spark.pyspark.python", "/opt/apps/anaconda3/envs/myspark/bin/python") \.config("spark.sql.warehouse.dir", "/hive/warehouse") \.config("hive.metastore.uris", "thrift://node01:9083") \.config("spark.sql.parquet.writeLegacyFormat", "true") \.enableHiveSupport() \.getOrCreate()

在这篇博客中,我们将详细介绍如何使用SparkSession建立一个远程的Spark连接。以下是我们将要讲解的代码:

spark = SparkSession.builder.appName("RemoteSparkConnection").master("yarn").\config("spark.pyspark.python", "/opt/apps/anaconda3/envs/myspark/bin/python") \.config("spark.sql.warehouse.dir", "/hive/warehouse") \.config("hive.metastore.uris", "thrift://node01:9083") \.config("spark.sql.parquet.writeLegacyFormat", "true") \.enableHiveSupport() \.getOrCreate()

首先,我们使用SparkSession.builder来创建一个SparkSession的构建器。这个构建器可以让我们配置SparkSession的参数。

然后,我们使用appName("RemoteSparkConnection")来设置应用程序的名称。这个名称将会显示在Spark集群管理器的用户界面上。

接着,我们使用master("yarn")来设置集群管理器。在这个例子中,我们使用的是YARN。

接下来,我们使用config方法来设置一些配置参数。例如,我们设置了Python环境的路径、Spark SQL的仓库目录、Hive元数据存储的URI以及Parquet文件的写入格式。

然后,我们使用enableHiveSupport方法来启用Hive的支持。这样,我们就可以使用Hive的功能,例如HiveQL和Hive UDF。

最后,我们使用getOrCreate方法来获取或创建一个SparkSession。如果已经存在一个符合我们配置的SparkSession,那么就返回这个SparkSession;否则,就创建一个新的SparkSession。

通过以上步骤,我们就成功地建立了一个远程的Spark连接。在后续的数据处理任务中,我们可以使用这个SparkSession来读取和写入数据,执行SQL查询,以及运行机器学习算法。

2. 文本预处理

我们定义了一个名为Thematic_focus的函数,用于对文本进行预处理。这个函数包括以下几个步骤:

  • 中文分词:使用jieba库进行分词。
  • 删除停用词:使用nltk库中的停用词列表删除停用词。
  • 删除标点符号:使用Python的string库删除所有的标点符号。

def Thematic_focus(text):# 下载中文停用词列表# 中文文本分词def tokenize(text):return list(jieba.cut(text))# 删除中文停用词def delete_stopwords(tokens):# 分词words = tokens  # 假设你已经有分好词的文本,如果没有,你可以使用jieba等工具进行分词# 加载中文停用词stop_words = set(stopwords.words('chinese'))# 去除停用词filtered_words = [word for word in words if word not in stop_words]# 重建文本filtered_text = ' '.join(filtered_words)return filtered_textdef remove_punctuation(input_string):import string# 制作一个映射表,其中所有的标点符号都被映射为Noneall_punctuation = string.punctuation + "!?。。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏.\t \n很好是去"translator = str.maketrans('', '', all_punctuation)# 使用映射表来移除所有的标点符号no_punct = input_string.translate(translator)return no_punct

3. 主题分析

    tokens = tokenize(text)# 删除停用词text = delete_stopwords(tokens)# 祛除标点符号text = remove_punctuation(text)# 重新分词tokens = tokenize(text)# 创建字典和文档-词频矩阵dictionary = corpora.Dictionary([tokens])corpus = [dictionary.doc2bow(tokens)]# 运行LDA模型lda_model = models.LdaModel(corpus, num_topics=1, id2word=dictionary, passes=50)# 提取主题topics = lda_model.show_topics(num_words=8)# 输出主题for topic in topics:print(topic)

在完成文本预处理后,我们使用gensim库中的corporamodels模块创建LDA模型,并对预处理后的文本进行主题分析。

我们首先创建一个字典和一个文档-词频矩阵,然后使用这些数据训练LDA模型。我们设置主题数量为1,并进行50次迭代。

最后,我们使用LDA模型提取出主题,并打印出每个主题的前8个词。

4. 应用

def qvna():df=spark.table("cjw_data.qvna")def calculate_Thematic(commentlist):try:jsonstr = str(commentlist)python_obj = json.loads(jsonstr, strict=False)except:return Nonecontentstring = ""for item in python_obj:for i in item:if (i["content"] != "用户未点评,系统默认好评。"):contentstring+=i["content"]print(contentstring)try:Thematic_focus(contentstring)except:return Nonerow = df.take(100)for i in  row:print(calculate_Thematic(i[-1]))

我们定义了一个名为qvna的函数,用于从Spark表中读取数据,并对每一条评论进行主题分析。我们首先将评论列表从json格式转换为Python对象,然后将所有的评论合并成一个字符串,最后使用Thematic_focus函数对这个字符串进行主题分析。

我们使用take函数从表中取出前100条记录,并对每一条记录的评论进行主题分析。

完整代码

# Author: 冷月半明
# Date: 2023/12/20
# Description: This script does XYZ.
import jieba
from gensim import corpora, models
import nltk
from nltk.corpus import stopwords
import json
import time
from snownlp import SnowNLP
from pyspark.sql.functions import udf
from pyspark.sql.functions import colfrom pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerTypenltk.download('stopwords')
# 创建SparkSession并连接到远程Spark服务器
spark = SparkSession.builder.appName("RemoteSparkConnection").master("yarn").\config("spark.pyspark.python", "/opt/apps/anaconda3/envs/myspark/bin/python") \.config("spark.sql.warehouse.dir", "/hive/warehouse") \.config("hive.metastore.uris", "thrift://node01:9083") \.config("spark.sql.parquet.writeLegacyFormat", "true") \.enableHiveSupport() \.getOrCreate()
print("链接成功")
def Thematic_focus(text):# 下载中文停用词列表# 中文文本分词def tokenize(text):return list(jieba.cut(text))# 删除中文停用词def delete_stopwords(tokens):# 分词words = tokens  # 假设你已经有分好词的文本,如果没有,你可以使用jieba等工具进行分词# 加载中文停用词stop_words = set(stopwords.words('chinese'))# 去除停用词filtered_words = [word for word in words if word not in stop_words]# 重建文本filtered_text = ' '.join(filtered_words)return filtered_textdef remove_punctuation(input_string):import string# 制作一个映射表,其中所有的标点符号都被映射为Noneall_punctuation = string.punctuation + "!?。。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏.\t \n很好是去"translator = str.maketrans('', '', all_punctuation)# 使用映射表来移除所有的标点符号no_punct = input_string.translate(translator)return no_puncttokens = tokenize(text)# 删除停用词text = delete_stopwords(tokens)# 祛除标点符号text = remove_punctuation(text)# 重新分词tokens = tokenize(text)# 创建字典和文档-词频矩阵dictionary = corpora.Dictionary([tokens])corpus = [dictionary.doc2bow(tokens)]# 运行LDA模型lda_model = models.LdaModel(corpus, num_topics=1, id2word=dictionary, passes=50)# 提取主题topics = lda_model.show_topics(num_words=8)# 输出主题for topic in topics:print(topic)def qvna():df=spark.table("cjw_data.qvna")def calculate_Thematic(commentlist):try:jsonstr = str(commentlist)python_obj = json.loads(jsonstr, strict=False)except:return Nonecontentstring = ""for item in python_obj:for i in item:if (i["content"] != "用户未点评,系统默认好评。"):contentstring+=i["content"]print(contentstring)try:Thematic_focus(contentstring)except:return Nonerow = df.take(100)for i in  row:print(calculate_Thematic(i[-1]))def job():qvna()job()

运行截图:
image.png
需注意的是若需分析的文本较短,该模型可能不会展现出预期的结果,这时有以下几个解决方案:

  1. 预处理:对于较短的文本,可以尝试将它们与相邻的文本合并,以形成更长的文本。这样可以提供更多的上下文信息,有助于LDA模型更好地提取主题。
  2. 调整模型参数:LDA模型的主要参数包括主题数(num_topics)和迭代次数(passes)。对于较短的文本,可以尝试减少主题数和增加迭代次数,以提高模型的性能。
  3. 使用其他模型:如果LDA模型在处理较短文本时效果不佳,可以考虑使用其他的主题模型,如NMF(非负矩阵分解)或LSA(潜在语义分析)。
  4. 特征选择:在进行主题提取之前,可以通过TF-IDF等方法进行特征选择,以减少噪声并提高模型的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/575576.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL---触发器

一、介绍 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性, 日志记录 , 数据校验等操作 。 使用别名OLD和NEW来引用触…

OpenHarmony实战开发-从0到1实现购物应用页面

概述 OpenHarmony ArkUI框架提供了丰富的动画组件和接口,开发者可以根据实际场景和开发需求,选用丰富的动画组件和接口来实现不同的动画效果。 本Codelab中,我们会构建一个简易的购物应用。应用包含两级页面,分别是主页&#xf…

微信小程序被删除的文件一编译又回来了

一开始创建错了位置,就想着删除文件重新创建,但是没想到每次重新编译的时候,之前被删除的js、wsml文件就又回来了,后来发现是我在app.json中的pages里面的代码没有被删除。 因为我最开始创建错了,快捷创建了页面&#…

010——服务器开发环境搭建及开发方法(下)

目录 三、 第一个驱动程序 四、 buildroot 4.1 制作根文件系统 4.2 buildroot使用 五、 uboot 009——服务器开发环境搭建及开发方法(上)-CSDN博客 三、 第一个驱动程序 # 1. 使用不同的开发板内核时, 一定要修改KERN_DIR # 2. KERN_DIR中的内核要…

如何使用OpenHarmony实现视频暂停、播放、切换、倍速播放

介绍 本篇Codelab使用ArkTS语言实现视频播放器,主要包括主页面和视频播放页面,我们将一起完成以下功能: 获取本地视频和网络视频。通过AVPlayer进行视频播放。通过手势调节屏幕亮度和视频播放音量。 相关概念 AVPlayer:播放管理…

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

Linux(3)软件安装-Centos 8.1安装-硬盘分区方案对比-linux上运行jar包-File上传下载

四、软件安装 1、Centos 8.1安装 1.1 安装过程 1、下载 CentOS 8.1 ISO 镜像文件 访问 CentOS 官方网站的下载页面。选择适当的版本,例如 CentOS Linux 8.1 (Linux Kernel 5.10.0-36)。根据您的硬件架构下载对应的 ISO 镜像文件(如 CentOS-8.1-x86_6…

k8s 如何获取加入节点命名

当k8s集群初始化成功的时候&#xff0c;就会出现 加入节点 的命令如下&#xff1a; 但是如果忘记了就需要找回这条命令了。 kubeadm join 的命令格式如下&#xff1a;kubeadm join --token <token> --discovery-token-ca-cert-hash sha256:<hash>--token 令牌--…

如何在极狐GitLab 自定义 Pages 域名、SSL/TLS 证书

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

数据结构(六)——图

六、图 6.1 图的基本概念 图的定义 图&#xff1a;图G由顶点集V和边集E组成&#xff0c;记为G (V, E)&#xff0c;其中V(G)表示图G中顶点的有限非空集&#xff1b;E(G) 表示图G中顶点之间的关系&#xff08;边&#xff09;集合。若V {v1, v2, … , vn}&#xff0c;则用|V|…

为什么Python不适合写游戏?

知乎上有热门个问题&#xff1a;Python 能写游戏吗&#xff1f;有没有什么开源项目&#xff1f; Python可以开发游戏&#xff0c;但不是好的选择 Python作为脚本语言&#xff0c;一般很少用来开发游戏&#xff0c;但也有不少大型游戏有Python的身影&#xff0c;比如&#xff1…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 一、简单介绍 二、简单闪烁效果实现原理 三、简单闪烁效果案例实现简单步骤 四、注意事项 一、简单…