【数据挖掘】一、基于LDA的用户兴趣建模(兴趣标签生成模型)--用户兴趣挖掘模型

说明

        本文的数据集来源于英雄联盟评论数据集,旨在挖掘 英雄联盟评论数据中的主题兴趣标签。本次实验是基于LDA模型实现用户的兴趣建模,即从英雄联盟评论数据中生成用户感兴趣的标签。        

        本文 是基于英雄联盟的评论数据集,采用基于LDA主题生成模型,研发一种高效的兴趣标签生成模型。通过LDA主题模型,实现更准确、可靠的标签生成。同时,结合数据处理结束,对对英雄联盟等进行标签生成,并进行进一步的标签分类、聚类和热度分析,以揭示英雄联盟玩家用户兴趣和需求的深层信息。

需要用到的数据集和停用词表下载:英雄联盟评论数据集

目录

说明

1、环境配置和导入依赖包

1.1 依赖包安装

1.2 导入依赖包

2、数据预处理

2.1 数据加载

2.2 数据异常值处理

2.3 中文文本处理

2.4 情感分析

2.5 jieba分词

(1)文本处理结果查看

(2)jieba分词

(3)停用词过滤

3、生成词云图

3.1 词语计数

3.2 词云图掩码图准备

3.3 生成词云图

3.4 文本频率表生成

4、词频统计(TF-IDF)

5、构建词典和语料库

6、LDA模型评估与选择

6.1 LDA模型评估与选择代码实现

6.2 代码详解

(1)函数定义 lda_model_values

(2)函数内部执行以下操作:

(3)调用 lda_model_values 函数

(4)绘制图形

7、LDA主题建模

7.1 LDA主题建模实现

7.2 上述代码详解

(1)构建LDA模型

(2)输出主题关键词

(3)确定文档的主题归属

(4)注意事项

8、LDA模型主题关键词提取与导出

8.1 LDA模型主题关键词提取与导出实现

8.2 代码详解

(1)初始化DataFrame

(2)处理主题和关键词

(3)整合关键词

(4)导出生成的用户兴趣标签

9、LDA模型可视化与保存

9.1 实现

9.2 代码详解

(1)启用Jupyter Notebook内嵌可视化

(2)准备可视化数据

(3)保存可视化结果为HTML文件

10、关键词热度分析


1、环境配置和导入依赖包

1.1 依赖包安装

此次实验是在notebook环境中实现的,首先要安装项目所需要的依赖包,例如:

!pip install gensim -i https://mirrors.aliyun.com/pypi/simple/
!pip install  pyLDAvis  -i https://mirrors.aliyun.com/pypi/simple/
!pip install snownlp -i https://mirrors.aliyun.com/pypi/simple/
!pip install wordcloud -i https://mirrors.aliyun.com/pypi/simple/ 
......

需要什么依赖包就安装什么依赖包,就不一一列举出来了。

1.2 导入依赖包

在环境中导入依赖包:

import numpy as np
import pandas as pd
import jieba
import gensim
from gensim.models import LdaModel, CoherenceModel
from gensim.corpora import Dictionary
from gensim import corpora, models
import pyLDAvis
import pyLDAvis.gensim_models as gensimvis
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
from PIL import Image
import warnings
import codecs
import re
import time
import matplotlib
from snownlp import SnowNLP

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 忽略警告
warnings.filterwarnings("ignore")

2、数据预处理

2.1 数据加载

        首先是加载数据集,因为数据集存在一列“Unnamed:0”是多余的,所以需要删除掉该列,加载数据集并删除多余的列,如下::

df=pd.read_csv("../datasets/extopic.csv")
df = df.drop(columns=['Unnamed: 0'])
df
  • 运行结果如下:

2.2 数据异常值处理

异常值处理:

#处理异常值
print("在NewMessage列中总共有 %d 个空值." % df['NewMessage'].isnull().sum())
df[df.isnull().values==True]#isnull返回一个布尔数组
df = df[pd.notnull(df['NewMessage'])]#保留非null的news

