深入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.mzph.cn/news/777950.shtml

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

相关文章

Java八股文(JVM)

Java八股文のJVM JVM JVM 什么是Java虚拟机(JVM)? Java虚拟机是一个运行Java字节码的虚拟机。 它负责将Java程序翻译成机器代码并执行。 JVM的主要组成部分是什么? JVM包括以下组件: ● 类加载器(ClassLoa…

当当狸智能激光雕刻机 多种材质自由雕刻,轻松打造独一无二的作品

提及“激光雕刻”,大多数人的印象一般都是:笨重巨大、价格昂贵、操作复杂、使用门槛较高、调试难度大...不是普通人能够随意操作的,让人望尘莫及。 而小米有品上新的这台「当当狸桌面智能激光雕刻机L1」,将超乎你的想象&#xff…

JimuReport积木报表 v1.7.4 公测版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

【C语言基础】:数据在内存中的存储

文章目录 一、整数在内存中的存储二、大小端字节序和字节序判断1. 为什么有大小端?2. 练习 三、浮点数在内存中的存储1. 浮点数的存储1.1 浮点数的存储过程1.2 浮点数取的过程 四、题目解析 书山有路勤为径,学海无涯苦作舟。 创作不易,宝子们…

google浏览器下载文件提示无法安全地下载怎么解决?

在使用google浏览器下载文件的时候,弹出了“无法安全下载”的提示,搞了文件都下载不下来,网上查了一下,是因为chrome认为使用非https链接下载文件是不安全的,在新版本中阻止了用户下载。 目录 1、打开google浏览器的设置

轻量级检测模型效果一定差?基于轻量级目标检测模型构建布匹瑕疵检测模型,对比分析不同分辨率图像尺度对模型效果的影响

瑕疵类的检测模型如:工业部件瑕疵、瓷砖瑕疵、PCB瑕疵、布匹瑕疵等等,在我们之前的博文中已经有过很多相关的开发实践了,这里就不再一一列举了,感兴趣的话可以直接搜索关键字信息博文内容即可一键直达。 因为本文的实验对象选择的…

structured bindings is supported from c++17

结构化绑定可以绑定结构体、数组和 tuple-like 对象。 完整示例&#xff1a; #include <iostream> #include <format> #include <iomanip>void test_00(){struct Box{int width_;int height_;std::string name_;};Box box{3,4,"amazing"};auto [w…

IT服务营销管理案例分析题

习题一 企业随着业务的蓬勃发展&#xff0c;所投入的基础设施资源不断增加。企业员工数倍数增长&#xff0c;办公场地、办公环境等要求也越来越高。 可是该企业的IT部门人员短缺&#xff0c;对IT管理还处于被动的“救火”阶段&#xff0c;每天至少15个突发故障&#xff0c;故障…

YOLOv9改进策略 | 损失函数篇 | InnerIoU、InnerMPDIoU二次创新损失函数助力小目标检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是InnerIoU以及包含其它二次创新的代码InnerCIoU、InnerMPDIoU等一些列利用Inner形成的二次创新损失函数&#xff0c;到此大家可能比较模糊为啥Inner能够和其他损失函数形成二次创新&#xff0c;Inner又是一个什么样的机制&#xff0c;开…

【1】网络协议基础概念

【1】网络协议基础知识 1、互联网2、为什么要学习网络协议3、学习中需要搭建的环境4、客户端-服务器5、Java 的跨平台原理6、C/C的跨平台原理7、一个简单的SpringBoot项目(1) pom.xml(2) application.yml(3) NetworkStudyApp.java(4) SwaggerConfig.java(5) HelloWorldControll…

Git--08--Git分支合并操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Git分支合并操作案例流程客户端&#xff1a;GitExtensions操作步骤&#xff1a;A操作步骤&#xff1a;B操作步骤&#xff1a;C操作步骤&#xff1a;D操作步骤&#…

Vue挂载全局方法

简介&#xff1a;有时候&#xff0c;频繁调用的函数&#xff0c;我们需要把它挂载在全局的vue原型上&#xff0c;方便调用&#xff0c;具体怎么操作&#xff0c;这里来记录一下。 一、这里以本地存储的方法为例 var localStorage window.localStorage; const db {/** * 更新…

LockSupport与线程中断机制

中断机制是个协商机制 Interrupt(): 将中断状态设置为true Interrupted():&#xff08;静态方法&#xff09; 1.返回当前线程的中断状态 2.将中断状态清零并设置为false is Interrupted(): 判断当前线程是否被中断 如何停止中断运行中的线程&#xff1f; 一个线程不应该由…

星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)

之前写了个1.0版本&#xff0c;由于太局限&#xff0c;需要用到笔记本才能操作&#xff0c;很多车友反馈不方便。特此出个手机版教程&#xff0c;简单easy&#xff0c;妈妈再也不用担心我搞不定啦 一、准备工作 先卸载车机上的autokit 或者 智能互联 app&#xff0c;这步很关…

echarts 3D示例 echart, echarts-gl

echarts官网有很多的炫酷的3D模型 来尝试实现下&#xff0c;使用原本的柱状图或者折线图代码创建echarts示例,使用cdn的方式引入echarts <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

【WPF应用20】WPF 控件详解 - RepeatButton 重复按钮的使用

在 Windows Presentation Foundation (WPF) 中&#xff0c;控件是构建用户界面 (UI) 的基础。WPF 提供了丰富的控件库&#xff0c;以满足各种设计和功能需求。其中&#xff0c;RepeatButton 是一种特殊类型的按钮&#xff0c;它在用户按下并持有时会不断地触发点击事件&#xf…

.helper勒索病毒的最新威胁:如何恢复您的数据?

导言&#xff1a; 随着信息技术的不断进步&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒成为了威胁网络安全的一大隐患。.helper勒索病毒作为近期频繁出现的一种恶意软件&#xff0c;其危害性和传播速度引起了广大用户的深切关注。本文将深入探讨.helper勒索病毒…

人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践,CapsNet模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践&#xff0c;CapsNet模型结构介绍。CapsNet&#xff08;Capsule Network&#xff09;是一种创新的深度学习模型&#xff0c;由计算机科学家Geo…

灰度图像和RGB图像

灰度图像和RGB图像在医学影像处理的上下文中有着不同的意义&#xff1a; 灰度图像&#xff08;如DICOM医学图像&#xff09;&#xff1a; 窗宽&#xff08;Window Width, WW&#xff09;和窗位&#xff08;Window Level, WL&#xff09;是针对灰度图像&#xff08;特别是医学CT…

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法 ro.vendor.config.lgsi.market_name拯救者平板 Y700 ro.vendor.config.lgsi.en.market_nameLegion Tab Y700 #ro.vendor.config.lgsi.short_market_name联想平板 ZUI T # B…