8. 文本处理
8.1 数据介绍
情感词典 sentiment_lexicon.csv
字段名 | 含义 |
---|---|
Word | 单词 |
Sentiment_Score | 情感打分,正面情绪最高 5 分,负面情绪最低 -5 分 |
8.2 找出客户反馈信息中的高频词汇
第一步:读数,把反馈信息中的字符统一成小写,且去掉两端的空白字符
A | |
---|---|
1 | =file(“sales.csv”).import@tc(customer,feedBack) |
2 | =A1.run(feedBack=trim(lower(feedBack))) |
A1 的运行结果:
A2 trim() 函数去掉字符两端的空白符,lower 函数把字符串变成小写。
A2 的运行结果:
第二步:将反馈信息变成单词序列,然后按单词分组统计出现的频次
A | |
---|---|
3 | =A2.conj(feedBack.words()) |
4 | =A3.groups(~:value;count(1):Count) |
5 | =A4.sort(-Count) |
A3 feedBack.words()表示将 feedBack 变成单词序列,conj() 函数将序列的序列合并成一个大序列
A3 的运行结果:
A4 将 A3 按单词分组汇总,统计每个单词出现的频次
A4 的运行结果:
A5 按单词出现的频次逆序排序,出现频次高的排在前面
A5 的运行结果:
第三步:去掉无意义的词汇
从 A5 的结果可以看出,大量的介词、连词、定冠词等无业务意义的词汇出现频次很高,需要将这些词汇剔除:
A | |
---|---|
6 | [the,to,for,in,i,and,is,my,a,this,was,than,as,after,no,you,would,s,by,never,of,with,up,me,during,it,t,be,on,will,even,please,d,v,or,your] |
7 | =A6.sort() |
8 | =A5.select(!A7.contain@b(value)) |
A8 从 A5 中选出 value 不在 A7 中的记录,A7.contain@b
(value) 中 @b 选项表示,当 A7 按 value 有序时,采用二分法查找,效率更高。
A8 的运行结果:
这种过滤掉无意义词汇后更简洁的结果,能立即突显客户关注的核心议题——产品、质量、服务与交付。企业可利用这些信息,精准识别客户讨论最频繁的业务维度。
8.3 分析客户对产品的满意度
顾客对产品满意还是不满意?情感分析可以帮助回答这个问题。让我们实现一个简单的基于词典的方法:
第一步:读取销售数据中的客户名称和客户反馈,并整理客户反馈内容,转换成单词序列,内容同上例
A | |
---|---|
1 | =file(“sales.csv”).import@tc(customer,feedBack) |
2 | =A1.run(feedBack=trim(lower(feedBack))) |
3 | =A2.derive(feedBack.words():Words) |
A3 将 feedBack 转成单词序列,并存储在新添加的字段 Words 中。
A3 的运行结果:
双击任意行的 Words 字段值,可以看到:
第二步:读取情感词典
A | |
---|---|
4 | =file(“sentiment_lexicon.csv”).import@ct() |
A4 的运行结果:
第三步:将情感词典和客户反馈单词序列关联,计算平均情感得分
A | ||
---|---|---|
5 | =A3.derive(A4.align@b(Words:~,Word).avg(ifn(~.Sentiment_Score,0)):Sentiment_Score) | |
A5 A4.align@b(Words:~,Word) 的含义: 将 A4 和 Words 字段关联,关联值是 Words 的当前成员和 A4 的 Word 字段。.avg(ifn(~.Sentiment_Score,0)) 表示对关联后的结果算平均得分,其中 ifn(~.Sentiment_Score,0) 表示如果 ~.Sentiment_Score 为 null,则取 0,以防有些单词不在词典中。
A5 的运行结果:
第四步:给客户情感得分评级
A | |
---|---|
6 | =A5.derive(if(Sentiment_Score>0.2:“positive”,Sentiment_Score<-0.2:“negative”;“neutral”): Sentiment) |
A6 最终得分大于 0.2 的视为 positive, 小于 0.2 的视为 negative,其余均视为 neutral。
A6 的运行结果:
该分析可让您快速了解客户情绪概况。例如,您可能会发现:
- 65% 的反馈为正面,20% 为负面,15% 为中立
- 某些产品的负面反馈明显多于其他产品
- 特定地区的客户反馈往往更加积极
- 客户情绪随时间推移呈现改善趋势
这些洞察能帮助您:
- 定位需要改进的环节
- 追踪产品服务优化后的成效
8.4 客户讨论主题分析
除了情感倾向,您可能还想了解客户讨论的具体主题。我们可以实施一个基于关键词的简易主题分类方案:
第一步:读取销售数据中的客户名称和客户反馈,并整理客户反馈内容,转换成单词序列,内容同上例
A | |
---|---|
1 | =file(“sales.csv”).import@tc(customer,feedBack) |
2 | =A1.run(feedBack=trim(lower(feedBack))) |
3 | =A2.derive(feedBack.words().sort():Words) |
第二步:产生一个简易的主题词汇表
A | |
---|---|
4 | =[[“price”,“cost”,“expensive”,“cheap”,“affordable”,“fees”,“cheaper”,“charged”,“refund”,“money”,“worth”,“penny”,“buy”,“lower”,“higher”,“overpriced”,], [“quality”,“durable”,“broke”,“lasting”,“sturdy”,“drops”,“randomly”,“drains”,“interface”,“leak”,“error”,“inconsistency”,“slower”,“freezes”,“resetting”,“overheats”,“compatibility”,“unresponsive”], [“service”,“support”,“help”,“response”,“staff”,“update”,“released”,“process”,“apology”,“inconvenience”,“patience”,“delivery”,“waited”,“rude”,“follow”,“available”,“late”]] |
5 | = [“price”,“quality”,“service”] |
6 | =A4.new(~.sort():Keys, A5(A4.#):Topics) |
A6 的运行结果:
双击其中一行的 Keys 字段,可看到:
第三步:从 A6 中查找和 A3 中的每一个 Words 对应的 Topics,因为 A3 中的 Words 是一个单词的序列,所以可能会存在多个 Topics 的现象
A | |
---|---|
7 | =A3.derive(Words.(A6.select@1 (Keys.contain@b(Words.~)).Topics):topic_matches) |
A7 select@1
的含义是:查找到一条符合条件的记录,就不再继续往下查找
A7 的运行结果:
第四步:从 topic_matches 里找出出现频次最高的 topic 作为 main_topic
A | |
---|---|
8 | =A7.derive(topic_matches.select(~).groups(~:topics;count(1):c).maxp@a(c).id(topics):main_topic) |
A8 maxp@a 的选项 @a 的含义:如果最大值有并列的情况,则均选出。
A8 的运行结果: