深入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_text
    def remove_punctuation(input_string):
        import string
        # 制作一个映射表,其中所有的标点符号都被映射为None
        all_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 None
        contentstring = ""
        for item in python_obj:
            for i in item:
                if (i["content"] != "用户未点评,系统默认好评。"):
                    contentstring+=i["content"]
        print(contentstring)
        try:
            Thematic_focus(contentstring)
        except:
            return None

    row = 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 col


from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType

nltk.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_text
    def remove_punctuation(input_string):
        import string
        # 制作一个映射表,其中所有的标点符号都被映射为None
        all_punctuation = string.punctuation + "!?。。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏.\t \n很好是去"
        translator = str.maketrans('', '', all_punctuation)
        # 使用映射表来移除所有的标点符号
        no_punct = input_string.translate(translator)
        return no_punct





    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)

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 None
        contentstring = ""
        for item in python_obj:
            for i in item:
                if (i["content"] != "用户未点评,系统默认好评。"):
                    contentstring+=i["content"]
        print(contentstring)
        try:
            Thematic_focus(contentstring)
        except:
            return None

    row = 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.mfbz.cn/a/497999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

samba实现linux共享文件夹

一、samba安装 sudo apt install samba 二、配置Samba 编辑Samba配置文件sudo vi /etc/samba/smb.conf 在文件末尾添加以下内容,设置一个简单的共享目录(替换path_to_share为实际的共享目录路径): [Share] path /path_to_sha…

【React】onClick点击事件传参的4种方式

记录React onClick 点击事件传参的 4 种方式 方式一&#xff1a;使用内联箭头函数 import React, { MouseEvent } from "react";function App() {const handleClick (event: MouseEvent<HTMLButtonElement>, name: string) > {console.log(event)console.…

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

Docker 夺命连环 15 问

目录 什么是Docker&#xff1f; Docker的应用场景有哪些&#xff1f; Docker的优点有哪些&#xff1f; Docker与虚拟机的区别是什么&#xff1f; Docker的三大核心是什么&#xff1f; 如何快速安装Docker&#xff1f; 如何修改Docker的存储位置&#xff1f; Docker镜像常…

2024年购买阿里云服务器多少钱?100元到500元年预算

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

分享react+three.js展示温湿度采集终端

前言 气象站将采集到的相关气象数据通过GPRS/3G/4G无线网络发送到气象站监测中心&#xff0c;摆脱了地理空间的限制。 前端&#xff1a;气象站主机将采集好的气象数据存储到本地&#xff0c;通过RS485等线路与GPRS/3G/4G无线设备相连。 通信&#xff1a;GPRS/3G/4G无线设备通…

Vue 03 组件通信

Vue学习 Vue 0301 浏览器本地存储localStorageSessionStorage案例 todolist的完善 02 组件自定义事件Custom Events基本使用解绑自定义事件注意事项①② 总结案例 todolist的完善 03 全局事件总线GlobalEventBus案例 todolist的完善 04 消息的订阅与发布案例 todolist的完善 05…

利用R语言和curl库实现网页爬虫的技术要点解析

R语言简介 R语言是一种自由、跨平台的编程语言和软件环境&#xff0c;专门用于统计计算和数据可视化。它具有丰富的数据处理、统计分析和图形展示功能&#xff0c;被广泛应用于数据科学、机器学习、统计建模等领域。 R语言技术优势 丰富的数据处理功能&#xff1a; R语言拥有…

unity双层滑动实现

实现功能&#xff1a; 当滑动列表中内容处于顶端的时候&#xff0c;向上滑动优先滑动整个滑动列表&#xff0c;当滑动列表移动到设置位置&#xff0c;即设定的最高处时&#xff0c;继续移动列表内内容。向下移动亦然&#xff0c;当内容处于滑动列表顶端时&#xff0c;移动整个滑…

低功耗、低成本 NAS/公共文件夹 的可能性

使用现状&#xff1a;多台工作电脑&#xff0c;家里人手一台&#xff0c;还在两个住处 有好几台工作电脑&#xff0c;不同电脑不同OS有不同的用途&#xff0c;最大的问题就是各个电脑上文件的同步问题&#xff0c;这里当然就需要局域网里的公共文件夹&#xff0c;在NAS的问题上…

R语言使用dietaryindex包计算NHANES数据多种营养指数(2)

健康饮食指数 (HEI) 是评估一组食物是否符合美国人膳食指南 (DGA) 的指标。Dietindex包提供用户友好的简化方法&#xff0c;将饮食摄入数据标准化为基于指数的饮食模式&#xff0c;从而能够评估流行病学和临床研究中对这些模式的遵守情况&#xff0c;从而促进精准营养。 该软件…

Unity3d使用Jenkins自动化打包(Windows)(一)

文章目录 前言一、安装JDK二、安装Jenkins三、Jenkins插件安装和使用基础操作 实战一基础操作 实战二 四、离线安装总结 前言 本篇旨在介绍基础的安装和操作流程&#xff0c;只需完成一次即可。后面的篇章将深入探讨如何利用Jenkins为Unity项目进行打包。 一、安装JDK 1、进入…

【嵌入式机器学习开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式机器学习开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 在ARM-Linux系统中&#xff0c;C语言程序的安装和运行可…

快速上手Spring Cloud 六:容器化与微服务化

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

啥也不会的大学生看过来,这8步就能系统入门stm32单片机???

大家好&#xff0c;今天给大家介绍啥也不会的大学生看过来&#xff0c;这8步就能系统入门stm32单片机&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 对于没有任何基础的大学生来…

数据库原理与应用(SQL Server)笔记 关系数据库

目录 一、关系数据库的基本概念&#xff08;一&#xff09;关系数据库的定义&#xff08;二&#xff09;基本表、视图&#xff08;三&#xff09;元组、属性、域&#xff08;四&#xff09;候选码、主码、外码 二、关系模型三、关系的完整性&#xff08;一&#xff09;实体完整…

快速上手Spring Cloud五:Spring Cloud与持续集成/持续部署(CI/CD)

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

神策数据参与制定首份 SDK 网络安全国家标准

国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff08;2023 年第 13 号&#xff09;&#xff0c;全国信息安全标准化技术委员会归口的 3 项国家标准正式发布。其中&#xff0c;首份 SDK 国家标准《信息安全技术 移动互联网应用程序&#xff0…

根据实例逐行分析NIO到底在做什么

Selector&#xff08;选择器&#xff09;是 Channel 的多路复用器&#xff0c;它可以同时监控多个 Channel 的 IO 状况&#xff0c;允许单个线程来操作多个 Channel。Channel在从Buffer中获取数据。 选择器、通道、缓冲池是NIO的核心组件。 一、新建选择器 此时选择器内只包含…

HackTheBox-Machines--Legacy

文章目录 1 端口扫描2 测试思路3 445端口漏洞测试4 flag Legacy 测试过程 1 端口扫描 nmap -sC -sV 10.129.227.1812 测试思路 目标开启了135、139、445端口&#xff0c;445 SMB服务存在很多可利用漏洞&#xff0c;所以测试点先从445端口开始。而且在Nmap扫描结果中&#xff0c…