关键词提取案例
一、案例背景
在电商行业中,用户评论是了解用户需求和产品反馈的重要数据来源。
通过分析用户评论,可以提取出用户关注的关键词,从而帮助商家优化产品和服务。
本案例将展示如何结合pandas
数据清洗、jieba
分词和scikit-learn
关键词提取技术,处理和分析用户评论数据。
二、数据模拟
1.数据需求
-
商品ID:随机生成的整数,范围为1000到9999。
-
用户评论:随机生成的中文句子,模拟用户对商品的评价。
-
数据量:至少10000条记录。
2.数据生成代码
# 导入必要的库
import pandas as pd
from faker import Faker
import random
# 初始化Faker库(设置为中文)
fake = Faker('zh_CN')
# 模拟数据的函数
def generate_comments(num_records):
# 创建一个字典,包含两列:商品ID和用户评论
data = {
# 使用列表推导式生成随机商品ID,范围为1000到9999
'商品ID': [random.randint(1000, 9999) for _ in range(num_records)],
# 使用Faker库生成随机中文评论
'用户评论': [fake.text() for _ in range(num_records)]
}
# 将字典转换为pandas DataFrame
return pd.DataFrame(data)
# 生成10000条数据
df = generate_comments(10000)
# 查看前几行数据
print("模拟数据的前几行:")
print(df.head())
# 保存为CSV文件
df.to_csv('comments.csv', index=False, encoding='utf-8')
print("CSV文件已生成,包含10000条数据。")
3.代码运行结果
运行上述代码后,将生成一个名为comments.csv
的文件,包含10000条用户评论数据。文件内容示例如下:
商品ID | 用户评论 |
---|---|
1234 | 这个商品质量很好,我很满意! |
5678 | 东西不错,性价比高,值得购买 |
9101 | 服务态度差,下次不会再买了。 |
2345 | 商品包装很精美,物流速度也很快。 |
6789 | 产品功能很强大,但价格有点贵。 |
4.逐行注释
4.1. 导入库:
-
pandas :用于数据处理。
-
Faker :用于生成模拟数据。
-
random :用于生成随机数。
4.2. 初始化Faker库:
- 设置为中文模式,以便生成中文评论。
4.3. 定义生成数据的函数:
-
创建一个包含 商品ID 和 用户评论 的字典。
-
使用 random.randint() 生成随机商品ID。
-
使用 fake.text() 生成随机中文评论。
-
将字典转换为 pandas DataFrame 。
4.4. 生成10000条数据:
- 调用函数生成数据。
4.5. 查看前几行数据:
- 使用 df.head() 查看生成的数据。
4.6. 保存为CSV文件:
- 使用 to_csv 方法将数据保存为CSV文件。
三、关键词提取与分析
1.数据处理与关键词提取
1.1 数据读取与清洗
# 导入必要的库
import pandas as pd
# 数据读取与清洗
# 读取CSV文件
data = pd.read_csv('comments.csv', encoding='utf-8')
# 去除空评论和重复评论
data = data.dropna(subset=['用户评论']).drop_duplicates(subset=['用户评论'])
print("清洗后的数据行数:", len(data))
1.2 分词与关键词提取
# 分词与关键词提取
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
# 定义分词函数,使用jieba进行中文分词
def chinese_tokenization(text):
return " ".join(jieba.cut(text))
# 对每条评论进行分词
data['分词评论'] = data['用户评论'].apply(chinese_tokenization)
# 使用TfidfVectorizer提取关键词
vectorizer = TfidfVectorizer(norm=None, use_idf=True, smooth_idf=True, sublinear_tf=False)
# 计算TF-IDF矩阵
tfidf_matrix = vectorizer.fit_transform(data['分词评论'])
# 获取特征名称(即词汇表)
feature_names = vectorizer.get_feature_names_out()
# 提取每条评论的关键词
def extract_keywords(row, feature_names, top_n=5):
# 将TF-IDF值和特征名称组合,并按TF-IDF值降序排序
sorted_tfidf = sorted(zip(row, feature_names), reverse=True)
# 提取权重最高的top_n个关键词
return [word for _, word in sorted_tfidf[:top_n]]
# 将TF-IDF矩阵转换为关键词列表
data['关键词'] = [extract_keywords(row, feature_names) for row in tfidf_matrix.toarray()]
1.3 统计关键词频率
from collections import Counter
# 统计所有关键词的频率
all_keywords = [word for sublist in data['关键词'] for word in sublist]
keyword_freq = Counter(all_keywords)
# 输出关键词频率统计
print("关键词频率统计:")
for keyword, freq in keyword_freq.most_common(10):
print(f"{keyword}: {freq}")
# 保存处理后的数据到新的CSV文件
data.to_csv('processed_comments.csv', index=False, encoding='utf-8')
print("处理后的数据已保存到processed_comments.csv文件中。")
1.4 完整代码
# 导入必要的库
import pandas as pd
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from collections import Counter
# 数据读取与清洗
# 读取CSV文件
data = pd.read_csv('comments.csv', encoding='utf-8')
# 去除空评论和重复评论
data = data.dropna(subset=['用户评论']).drop_duplicates(subset=['用户评论'])
print("清洗后的数据行数:", len(data))
# 分词与关键词提取
# 定义分词函数,使用jieba进行中文分词
def chinese_tokenization(text):
return " ".join(jieba.cut(text))
# 对每条评论进行分词
data['分词评论'] = data['用户评论'].apply(chinese_tokenization)
# 使用TfidfVectorizer提取关键词
vectorizer = TfidfVectorizer(norm=None, use_idf=True, smooth_idf=True, sublinear_tf=False)
# 计算TF-IDF矩阵
tfidf_matrix = vectorizer.fit_transform(data['分词评论'])
# 获取特征名称(即词汇表)
feature_names = vectorizer.get_feature_names_out()
# 提取每条评论的关键词
def extract_keywords(row, feature_names, top_n=5):
# 将TF-IDF值和特征名称组合,并按TF-IDF值降序排序
sorted_tfidf = sorted(zip(row, feature_names), reverse=True)
# 提取权重最高的top_n个关键词
return [word for _, word in sorted_tfidf[:top_n]]
# 将TF-IDF矩阵转换为关键词列表
data['关键词'] = [extract_keywords(row, feature_names) for row in tfidf_matrix.toarray()]
# 统计关键词频率
# 统计所有关键词的频率
all_keywords = [word for sublist in data['关键词'] for word in sublist]
keyword_freq = Counter(all_keywords)
# 输出关键词频率统计
print("关键词频率统计:")
for keyword, freq in keyword_freq.most_common(10):
print(f"{keyword}: {freq}")
# 保存处理后的数据到新的CSV文件
data.to_csv('processed_comments.csv', index=False, encoding='utf-8')
print("处理后的数据已保存到processed_comments.csv文件中。")
2.结果输出
运行上述代码后,将输出关键词频率统计结果,并保存处理后的数据到新的CSV文件中。
示例输出
关键词频率统计:
来源: 319
软件: 312
电脑: 288
类型: 286
这是: 286
资源: 281
质量: 277
大学: 266
因为: 263
文件: 260
……
3.逐行注释
3.1. 导入库:
-
pandas :用于数据处理。
-
jieba :用于中文分词。
-
TfidfVectorizer :用于计算TF-IDF值。
-
Counter :用于统计关键词频率。
3.2. 读取CSV文件:
- 使用 pd.read_csv 读取生成的CSV文件。
3.3. 数据清洗:
-
使用 dropna 去除空评论。
-
使用 drop_duplicates 去除重复评论。
3.4. 定义分词函数:
- 使用 jieba.cut 对文本进行分词。
3.5. 对每条评论进行分词:
- 使用 apply 方法对每条评论应用分词函数。
3.6. 使用TfidfVectorizer提取关键词:
-
初始化 TfidfVectorizer ,设置参数。
-
计算TF-IDF矩阵。
3.7. 获取特征名称:
- 使用 get_feature_names_out 获取词汇表。
3.8. 定义提取关键词的函数:
-
将TF-IDF值和特征名称组合。
-
按TF-IDF值降序排序。
-
提取权重最高的 top_n 个关键词。
3.9. 将TF-IDF矩阵转换为关键词列表:
- 对每行TF-IDF矩阵应用提取关键词的函数。
3.10. 统计关键词频率:
-
将所有关键词展平为一个列表。
-
使用 Counter 统计关键词频率。
3.11. 输出关键词频率统计:
- 使用 most_common 方法获取出现频率最高的10个关键词。
3.12. 保存处理后的数据:
- 使用 to_csv 方法将处理后的数据保存为新的CSV文件。
四、应用场景
-
情感分析:通过关键词频率和情感词典,判断用户对商品的整体态度。
-
用户需求分析:了解用户最关注的方面(如质量、价格、服务等)。
-
产品优化:根据高频关键词,针对性地改进产品或服务。
五、总结
通过结合pandas
数据清洗、jieba
分词和scikit-learn
关键词提取技术,
我们能够高效地处理和分析用户评论数据,为后续的业务决策提供数据支持。
本案例展示了从数据模拟到关键词提取的完整流程,可以直接应用于实际工作中。