第 7 章 文本处理

 

第 6 章 表间关联

7.1 数据介绍

情感词典 sentiment.csv

字段名 含义
Word 单词
Sentiment_Score 情感打分,正面情绪最高 5 分,负面情绪最低 -5 分

7.2 找出客户反馈信息中的高频词汇

第一步: 读数,使用浏览功能,从 saledata.csv 中读取分析所需的两列:

然后规范反馈单词,需要把反馈信息中的字符统一成小写,且去掉两端的空白字符。

解决方法 1 saledata 表中追加计算列,将 feedBack 的内容通过表达式规范到新的数据列。但是该办法会导致数据冗余,耗费内存。

解决方法 2 SPL WIN 有对序表的每行数据直接计算表达式的函数 run 。在手写命令区,执行表达式:saledata.run(trim(lower(feedBack)):feedBack)

上述表达式还有一种赋值的写法

saledata.run(feedBack=trim(lower(feedBack)))

两者是等价的,执行后得到规范后的反馈信息:

表达式中 trim 函数用来去掉字符两端的空白符, lower 函数把字符串变成小写。

知识点:序表的 run 函数,会循环表里面的所有行,依次对每行数据计算表达式,并将计算结果赋值到指定的列中。详细用法请参考:https://d.raqsoft.com.cn:6443/esproc/func/run.html#__154

第二步: 将反馈信息变成单词序列,再次在命令区执行表达式:

saledata.run(feedBack.words():feedBack)

表达式中feedBack.words()表示将 feedBack 变成单词序列。上述两步表达式,之所以分开执行,是为了让用户看清每一步函数执行后的效果,待用熟练后,可以连写,一步执行完成。比如saledata.run(trim(lower(feedBack)).words():feedBack)

拆分单词后, feedBack 的值就是一个个单词序列了:

双击任意行的 feedBack 查看具体内容:

注意此时的结果是序列,不同于序表的工具栏,序列不支持界面功能。

知识点:SPL WIN 中由多个数据成员 构成的有序集合称为序列 。注意序列时,内容显示面板没有分析功能按钮,以及表头的描述是成员(Member)。序表是序列的子集。

第三步:saledata 表中,合并明细,将所有反馈信息合并到 AllWords

AllWords 为所有单词的序列:

然后按单词分组统计出现的频次,由于 AllWords 不是序表,所以不能使用界面功能的分组,但仍然可以使用命令区表达式AllWords.groups(~:value;count(1):Count),直接对 AllWords 序列分组统计:

命令区返回的无名结果,不方便后续计算,将其重命名为 WordFrequency

使用排序界面,或者双击 Count 列,均可以对 Count 排序,将 Count 降序排列,以查看最大词频的单词:

从排序后的 WordFrequency 结果可以看出,大量的介词、连词、定冠词等无业务意义的词汇出现频次很高,需要将这些词汇剔除。

第四步: 去掉无意义的词汇。

列出介词表,在命令区执行

"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".words()

命令执行后,将结果命名为 Preposition :

WordFrequency 中单击过滤,输入过滤表达式

!Preposition.contain(value)

单击OK后,得到更简洁的结果,能立即突显客户关注的核心议题——产品、质量、服务与交付。企业可利用这些信息,精准识别客户讨论最频繁的业务维度。

7.3 分析客户对产品的满意度

顾客对产品满意还是不满意?情感分析可以帮助回答这个问题。让我们实现一个简单的基于词典的方法。

第一步: 读取销售数据中的客户名称和客户反馈,并整理客户反馈内容,转换成单词序列,内容同上例:

第二步: 打开sentiment.csv,读取情感词典:

第三步: 将情感词典和客户反馈单词序列关联,计算平均情感得分,在 saledata 表中增加计算列,使用计算表达式

sentiment.align@b(feedBack:~,Word).avg(ifn(~.Sentiment_Score,0))

设置计算列:

表达式中sentiment.align@b(feedBack:~,Word)的含义为,将sentiment表和feedBack列关联,关联值是feedBack的当前成员和sentimentWord字段。avg(ifn(~.Sentiment_Score,0))表示对关联后的结果算平均得分,其中ifn(~.Sentiment_Score,0)表示如果~.Sentiment_Scorenull,则取 0,以防有些单词不在词典中。

单击OK后得到结果:

第四步: 给客户情感得分评级,再添加计算列,使用表达式

if(Sentiment_Score>0.2:"positive",Sentiment_Score<-0.2:"negative";"neutral")

设置计算列:

最终得分大于 0.2 的视为positive, 小于 0.2 的视为negative,其余均视为neutral。执行结果为:

该分析可让您快速了解客户情绪概况。例如,您可能会发现:

• 65% 的反馈为正面,20% 为负面,15% 为中立
• 某些产品的负面反馈明显多于其他产品
• 特定地区的客户反馈往往更加积极
• 客户情绪随时间推移呈现改善趋势

这些洞察能帮助您:
• 定位需要改进的环节
• 追踪产品服务优化后的成效

7.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"]]

产生一个嵌套的序列,也就是序列成员仍然是一个序列,每个子序列归属一个主题。执行的结果命名为AllKeys

再次执行["price","quality","service"]并将结果命名 AllTopics

然后将 AllKeysAllTopics 合并产生为数据表,执行

AllKeys.new(~.sort():Keys, AllTopics(AllKeys.#):Topics)

后将结果命名为 TopicTable

知识点:new 函数用于计算序列后生成新序表。详细用法请参考:https://d.raqsoft.com.cn:6443/esproc/func/anewxifi.html

第三步:saledata 表中增加计算列,使用表达式

feedBack.(TopicTable.select@1(Keys.contain@b(feedBack.~)).Topics)

找出每一行 feedBack 对应的 Topics ,因为 feedBack 是一个单词的序列,所以可能会存在多个 Topics 的现象,TopicTable .select@1的含义是:查找到一条符合条件的记录后,就不再继续往下查找。:

计算结果为:

第四步:topic_matches 里找出出现频次最高的 topic 作为 main_topic ,再次使用计算表达式:

topic_matches.select(~).groups(~:topics;count(1):c).maxp@a(c).id(topics)

添加计算列:

参考 2.5 节知识点,maxp@a(c)的含义为,如果最大值有并列的情况,均选出。计算结果为:

第五步:saledata 里将所有讨论的主题合并为大序列:

合并的结果为:

第六步: 统计每个主题的讨论次数,得出客户对哪个主题最感兴趣,在命令区执行

DiscussionTopic.groups(~:Topic;count(1):Count)

后得到最终分析结果:

由此可以看出,用户对售后服务(service)还是最感兴趣,需要在售后服务上面再多下功夫,给用户以最好的用户体验。