当前位置 博文首页 > routing666的博客:【2020数模F奖】 美赛C题参赛感受及做题思路

    routing666的博客:【2020数模F奖】 美赛C题参赛感受及做题思路

    作者:[db:作者] 时间:2021-07-07 22:11

    ?

    目录

    ?

    写在前面的话

    题目分析

    【数据清洗】

    【NLTK】

    【第一题】

    【第2题e问】

    【词云】---wordcloud包

    【TF-IDF算法】

    【第2题a、b、c问】需要先对评论数值化

    【Textblob分析文本】

    【熵权法确定权重】

    【第2题 b、d问】

    【datetime库】

    【Matlab的ga函数求对数似然估计值】


    2021年2月2日更新

    想来是最近美赛快到了,各位学弟学妹们开始学习之前的题目,所以这篇文章开始有了评论私信要代码和论文的,我都没有回,在此表示抱歉,

    论文不是我写的,我觉得我没有权利给你们,非常抱歉!(卑微鞠躬)

    关键代码我自认为在博客里面写清楚了,要了我的代码也是差不多的,每个代码块所用到的知识我都给出相应链接了,自己再去搜一搜学学知道有什么功能、怎么用就可以了,大部分的代码实现我也都是比赛那几天才去学的。(^-^)V

    最后,祝各位旗开得胜,幸福快乐每一天~

    ------------------------------------------------分隔线------------------------------------------------------------------------

    写在前面的话

    本篇博文为博主参加完美赛两天后所写,是否获奖并不知道,模型不算太优秀,本篇只在编程手实现模型的角度来写,记录参赛过程中遇到的问题及解决方法、感受等,并给出相关的参考博客。完赛两天过去了,博主记忆力有点差,很多细节记不清了,就写个大概,方便日后自己看。。。

    --------------更新:已获F奖。第一次参加美赛,不出意外的话应该也会是最后一次参加的数模比赛,还是挺满意的---------------------

    【题目及所给数据】

    链接:https://pan.baidu.com/s/1nYMiLxLOVarIegT-Qs6ehg?
    提取码:j6vo

    或者你可以看这位朋友的博客:

    2020 MCM Weekend 2 Problem C,2020美赛C题——完整版题目:完整版题目
    2020 MCM Problem C Translation,2020美赛C题——详细版翻译:详细版翻译

    【参赛感受】(一堆废话)

    大三下啦,按队友的话说是数模比赛参加完一场就少一场了。之前参加国赛的时候,信誓旦旦地说“干完这一票老子再也不要搞数模了!”,哈哈哈哈哈哈哈哈哈哈,真香。最后还是好了伤疤忘了痛,跟着队友参加了。

    而且,这次比赛竟然莫名其妙地香!或许是因为在家闲太久,突然有这种充实的感受很是满意,或许是之前接触过一点简单的文本分析的内容,代码写起来比较顺利,又或许是因为大部分代码用的是python写的,debug的过程比matlab快上好几倍,少了很多自我怀疑的过程!(平时除了数模实在不会用到matlab,每次用都是时隔好久又生疏了)(python真是个好的语言!O(∩_∩)O !)

    完赛之后还是有些遗憾的。

    因为模型建的比较慢,中文版论文写完还得翻译成英文版的,再调格式什么的,最后论文很赶。图做好了,论文手来不及换上去,唉,好可惜。所以奉劝各位以后要参加美赛的朋友,论文一定要早点写啊,论文格式提前搞好呀!如果有时间,用Latex写据说会好点。

    为什么我们进度那么慢呢?我觉得一方面可能因为在家建模,大家前期有点松散了,另一方便可能是建模手受到我们指导老师的影响,反而乱了步调。怎么说呢,我们指导老师蛮负责的,只不过参加过数模的朋友应该清楚,模型一旦建出来实现出来,又要修改的话有时候挺花时间的。如果你的指导老师是在建模之前给你透解题思路,你可以好好考虑一下他的思路,如果是在你模型已经花时间想得差不过,并且已经在一定程度上实现出来的时候,就要好好斟酌一下了。老师给的意见能改则改,不能改,或者改需要花很多时间的花,就果断放弃吧。因为题目可能不止需要你建这一个模型!而且,如果你在其中一题上花太多心思,而导致论文没写完,可是连安慰奖都没有的!在博主水了几个数模比赛并得了几个水奖的经验来看,不管你的模型有多垃圾,多简单,多胡扯,只要你把所有题都完整地扯出来,并且有几个看起来还不错的结果,看起来还可以的图,并且论文没有太大的错误,得奖的可能性还是蛮大的!所以如果模型不好,就多在论文上花时间,把图搞得漂亮一点,无论如何,完赛就有希望!

    ?

    ?

    题目分析

    【再次提醒,我是以编程手的角度去理解的,解题思路并没有按题所给的顺序,着重在实现,不在原理】

    这个题目大概说的是有一个公司,打算卖吹风机、微波炉和奶嘴。然后丢给你一些亚马逊上的其他竞争对手们的评论(评论带星级等信息),让你去分析。帮他的公司制定销售计划和分析受欢迎的产品特性等。

    乍一看,我们以为会是经济类的题,因为我的两个队友都是经管学院的,所以觉得可能会比较擅长,就选了这题。

    但其实这题更多的还是得从自然语言处理的角度来分析。

    所给的评论信息如下:

    marketplacecustomer_idreview_idproduct_idproduct_parentproduct_titleproduct_categorystar_ratinghelpful_votestotal_votesvineverified_purchasereview_headlinereview_bodyreview_date??

    【数据清洗】

    • 对所有数据处理的题目,首先应该想的是数据的清洗,对不必要的信息进行筛除。
      • 我们建模手发现所给的吹风机评论中含有不算吹风机类的产品,所以首先要筛除这些信息。具体方法:我从product_parent中进行分词并还原词形,再找是否存在关键词,来简单判断是否为制定产品。
      • 另外题目给了评论的helpful votes 和total votes,所以还可以结合这个来筛选。
      • 顺便为后面的题做准备,可以给评论分别按照产品和星级分个类。
        • 词形还原的代码如下:

          有关词形还原具体可参考其他小伙伴的博客:https://blog.csdn.net/jclian91/article/details/8366171

    【NLTK】

    • 具体安装可以参看这篇博客:https://blog.csdn.net/gdkyxy2013/article/details/84787197
      • 另外python在自然语言处理上有一个最常用的库nltk,必须首先下载!这次建模最大的收获之一就是这个库了!真的爱了!简单介绍一下吧:

        NLTK,全称为Natural Language Toolkit,是一个自然语言处理工具包,是NLP研究领域常用的一个Python库,由宾夕法尼亚大学的Steven Bird和Edward Loper在Python的基础上开发的一个模块,至今已有超过十万行的代码。NLTK一个开源项目,其中包含数据集、Python模块、教程等;NLTK的功能主要有:分类、分词、标签、提取、解析、语义推理等。(NLTK的官方网站:https://www.nltk.org/)

    【第一题】

    【做了上面的准备之后,即可以开始做第一题啦】??

    第一题题目:?分析提供的三个产品数据集,以使用数学证据来识别,描述和支持有意义的定量和或定性模式,关系,量度和参数,这些数据将在有助于评估阳光公司的星级,评论和帮助等级之内和之间在三个新的在线市场产品中都取得了成功。

    这题可以做一个简单回归。(反正我们是这么做的)这一题主要是我队友做的,没什么代码,不讲了。

    清洗完数据以及对评论分类完之后,可以先做个词云看看。

    第2题e问

    (可以先用词云看个大概反正是个图,至少论文不会难看,就画呗)

    【词云】---wordcloud包

    具体:就是用根据星级分好类的三个数据,经过去停用词等操作之后分别画5个词云,然后大概能看出什么不同。

    部分代码:

    大概效果图:

    吹风机5星级词云:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1星级:

    ? ? ? ? ??

    ?对词云的学习,可以看一下这篇博客:https://blog.csdn.net/fly910905/article/details/77763086?

    【TF-IDF算法】

    画出词云只是看个大概,图个好看,其实什么卵用都没有。还是得详细分析的。比如,对评论进行分词、还原词形之后对瓷瓶进行统计。我参考了TF-IDF算法,不过只算出TF(Term Frequency)和DF(Document Frequency)。

    想了解TF-IDF算法,可查看这位小伙伴的博客:https://blog.csdn.net/asialee_bird/article/details/81486700

    这个代码没什么特别的:

    【第2题a、b、c问】需要先对评论数值化

    即对评论分析情感倾向。这一问题真的让我体会到python实在是太棒了!

    【Textblob分析文本】

    (快来看我发现了什么神奇玩意儿!!!)

    建模初期我一直在考虑怎么分析评论的情感,将评论数值化,一直在想用比较简单的基于词典的方法,通过看文本中正性词汇和负性词汇的占比来分析,但是一直找不到合适的词典,处理起来精确度也未知。后来!!偶然被我发现了一个python库,简直不要太方便!

    简单介绍一下:

    TextBlob是一个用python编写的开源的文本处理库,它可以用来执行很多自然语言处理的任务,比如,词性标注、名词性成分提取、情感分析、文本翻译等等
    git 网址:https://github.com/sloria/TextBlob
    官方文档:https://textblob.readthedocs.io/en/dev/

    代码特别简单:

    ?【注意这边得到的sentiment.polarity的范围在-1和1之间,数值越靠近-1表示句子所含情感越有可能是负面的,越靠近1表示句子所含情感更有可能为正面情感】

    OK,评论数据化之后,接下来的事情就好办了!

    ?

    熵权法确定权重

    具体可参考文章:https://zhuanlan.zhihu.com/p/28067337

    代码:

    确定完星级和评论的权重之后,可以再结合helpful votes、vine, 结合类似时间序列的方法,去建模,得到产品的声誉值。

    然后可以根据这个值去画图,去分析产品的成功失败的走向啊什么的。

    比如我们画出的图大概长这样:

    然后再去找其中较典型的 去分析。

    代码比较简单

    其中,画图要用到:matplotlib 库

    from matplotlib import pyplot as plt
    
    .........
    
    
        plt.plot(x,WOM,'b-.o')
        plt.xlabel('time')
        plt.ylabel('value')
        ti = 'Value curve of hair dryer '+pro
        plt.title(ti)
        plt.savefig(f2)
        plt.close()

    注意,到这一步之前,我们都没有用到所给的日期。

    【第2题 b、d问】

    首先先处理一下时间,让它更好计算

    【datetime库】

    计算时间差并将时间数值化。

    (这个库用来计算时间超方便哦!)

    b题我们建模手用了个Hawkes过程中的强度函数。就是声誉随时间的变化(本质上这个指标时单位时间发生评论次数,可以抽象的看做是产品声誉越高,这个产品销量越大,评论的人越多)

    (至于这个Hawkes具体是什么我也不懂,反正实现就是了!你们自己去搜它的原理吧)

    【Matlab的ga函数求对数似然估计值】

    对于Hawkes模型中的参数,我们要通过对数似然估计(不要问我为什么,建模手告诉我的)

    (看我又发现了什么神奇的玩意儿!)

    (matlab的ga()实现遗传算法,超方便,建议大家去看看!想起人工智能课上用C++手写遗传算法长长的代码!)

    代码:(matlab)

    function y = fu(x,t)       
        n = size(t,1);
        if x(1)>x(2)
            y=Inf;        
        else        
            a = (x(1)/x(2))*sum(exp(-x(2)*(t(n)-t))-1);    
            b = log(x(3));
            for i = 2:n
                c = 0;
                for j = 1:i-1
                    c = c+exp(-x(2)*(t(i)-t(j)));
                end
                b = b +c;
            end
            y = -x(3)*t(n)+a+b;
            y = -y;
        end
    end
    function x = get_parameter(t)
        lb = zeros(3,1);
        ub = ones(3,1);
        fun = @(x)fu(x,t);
        x=ga(fun,3,[],[],[],[],lb,ub);
    end
    function y=get_numda(t)
        x = get_parameter(t);
        n = size(t,1);
        t1 = zeros(n,1);
        t1(1) = 0;
        for i = 2:n
            a = 0;
            for j = 1:i-1
                a = a+x(1)*exp(-x(2)*(t(i)-t(j)));
            end
            t1(i) = a;
        end
        y = x(3)+t1;        
    end

    求出这个值之后再画出随时间变化的图,然后再去找其中较典型的 去分析,如下:

    【d问】我们模型也比较简单,就是算出评论后面的5天的平均评论间隔时间,然后再算他与星级的相关性。matlab 有个相关性函数,可以直接算。得到每个产品的相关性之后再看一下置信区间。初步判断星级与评论之间是否有关系。

    然后再对每个星级的评论算一次未来5天平均评论间隔,再做分析。

    (这个代码蛮无聊的,我写得真乱,不贴了)

    matlab相关性计算:用corrcoef()函数

    【感谢我的论文手和建模手,他们都超棒的,只有我是垃圾T_T。希望她们都能保上自己喜欢的学校。也希望我能一战上岸!】

    cs