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

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

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

1. 环境设置

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

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

lua 复制代码
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连接。以下是我们将要讲解的代码:

PythonAI 生成的代码。仔细查看和使用。 有关常见问题解答的详细信息.

lua 复制代码
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库删除所有的标点符号。
Python 复制代码
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. 主题分析

Python 复制代码
    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. 应用

Python 复制代码
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条记录,并对每一条记录的评论进行主题分析。

完整代码

python 复制代码
# 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()

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

  1. 预处理:对于较短的文本,可以尝试将它们与相邻的文本合并,以形成更长的文本。这样可以提供更多的上下文信息,有助于LDA模型更好地提取主题。
  2. 调整模型参数 :LDA模型的主要参数包括主题数(num_topics)和迭代次数(passes)。对于较短的文本,可以尝试减少主题数和增加迭代次数,以提高模型的性能。
  3. 使用其他模型:如果LDA模型在处理较短文本时效果不佳,可以考虑使用其他的主题模型,如NMF(非负矩阵分解)或LSA(潜在语义分析)。
  4. 特征选择:在进行主题提取之前,可以通过TF-IDF等方法进行特征选择,以减少噪声并提高模型的性能。
相关推荐
weixin_549808367 分钟前
人力资源数字化转型:从工具堆叠到AI原生架构的组织级跃迁路径
大数据·人工智能
l0001097 分钟前
图书馆静谧环境构建:主流声学品牌产品与服务梳理
大数据·人工智能·声音
ACP广源盛139246256732 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
微三云-张梅3 小时前
东莞企业做GEO:AI信任体系的三个建设层级
大数据·人工智能·微三云geo·东莞系统开发·东莞geo
starzy19904 小时前
Spark 核心之 Spark-SortShuffle 原理深度剖析
大数据·spark
美狐美颜sdk5 小时前
直播APP开发技术架构解析:从音视频流到第三方美颜SDK接入的完整方案
大数据·人工智能·音视频·美颜sdk·美颜api
Capricorn19886 小时前
知芽研究问题看板无法推进?从孵化区到笔记的机制排查指南
大数据·论文阅读·人工智能·笔记·学习方法·论文笔记
凡科网小帆6 小时前
2026小程序商城平台哪家强,小程序商城平台选型怎么做
大数据·小程序·小程序商城平台
睿本云6 小时前
从“有数据”到“会用数据”,一次标签体系的升级能带来的改变
大数据·人工智能
牛奶咖啡137 小时前
大数据Hadoop运维应用实践——Hadoop平台常见问题与故障汇总、系统调优、网络规划与硬件存储选型
大数据·hadoop·hadoop集群操作系统调优·hadoop集群运维问题汇总·hadoop集群硬件规划·大数据平台网络规划·大数据平台硬件存储选型