df['content']=df['NewMessage'].astype(str) #将数据类型都换成str
df
  • 运行截图

2.3 中文文本处理

中文文本处理,包括提取中文字符、过滤掉单个汉字以及去重,如下:

#中文文本处理
def extract_chinese(text):
    chinese_pattern = re.compile(r'[\u4e00-\u9fa5]+') 
    chinese_words = chinese_pattern.findall(text)  
    return ' '.join(chinese_words)  

df['content'] = df['content'].apply(extract_chinese)
df['content'] = df['content'].apply(lambda x: ' '.join([word for word in x.split() if len(word) > 1]))
df.drop_duplicates(inplace=True)
df.head()
  • 运行截图

2.4 情感分析

情感分析,判断文本的情感方向:

# 定义情感分类函数
def classify_sentiment(sentiment):
    if sentiment >= 0.5:
        return 'positive'
    else:
        return 'negative'

def classify_sentiments(text):
    if pd.isna(text) or text.strip() == '':
        return None  # 返回 None 或者其他默认值
    s = SnowNLP(text)
    sentiment = s.sentiments
    return sentiment

# 处理空值
df['content'] = df['content'].fillna('')  # 将空值填充为空字符串

# 对评论列进行情感分类
df['sentiment'] = df['content'].apply(classify_sentiments)

# 删除包含空值的行
df = df.dropna(subset=['sentiment'])
df 
  • 运行截图

2.5 jieba分词

(1)文本处理结果查看

jieba分词前,我们可以查看每一个句子的完整句子,例如输出前5条句子的完整句子:

content = df['content'].values.tolist()
content[:5]
  • 运行截图

(2)jieba分词

jieba分词并输出前十个词,如下:

segment=[]
for line in content:
    try:
        segs = jieba.lcut(line)#分词
        for seg in segs:
            if len(seg)>1 and seg != '\r\n':
                segment.append(seg)
    except:
        print(line)
        continue
segment[:10]
  • 运行截图

(3)停用词过滤

 读取停用词表,然后停用词过滤,停用词表用的是这个:停用词表

  • 停用词过滤如下:
# 读取停用词文件
try:
    stopwords = pd.read_csv(r'../datasets/stop_words.txt', header=None, encoding='utf-8', names=['stopword'], on_bad_lines='skip')
except pd.errors.ParserError as e:
    print(f"ParserError: {e}")
    stopwords = pd.read_csv(r'../datasets/stop_words.txt', header=None, encoding='utf-8', names=['stopword'], delimiter='\t', on_bad_lines='skip')

# 确保停用词列只有一个单词或短语
stopwords = stopwords['stopword'].str.strip()

words_df = pd.DataFrame({'segment': segment})

# 过滤掉停用词
words_df = words_df[~words_df['segment'].isin(stopwords)]

# 显示前几行数据
words_df.head()
  • 运行结果:

3、生成词云图

3.1 词语计数

接下来是对每一个词语进行统计计数,通过降序排列,按照数量从高到底的方式对词语进行排序,如下:

words_stat=words_df.groupby(by=['segment'])['segment'].agg([("计数",np.size)])
words_stat=words_stat.reset_index().sort_values(by=["计数"],ascending=False)
words_stat.head()
  • 运行截图

如上图可以发现,在所有词语中,“冠军”这一词出现的次数最多,出现了2798次,其次是“系列”。

 我们也可以单独查看排名,例如我想知道排名第四和第一百的是哪个词语,如下:

words_stat.iloc[4]
words_stat.iloc[100]
  • 结果:

3.2 词云图掩码图准备

        生成词云图前要准备一张掩码图,掩码图的作用是指导词云图生成的形状,例如有中国地图形状的,有爱心形状的等等各种各样的图像。

        那么词云图掩码图如何找呢?其实很简单,直接搜就可以搜出来,比如说搜:“词云图背景图”:

        我最终找到了一张哆啦A梦形状的背景图,例如说将其命名为“词云图掩码图.jpg”保存到指定位置,如下:

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值