2020美赛C题思路(内附完整代码)

这里记录的是我第三次(最后一次)美赛的参赛记录,第二次的文章在这里,第一次的文章在这里

这篇文章写于2020年3月10日上午6点55,距离我提交论文仅过去了25分钟,强忍着睡意,趁着现在还记得一些思路,赶紧做下记录,免得睡一觉起来忘了

赛前

赛前什么都没准备,本来这次就准备划水的,因为就算拿了O奖,也是4月底的事了,到时候研究生复试什么的早就结束了

3月6日

本来早上定的6点的闹钟,结果睡过了,睡到7点多才起床,然后队友很贴心的已经翻译好了C题,毕竟是一起参加过比赛的,都不用讨论,就已经知道了准备选什么题。所以这次美赛我只知道C题的题目,其它题我根本看都没看。C题大意是说给你三个产品的数据集,数据集里有一些字段:评分(数值)、评论(文本)、是否购买(Y/N)、品牌编号…。要你根据这三个数据集,回答一堆问题,什么建立评分评论的定性或定量模型,什么特定等级的评分是否会引发更多的评论之类的,总共大概有7个问题吧。比较巧的是,赛前我一直在学习NLP,C题对评论(文本)进行处理,实际上就是NLP问题。我的具体做法是对review_body进行情感分析,并将情感值分为三档:积极、中性、消极。情感分析很简单了,有很多模型都能做,我用的是Bidirectional LSTMs模型,双向LSTMs可以同时考虑上下文信息,比传统LSTMs得到的结果要更准。用PyTorch30分钟就调试通了,于是本地运行了一下,感觉太慢,所以转到了colab上用GPU跑。那么如何将得到的结果融入到评分中去呢?我是这样做的,原本的评分只有5档(1~5)。但是可能有人给了4.5分,系统自动四舍五入了,为了还原得到更准确的评分分布,或者也可以说是为了更加离散评分分布,我制定了下面的策略:

如果一个人的原始评分大于等于4,并且情感分析结果是积极的,不做任何改变

如果一个人的原始评分小于等于2,并且情感分析结果是消极的,不做任何改变

如果一个人的原始评分属于(2,4),并且情感分析结果是积极的,则将评分变为原始评分+0.5

如果一个人的原始评分属于(2,4),并且情感分析结果是消极的,则将评分变为原始评分-0.5

为什么要这么做?如果你仔细想想,应该能明白其中的缘由,如果不明白,你也可以认为我是拍脑袋随便想的

随便看一张离散后的图,纵坐标是每种评分的占比

2020美赛C题思路(内附完整代码)_第1张图片

第一问忘了怎么做的了,现在也懒得翻论文,第一天没做什么事,基本上就是处理了所有的文本,然后随便画了几张图看了看数据分布,然后就是和队友聊聊天(划水就要划的彻底)。下面上第一天的代码(不全)

这里面并没有BiLSTMs模型的代码,代码在这篇文章里

3月7日

7号老师给我说了好多思路,印象比较深的是,未购买产品的用户也是可以评分和评论的,未购买的用户verified_purchased字段值为N。然后老师还让我画出某个产品5、4、1星每个月的占比与销量的关系,老师信誓旦旦的说:“一定会有所发现”。然而并没有,于是7号这天也水过去了。下面上第二天的代码(不全)
2020美赛C题思路(内附完整代码)_第2张图片

3月8日

8号老师基本上没和我说什么思路。但是我觉得划水怎么也得把论文写完,不然肯定吃不了兜着走,所以8号开始发力了。先上一些代码,下面的代码很简单,做的事就是看看销量最好的品牌的平均评分,是否能影响整个产品的平均评分。答案是当然的,不过你不能只是通过"如图所示",得有点数据说明,所以我计算了两条曲线的相关系数以及皮尔森系数
2020美赛C题思路(内附完整代码)_第3张图片
有一问是和产品声誉有关的,那么问题来了,什么是声誉,如何量化声誉?声誉就是口碑,怎么反应口碑?当然是看评分。不过问题又来了,因为存在不购买也可以评分的情况,因此可能会出现同行恶意刷差评以及自己请水军刷好评的现象,所以我给它们分别赋予一个权重,最终的加权平均数就定义为声誉。这个权重比较复杂,是动态的,假设黑粉数量>红粉数量,应该怎么做,红粉数量大于黑粉数量,又怎么做。下面直接上代码
2020美赛C题思路(内附完整代码)_第4张图片
后面还有一题是要找出潜在的,可能成功(或失败)的产品。那么问题来了,怎么定义潜在?怎么定义成功(失败)。我是这么想的,将各个品牌按照销量从小到大排序,排序处于1/4和3/4内的都是潜在品牌。1/4和3/4其实是统计学中比较常见的两个点,一个是下四分位数,一个是上四分位数,这俩数都是有具体意义的,但是我们可以先感性理解一下,假如一个产品的销量处于3/4,他还能叫做潜在吗,这明明就是很火的产品好么;假如一个产品的销量处于1/4,销量实在是太小了,可能也才10件左右,不可能看得出来潜力的。找出处于1/4和3/4的品牌后,画出它们的好评率和差评率,好评率高&差评率低的当然就是具有成功可能性的潜在产品;反之亦然。下面上代码(不全)
2020美赛C题思路(内附完整代码)_第5张图片

3月9日

有一道题是问,特定评分是否会引发更多评论。那就把一些特定的评分数量与评论数做个对比,看看有没有什么关系就行了

2020美赛C题思路(内附完整代码)_第6张图片

还有一问是问,一些特定的产品质量的词,是否和评分有关(具体题目我忘了,大意好像是这样)

我的做法是首先筛选出verified_purchased值为Y的所有数据,仅对这些数据进行分析。对于每个产品,分两种情况进行考虑,一是,看看好评都是些什么词,二是,看看差评都是些什么词。这里用了TF-IDF算法来提取关键词,然后画了两个词云

还有一些问题的思路懒得写了,这篇文章写到这的时候已经是8点了,中间眼皮打过无数次架。

赛后

感谢指导老师,感谢我的两个队友♥

下面放出摘要,具体细节自己慢慢看吧
2020美赛C题思路(内附完整代码)_第7张图片

你可能感兴趣的:(杂记,美国大学生数学建模竞赛)