精华内容
下载资源
问答
  • 常见文本相似度计算方法简介

    千次阅读 2020-04-25 20:51:16
    本文首发于知乎(https://zhuanlan.zhihu.com/p/88938220),主要介绍了文本相似度计算的基本思路和常用方法

    0引言

    在自然语言处理任务中,我们经常需要判断两篇文档是否相似、计算两篇文档的相似程度。比如,基于聚类算法发现微博热点话题时,我们需要度量各篇文本的内容相似度,然后让内容足够相似的微博聚成一个簇;在问答系统中,我们会准备一些经典问题和对应的答案,当用户的问题和经典问题很相似时,系统直接返回准备好的答案;在监控新闻稿件在互联网中的传播情况时,我们可以把所有和原创稿件相似的文章,都看作转发,进而刻画原创稿件的传播范围;在对语料进行预处理时,我们需要基于文本的相似度,把重复的文本给挑出来并删掉……总之,文本相似度是一种非常有用的工具,可以帮助我们解决很多问题。

    这里对计算文本相似度涉及的模型和算法,进行简要的整理。

    1文本相似度计算任务的简单分析

    文本的相似性计算,是我们常说的“文本匹配任务”的一种特殊情况。

    1.1任务目标

    一般来说,文本相似度计算任务的输入,是两篇文档,比如表1-1的前两个句子;输出是两篇文档的相似程度,通常用[0,1]区间内的小数来表示。作为一个懂人话的人类,我知道句子1和句子2的内容是一样的,并认为计算二者的相似性非常简单。

    假如说,我们要判断1万对文档的相似性,或者在1秒内判断100对文档的相似度呢?那我就不行了,需要上机器。

    大家在生活里和可能已经用到了文本相似度计算支持的东西。很多产品(APP,网站,导游机器人等等)配备了问答系统,允许用户用自然语言向系统发出各种请求。系统会理解用户的语言,然后返回一定形式的内容并展示在终端展里,作为对用户的回答。有些问题比较经典,大家经常问到。工程师或者领域专家会把这些问题和对应的答案收集并存储起来——当用户再次问到类似的问题时,直接返回现成的答案即可。“类似”与否的判断,需要使用文本相似度计算来支持。

    那么,如何让机器替我们完成文本相似度的计算呢?

    表1-1 我对机器人说的话

    序号

    问句

    问题答案pairs

    问句

    答案

    1

    我想去厕所

    厕所位置是哪里?

    左手边直走30米。请看我的地图…

    2

    撒尿哪里走?

    3

    请问卫生间在哪里?

    4

    请问厕所在哪里?

    5

    饿死了,有啥建议啊?

    附近的餐厅在哪里?

    左手边直走31米。请看地图…

     

    1.2候选方案

    文本相似度计算方法有2个关键组件,即文本表示模型和相似度度量方法,如表1-2。前者负责将文本表示为计算机可以计算的数值向量,也就是提供特征;后者负责基于前面得到的数值向量计算文本之间的相似度。

    从文本表示模型和相似度度量方法中选择合适的,就可以组合出一个文本相似度计算方案。

    表1-2 常见的文本表示模型和相似度度量方法

    文本表示模型

    相似度度量方法

    文本切分粒度

    特征构建方法

    原始字符串

    ngram

    词语

    句法分析结果

    主题模型

     

     

    TF

    TF-IDF

    句向量

    词向量

    Simhash

     

     

    最小编辑距离

    欧氏距离

    余弦距离

    杰卡德相似度

    海明距离

    分类器

     

    使用这个菜单里的选项,我们可以组合出非常多的文本相似度计算方案。那么,每一种方案都可以用来解决什么样的任务呢?要回答这个问题,需要了解一下每一个组件的原理和特点。

     

     

    2有监督和无监督的文本相似性计算

    文本相似度计算方法分为有监督和无监督两类。

    有监督方法,就是用朴素贝叶斯分类器之类的有监督模型来判断文本相似性或者计算相似度。这类方法要求有一定数量的标注语料,构建的代价比较高;由于训练语料通常无法做得很大,模型的泛化性不够,实际用起来会有点麻烦;距离计算环节的复杂度会比较高。

    无监督方法,就是用欧氏距离等方法,直接计算文本之间的距离或者相似度。这类方法的特点是:不需要标注语料,特征工程或者参数估计可以使用很大的数据;很多方法对语言的依赖比较小,可以应对多语种混杂的场景;距离计算环节复杂度较低。

    通常来说我们首先考虑无监督模式。

    3文本切分粒度

    3.1n-gram

    我们常说的“n-gram语言模型“,指的是一类使用相同文本切分方式的语言模型。这种切分方式非常简单:使用一个长度为n的窗口,从左到右、逐字符滑过文本;每一步,会框到一个字符串,就是一个gram;文本里所有的gram就是该文本的切分结果。如表3-1所示,是几种常见的n-gram切分结果。

    表3-1 “我爱北京天安门”的n-gram表示

    序号

    N取值

    名称

    切分示例

    1

    1

    unigram

    我/爱/北/京/天/安/门

    2

    2

    bigram

    我爱/爱北/北京/京天/天安/安门

    3

    3

    trigram

    我爱北/爱北京/北京天/京天安/天安门

     

    n-gram越长,词表越大。一份中文语料的Trigram词表可以达到上百万的规模。要是来个quadgram,由于内存消耗较大、特征很稀疏,我们的工作会很难开展。

    3.2分词

    另外一种文本切分方式就是分词,比如将“我爱北京天安门”切分为“我/爱/北京/天安门”。分词的目的是将文本切分为有句法意义的一个个小单元,便于人和机器理解文本的内容。

    在NLP进入深度学习时代之前,分词是中文信息处理的基础任务。语言这种序列数据,具有很强的时间/空间相关性。在一段文本序列的某些位置,会出现相关性特别高的若干连续字符,比如“我爱北京天安门”里的“天安门”,这3个字符内部之间的相关性明显高于它们同其他字符的相关性。

    相比n-gram,分词的优势是,在字符相关性较小的位置进行切分、造成的信息损失比较小。由于分词降低了文本的相关性,可以提升一些带有独立性假设的模型。

    当然,ngram由于极高的计算速度,仍然占有一定的市场。

    3.3句法分析

    我们可以基于句法分析的结果,从文本中抽取短语,作为文本的表示。这样得到的特征非常稀疏,适合精度要求较高的场景。

    3.3.1粗暴版句法分析

    我们可以用一些规则或者模型,从文本中提取特定的词语组合,作为文本的切分结果。比如用“第一个名词+第一个动词+第二个名词”这个规则处理“我爱北京天安门”的结果是“我+爱+北京”。

    3.3.2正经句法分析

    可以使用正经的句法分析工具,提取“主+谓+宾”之类的,作为文本的切分结果。句法分析的耗时比较高,适合数据量小的场景。

    3.4主题模型

    可以使用主题模型来提取文本的主题,用主题词来表示文本。常见的主题模型有PLSA、LDA以及它们的变种(LSA适用于教学场景;还有很多优秀的主题模型,所知甚少,不多介绍)。主题模型在训练的过程中,学习到了语料的全局信息,因此具有一定的“联想”或者说“推理”能力,可以基于文档内容推测出文档字面没有明说的一些信息。因此,主题模型可以处理一些需要关注隐藏信息的场景。

    当然了,主题模型的训练比较慢、对语料规模和质量有较高的要求,因此考虑是否使用的时候需要慎重。

    4特征构建方法

    文本相似度计算任务的第二步,是用数值向量表示文本的内容。通常,我们会用一个数值向量描述文本在语义空间中的位置。

    4.1TF与TF-IDF

    4.1term frqeuncy向量

    词袋模型(bag of words)假设,文本里的term(虽然名字里是”words”,实际上我们也可以用n-gram之类的切分方式)之间相互独立,也就是词语A的出现和词语B的出现没有关系。

    我们可以用独热编码表示所有的term,然后对文本中的term去重,最后把得到的term的编码加起来,就得到了TF向量。

    TF向量对常用词比较友好。假设有一份红学文集构成的语料,里面“红楼梦”“贾宝玉”这样的词语几乎会出现在每一篇文档里,相应的频率还很高。结果就是这样的词语“统治”了TF向量,导致两篇文档比较相似。换句话说,TF对文档的区分能力比较低。

    4.2词向量和句向量

    4.3simhash

    4.3.1simhash简介

    Simhash是敏感哈希算法在文本特征提取任务中的应用。它会把一篇文档映射为一个长度为64、元素值为0或1的一维向量。这样我们就可以使用某种距离计算方式,计算两篇文本的距离和相似度了。一般来说,与simhash配合的是海明距离。

    4.3.2simhash的适用场景

    Simhash的特点是,对文本的“相同”与否特别敏感:当两篇文档相同时,相似度为1;当其中一篇略有不同,相似度会有明显降低。因此非常适合用来判断两篇文档内容是否相同。

    另外simhash的计算比较简单,速度上有一定优势。如果配合一定的检索策略来召回候选相似文档,simhash可以用来对海量文档进行去重——这就是simhash最常见的一个应用场景。

    5距离的度量方式

    假设表1-1的3句和4句分词结果分别为:

    5.1欧氏距离

    5.1.1欧氏距离的计算方法

    假设我们有两个数值向量,表示两个实例在欧式空间中的位置:

     

    二者的欧氏距离是这样计算的:

     

    如图5-1,二维空间(平面)里有两个点 和   。二者在X轴上的差异大小是 ,在Y轴上的差异是  。综合两个坐标轴上的差异,就得到了两点之间的距离:   。

    欧式距离是最符合我们直觉的一种距离度量方式。它认为事物的所有特征都是平等的。两个实例在所有维度上的差异的总和,就是二者的距离。

     

    图5-1 二维空间中的两个点的距离

     

    5.1.2基于欧式距离的文本相似度计算

    假设我们的词汇表是(部分词语在特征选择中删掉了):

    那么两个句子对应的TF向量分别是:

    二者的欧氏距离为:

    这样,我们就可以计算相似度了,常用的方式是:

     

    分母中的”1”用来保证相似度最高是1。当然,相似度可以根据场景要求花式定义。

    5.2余弦距离

    5.2.1余弦距离的计算方式

    余弦距离来源于向量之间夹角的余弦值。假设空间中有两个向量:

    那么二者的夹角的余弦值等于:

    这个计算方式是可以推导出来的——由于形式简单,我们可以把它当做勾股定理这样的知名定理来对待。如图5-2,是二维平面上,两个向量之间夹角的示意图,我们可以基于勾股定理凑出上面的式子。

    图5-2 二维空间中两个向量的夹角

    5.2.2基于余弦距离的文本相似度

    向量的夹角余弦值可以体现两个向量在方向上的差异,因此我们可以用它来度量某些事物的差异或者说距离。

    在文本相似度计算任务中,为了让数据适合余弦夹角的概念,人们假想:语义空间中存在一个“原点”;以原点为起点、文本特征数组(这里为了避免与“语义向量”混淆,借用了“数组”这个名称)表示的点为终点 ,构成了一个向量,这就是代表了文本语义的“语义向量”。语义向量的方向,描述了文本的语义。因此,我们可以用两篇文档的语义向量的夹角余弦值来表示它们的差异。这个余弦值通常被称为“余弦距离”。

    提取文本特征后,可以将数值向量套入前面的余弦值计算公式,既可以得到两篇文本的余弦距离:

    余弦值的取值范围是[0,1],我们可以用一个简单的方式得到余弦相似度:

     

    当文本特征维度比较高的时候,在余弦距离的视角下,文本之间的区分度越来越小。

    这导致我们在设定“是否相同”的阈值时,遇到困难。因此余弦距离比较适用于文本较短,也就是特征维度较低的场景。

    5.3Jacard相似度

     

    5.3.1杰卡德相似度的计算方式

    杰卡德相似度一般被用来度量两个集合之间的差异大小。假设我们有两个集合A和B,那么二者的杰卡德相似度为:

    杰卡德距离的思想非常简单:两个集合共有的元素越多,二者越相似;为了控制距离的取值范围,我们可以增加一个分母,也就是两个集合拥有的所有元素。

    5.3.2基于杰卡德相似度的文本相似度计算

    我们可以把文档看做是词语的集合,然后用杰卡德距离相似度度量文档之间的差异。

    words3={"请", "问","卫生间","在","哪里", "?"}

    words4={"请", "问","厕所","在","哪里", "?"}

     

    表1-1的3句和4句的杰卡德相似度就是:

     

    我们可以基于这个距离计算得到杰卡德距离:

     

    5.3.3杰卡德相似度的改装

    我的同事兰博同学认为,杰卡德相似度忽略了文本长度差异。“我让你三掌!”和“我让你三掌!我让你三掌!我让你三掌!”这两句话,使用杰卡德相似度得到的相似度是1,即完全相同。事实上,二者的含义还是略有区别的(一般来说,重要的事情才需要说三遍)。如何区分这两句话呢?

    他的解决思路是,在杰卡德相似度的分母增加一个对文本长度差异的惩罚:

    式中α是一个超参数,可以根据相似度的效果调试大小。

    5.4海明距离

    海明距离是simhash算法的御用距离算法。

    5.4.1海明距离的计算方式

    海明距离的计算方式非常简单。如5.1.1所述,两个句子可以用词袋模型来表示:

    我们比较两篇文档的特征向量的每一个维度,判断各个维度上取值是否相等。不相等的维度越多,两篇文档差异越大。海明距离的计算方式如下:

    其中,

    5.4.2基于海明距离的文本相似度

    换个角度,两篇文档的特征向量里,相等的维度越多,相似度就越大。相似度的计算方法如下:

    s 

    其中,

    5.5最小编辑距离

    最小编辑距离是一种经典的距离计算方法,用来度量字符串之间的差异。它认为,将字符串A不断修改(增删改)、直至成为字符串B,所需要的修改次数代表了字符串A和B的差异大小。当然了,将A修改为B的方案非常多,选哪一种呢?我们可以用动态规划找到修改次数最小的方案,然后用对应的次数来表示A和B的距离。

    从定义上可以看出,最小编辑距离比较适合判断字面上的相似性,对文本字语义上的相似性无能为力。

    6结语

    相似度计算不光在文本数据处理里经常用到,在图像、音频、生物信息等等类型数据的处理中也有很高的出场率。对应地,相似度计算可以帮助我们解决生产活动里的很多具体问题。因此,它是一种非常有用的方法,值得我们仔细琢磨。

    判断事物之间的相似性,是我们需要和喜欢的一种活动。我们在生活中,无时不刻在进行着一种活动:判断接触到的事物是否从未见过;如果没见过,就会思考哪些已知的东西和它类似;如果它太独特、可借鉴的经验很少,就认为它是一种新的事物;如果有很多类似的已知事物,我们会基于经验对它分析一波,并在这个基础上快速地加以了解。

    最近查找资料的时候,发现一些朋友未经我的允许,也未注明转载来源,直接使用了我的文章——更可气的是,还是以“原创”的名义。这种侵犯知识产权的事情,以前、现在和以后会一直发生。比如我当年没少下载各种免费的音乐资源。今后几年我国会大力建设知识产权保护环境,大家的知识产权意识也会提升,这种情况应该会越来越少。

     

    展开全文
  • 文本分类-特征选择方法

    千次阅读 2017-10-20 17:56:27
    文本分类-特征选择方法 一、概念 ... 特征词选择和特征词权重 ... 常见的且基础的文本特征选择的算法基于文档频率(DocumentFrequency)、信息增益(InformationGain,IG)、开方拟和检验方法(CHI统计)、互信息(mut

    文本分类-特征选择方法


    一、概念

       特征词选择和特征词权重

       1.特征词选择:特征词选择是为了降低文本表示的维度,而特征词权重是为了表示文本表示中每一个特征项的重要程度。

       常见的且基础的文本特征选择的算法有基于文档频率(DocumentFrequency)、信息增益(InformationGain,IG)、开方拟和检验方法(CHI统计)、互信息(mutualInformation)、潜在语义分析LSA、期望值交叉算熵、文本证据权、termstrength(TS)、GSSCoefficient、oddsratio。

       

       2.特征词权重:每一个特征项的重要程度

       常见的算法:TF-IDF,TF的改进,信息熵的引用

     

       3.区别:特征词选择是为了降低文本表示的维度,而特征词权重是为了表示文本表示中每一个特征项的重要程度。

     

    二、特征选择方法总结

       1.文档频率

       词条的文档频率(document frequency)是指在预料中出现该词条的文档的数目。只有当某词条在较多的文档中出现时才被保留下来,DF值低于某个阈值的词条是低频词,将这样的词条从原始特征空间中移除,不但能够降低特征空间的维数,而且还有可能提高分类的精度。

        DF是一种最简单的词约简技术,由于具有相对于预料规模的线性复杂度,所以它能够容易地被用于大规模的语料特征选择中。

        缺点:对低文档频的特征项不可靠,而且不能说明词条和类别的相关性

       2.互信息

       在互信息算法中,采用计算特征词 t 和类别 c 之间的相关度:


    其中, A 为在类别 c 中特征词 t 出现的文档数; B 为在除了类别 c 的其他类别中特征词 t 出现的文档数; C 为在类别 c 中特征词 t 未出现的文档数; N 为所有类别中的文档数的总和。如果共有 m 个类别,那么每个特征词将得到 m 个相关度值,取这 m 个值的平均值作为每个特征词的权值,权值大的特征词被保留的可能性大。

        

       3. 信息增益

       信息增益 (IG) 是公认较好的特征选择方法,它刻画了一个词语在文本中出现与否对文本情感分类的影响,即一个词语在文本中出现前后的信息嫡之差。某个词语的信息增益值越大,说明它对分类的贡献就越大。信息增益的计算见公式:



    P(Ci) ,表示类别 Ci 出现的概率,其实只要用 1 除以类别总数就得到了(这是说你平等的看待每个类别而忽略它们的大小时这样算,如果考虑了大小就要把大小的影响加进去)。

    P(t) ,就是特征 t 出现的概率,只要用出现过 t 的文档数除以总文档数就可以了

    P(Ci|t) 表示出现 t 的时候,类别 Ci 出现的概率,只要用出现了 T 并且属于类别 Ci 的文档数除以出现了 T 的文档数就可以了

       缺点 :信息增益最大的问题还在于它只能考察特征对整个系统的贡献,而不能具体到某个类别上,这就使得它只适合用来做所谓 “ 全局 ” 的特征选择(指所有的类都使用相同的特征集合),而无法做 “ 本地 ” 的特征选择(每个类别有自己的特征集合,因为有的词,对这个类别很有区分度,对另一个类别则无足轻重)。

     

       4. 开方拟和检验方法 (CHI 统计 ) 

       开方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否


       5. 潜在语义分析LSA

       LSA思想方法最初应用于文本信息检索领域有效地解决了同义词和多义词的问题,通过识别文本中的同义词, LSA将信息检索精度提高了10%--30%

       随着应用领域的不断拓展, LSI在信息过滤、信息分类/聚类、交叉语言检索、信息理解、判断和预测等众多领域中得到了广泛的应用。(语义,降维)






    展开全文
  • 一、概念 二、特征选择方法总结   一、概念 ... 常见的且基础的文本特征选择的算法基于文档频率(DocumentFrequency)、信息增益(InformationGain,IG)、开方拟和检验方法(CHI统计)、互信息(mutua...

    一、概念

    二、特征选择方法总结

     

    一、概念

       特征词选择和特征词权重

       1.特征词选择:特征词选择是为了降低文本表示的维度,而特征词权重是为了表示文本表示中每一个特征项的重要程度。

       常见的且基础的文本特征选择的算法有基于文档频率(DocumentFrequency)、信息增益(InformationGain,IG)、开方拟和检验方法(CHI统计)、互信息(mutualInformation)、潜在语义分析LSA、期望值交叉算熵、文本证据权、termstrength(TS)、GSSCoefficient、oddsratio。

       

       2.特征词权重:每一个特征项的重要程度

       常见的算法:TF-IDF,TF的改进,信息熵的引用

     

       3.区别:特征词选择是为了降低文本表示的维度,而特征词权重是为了表示文本表示中每一个特征项的重要程度。

     

    二、特征选择方法总结

       1.文档频率

       词条的文档频率(document frequency)是指在预料中出现该词条的文档的数目。只有当某词条在较多的文档中出现时才被保留下来,DF值低于某个阈值的词条是低频词,将这样的词条从原始特征空间中移除,不但能够降低特征空间的维数,而且还有可能提高分类的精度。

        DF是一种最简单的词约简技术,由于具有相对于预料规模的线性复杂度,所以它能够容易地被用于大规模的语料特征选择中。

        缺点:对低文档频的特征项不可靠,而且不能说明词条和类别的相关性

       2.互信息

       在互信息算法中,采用计算特征词 t 和类别 c 之间的相关度:

       其中, A 为在类别 c 中特征词 t 出现的文档数; B 为在除了类别 c 的其他类别中特征词 t 出现的文档数; C 为在类别 c 中特征词 t 未出现的文档数; N 为所有类别中的文档数的总和。如果共有 m 个类别,那么每个特征词将得到 m 个相关度值,取这 m 个值的平均值作为每个特征词的权值,权值大的特征词被保留的可能性大。

        

       3. 信息增益

       信息增益 (IG) 是公认较好的特征选择方法,它刻画了一个词语在文本中出现与否对文本情感分类的影响,即一个词语在文本中出现前后的信息嫡之差。某个词语的信息增益值越大,说明它对分类的贡献就越大。信息增益的计算见公式:

       P(Ci) ,表示类别 Ci 出现的概率,其实只要用 1 除以类别总数就得到了(这是说你平等的看待每个类别而忽略它们的大小时这样算,如果考虑了大小就要把大小的影响加进去)。

       P(t) ,就是特征 t 出现的概率,只要用出现过 t 的文档数除以总文档数就可以了

       P(Ci|t) 表示出现 t 的时候,类别 Ci 出现的概率,只要用出现了 T 并且属于类别 Ci 的文档数除以出现了 T 的文档数就可以了

       缺点 :信息增益最大的问题还在于它只能考察特征对整个系统的贡献,而不能具体到某个类别上,这就使得它只适合用来做所谓 “ 全局 ” 的特征选择(指所有的类都使用相同的特征集合),而无法做 “ 本地 ” 的特征选择(每个类别有自己的特征集合,因为有的词,对这个类别很有区分度,对另一个类别则无足轻重)。

     

       4. 开方拟和检验方法 (CHI 统计 ) 

       开方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否

     

       5. 潜在语义分析LSA

       LSA思想方法最初应用于文本信息检索领域有效地解决了同义词和多义词的问题,通过识别文本中的同义词, LSA将信息检索精度提高了10%--30%

       随着应用领域的不断拓展, LSI在信息过滤、信息分类/聚类、交叉语言检索、信息理解、判断和预测等众多领域中得到了广泛的应用。(语义,降维)

     

    展开全文
  • 自然语言处理中一个很常见的操作就是文本分类,比如一组新闻文本,通过分类模型,将新闻文本分为政治、体育、军事、娱乐、财经等等几大类。那么分类第一步就是文本向量化,前一篇博客讲了一些,本文可以说是前文的...

           自然语言处理中一个很常见的操作就是文本分类,比如一组新闻文本,通过分类模型,将新闻文本分为政治、体育、军事、娱乐、财经等等几大类。那么分类第一步就是文本向量化,前一篇博客讲了一些,本文可以说是前文的实践版本。本文主要介绍一些常见的文本分类模型,说是介绍,其实主要以代码和结果为主,并不会详细的介绍每个算法的思想、原理、推导过程等,那样的话,估计可以写一个7、8篇的系列了,另外我也发现很多博客都是理论为主,代码非常少,给人的感觉就是这件事我弄明白了,但具体如何干不知道,讲的似乎很难、很神秘,没有相应代码,让人望而生畏。所以本文还是偏工程一些,阅读本文的同学希望已经有了这些文本分类算法的理论基础。先说说我用的数据,约20万短文本,包含8个大类,分别为:餐饮、交通、购物、娱乐、居家等,每个大类约25000条数据,文本平均20个字左右,最短的文本仅有2个字。如下面所示:

    __label__1    天猫 超市 慕滋 五谷 无 添加 糖 粗粮 杂粮 消化 饼干 g 代 早餐 糕点
    __label__1    天猫 超市 满 减 云南 红 提 kg 提子 葡萄 新鲜 水果
    __label__1    天猫 超市 原装 进口 嘘 嘘 乐 成长 裤 纸尿裤 拉拉 裤 L19 片 Kg
    __label__1    天猫 超市 卫龙 小 面筋 g 零食 辣条 辣片 麻辣 素食 豆干 制品 大刀 肉
    __label__1    天猫 超市 康师傅 矿物质 水 ml 瓶 整箱 饮用水
    __label__1    天猫 超市 红牛 维生素 功能 饮料 整箱 装 原味 型 ml 罐 箱
    __label__1    天猫 超市 香楠 蛋羹 味 麻薯 夹心 麻 糬 糕点 休闲 零食 小吃 g
    __label__1    天猫 超市 蒙牛 特仑苏 醇 纤 牛奶 ml 盒 平衡 搭档 平衡 好搭档
    __label__1    天猫 超市 味全 每日 C 纯 果汁 胡萝卜 果蔬汁 ml16 截单
    __label__1    天猫 超市 金 菜地 豆干 五香 茶 干 g 豆腐干 特色 休闲 零食 豆制品
    __label__1    天猫 超市 新 希望 牛奶 香蕉 牛奶 ml 盒 箱 甜蜜 好 滋味
    __label__1    天猫 超市 良品 铺子 爆浆 麻薯 抹 茶味 g 糕点 点心 零食 特产 小吃
    __label__1    天猫 超市 森永 嗨 酸酸 哒 酸果 软糖 青 柠味 g 维 c 水果 糖果 零食
    __label__1    天猫 超市 桂格 即食 纯 燕麦片 粗粮 原味 冲 饮 谷物 早餐 g 袋装
    __label__1    天猫 超市 满 减 挪威 冰冻 青花鱼 柳 g 包 冷冻 海鲜 鱼肉 鲭 鱼
    __label__1    天猫 超市 甘 竹牌 豆豉 鲮鱼 罐头 g 盒 下 饭菜 特产 小吃 休闲 食品
    __label__1    天猫 超市 姚 太太 青口 梅 g 蜜饯 果脯 话梅 肉 梅子 青梅 酸甜 凉果
    __label__1    天猫 超市 蒙牛 特仑苏 醇 纤 牛奶 ml 盒 平衡 搭档 平衡 好搭档

           很多文本内容都是淘宝体,也就是商品标题,当然上面仅仅是个示例。我这里已经分好词,并且为了方便后面使用fastText分类模型,已经按照fastText格式做了排版,也就是第一项__label__1是标签, 后面是文本正文,这个训练集需要人工标记好,这是一件费时费力的事情。下面是不同分类模型代码,因为加了注释,所以这里就不一一解释了。
    import random
    import fasttext
    import numpy as np
    import tensorflow as tf
    from sklearn.svm import SVC
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
    
    # 朴素贝叶斯算法
    def nb_model(train, train_label, test, test_label):
        clf_model = MultinomialNB(alpha=0.01)
        clf_model.fit(train, train_label)
        predict_results = clf_model.predict(test)
    
        count = 0
        predict_list = predict_results.tolist()
        for i, pred in enumerate(predict_list):
            if (pred == test_label[i]):
                count += 1
    
        print("nb_model_precision_score: " + str(float(count) / len(predict_list)))
    
    
    # K近邻算法
    def knn_model(train, train_label, test, test_label):
        knn_model = KNeighborsClassifier(n_neighbors=8)
        knn_model.fit(train, train_label)
        predict_results = knn_model.predict(test)
    
        count = 0
        predict_list = predict_results.tolist()
        for i, pred in enumerate(predict_list):
            if (pred == test_label[i]):
                count += 1
    
        print("knn_model_precision_score: " + str(float(count) / len(predict_list)))
        
    
    # 支持向量机算法
    def svm_model(train, train_label, test, test_label):
        svm_clf = SVC(kernel="linear", verbose=False)
        svm_clf.fit(train, train_label)
        predict_results = svm_clf.predict(test)
    
        count = 0
        predict_list = predict_results.tolist()
        for i, pred in enumerate(predict_list):
            if (pred == test_label[i]):
                count += 1
    
        print("svm_model_precision_score: " + str(float(count) / len(predict_list)))
            
    
    # 使用传统方法的文本分类
    def text_classification():
        count = 0
        test_text_list = []
        train_text_list = []
        test_label_list = []
        train_label_list = []
        total_text_list = []
        total_label_list = []
    
        print("start loading data...")
        finput = open("data/filter_total_half.txt", encoding='utf-8')
        for line in finput:
            count += 1
            text_array = line.split("\t", 1)
            if (len(text_array) != 2):
                continue
    
            # 保存全部样本
            total_text_list.append(text_array[1])
            total_label_list.append(text_array[0])
    
            # 划分训练集和测试集
            probability = random.random()
            if (probability > 0.2):
                train_text_list.append(text_array[1])
                train_label_list.append(text_array[0])
            else:
                test_text_list.append(text_array[1])
                test_label_list.append(text_array[0])
        finput.close()
        print("load data is finished...")
    
        print("start building vector model...")
        # 构建词典
        vec_total = CountVectorizer()
        vec_total.fit_transform(total_text_list)
    
        # 基于构建的词典分别统计训练集/测试集词频, 即每个词出现1次、2次、3次等
        vec_train = CountVectorizer(vocabulary=vec_total.vocabulary_)
        tf_train = vec_train.fit_transform(train_text_list)
    
        vec_test = CountVectorizer(vocabulary=vec_total.vocabulary_)
        tf_test = vec_test.fit_transform(test_text_list)
    
        # 进一步计算词频-逆文档频率
        tfidftransformer = TfidfTransformer()
        tfidf_train = tfidftransformer.fit(tf_train).transform(tf_train)
        tfidf_test = tfidftransformer.fit(tf_test).transform(tf_test)
        print("building vector model is finished...")
    
        # 朴素贝叶斯算法
        nb_model(tfidf_train, train_label_list, tfidf_test, test_label_list)
        # K近邻算法
        knn_model(tfidf_train, train_label_list, tfidf_test, test_label_list)
        # 支持向量机算法
        svm_model(tfidf_train, train_label_list, tfidf_test, test_label_list)
        print("building predict model is finished...")
        
        
    # 使用fastText的文本分类
    def fastText_model():
        foutput_test = open("data/data_test.txt", 'w', encoding='utf-8')
        foutput_train = open("data/data_train.txt", 'w', encoding='utf-8')
        with open("data/filter_total_half.txt", encoding='utf-8') as finput:
            for line in finput:
                probability = random.random()
                if (probability > 0.2):
                    foutput_train.write(line.strip() + "\n")
                else:
                    foutput_test.write(line.strip() + "\n")
        foutput_train.flush()
        foutput_train.close()
        foutput_test.flush()
        foutput_test.close()
        
        classifier = fasttext.supervised("data/data_train.txt", "data/cooking_fasttext_bkk.model", 
                              label_prefix="__label__", lr=0.25, dim=100,
                              silent=False, epoch=25, word_ngrams=3, loss="hs", bucket=2000000)
        
        result = classifier.test("data/data_test.txt")
        print(result.precision)
    
    
    if __name__ == '__main__':
        print("\n传统方法文本分类...")
        text_classification()
        print("\n----------------------------------------------\n")
        print("FastText文本分类...")
        fastText_model()

           程序运行结果如下:


           我还写了一个基于卷积神经网络的版本,修改自github,由于公司也有在用,这里就不把代码贴出来了。总体看,cnn的准确度最高,fastText次之。不过基于cnn的方法,需要事先训练词向量,训练过程也比较慢。而传统方法,如svm,准确度达0.95,已经很高了,从这一点也说明,不管是基于深度学习的卷积神经网络分类方法,还是传统的分类方法,其实模型反而是其次,最重要的是数据集的质量,模型选择和模型调参,对最终精度提升都是小幅度的,而数据集的质量高低则是精度提升的瓶颈,有时真得不怕麻烦,整理出一份高质量的数据集,才能训练出精度更准、召回更高的模型。看到这里,是不是很多同学觉得文本分类其实没什么神秘的,有现成的训练框架使用,如:sklearn,还有那么多文献资料可供查阅,唯独没有适合自己业务的训练集,整理训练集,这可能是整个模型训练过程中最花时间的事情了。当然,这里面也涉及很多模型调参细节,需要深入算法原理才能真正玩转。



    展开全文
  • Qt之常见文本的编辑操作

    千次阅读 2018-12-29 09:37:05
    在使用Qt编辑和处理文本文档时,开发人员...本文概述了使用富文本类执行这些任务的一些更常见方法,展示了可以在您自己的应用程序中重用的方便模式。 1、使用QTextEdit处理富文本 2、对文本进行选择:QTextCu...
  • 文本分类方法总结

    万次阅读 2020-01-17 15:01:42
    1 机器学习的文本分类方法 1.1 特征工程 1.1.1 文本预处理 1.1.2 文本表示和特征提取 1.1.3 基于语义的文本表示 1.2 分类器 朴素贝叶斯分类(Naïve Bayes) 用朴素贝叶斯分类算法做中文文本分类 KNN SVM ...
  • 文本表示方法

    千次阅读 2016-11-28 17:55:06
    这里博主枚举一些主流的文本表示方法。 这里主要说的是基于文本内容的表示,顺带先扯扯基于行为的表示:不同的业务不同的表示,基于行为的文本表示如SVD,LFM等,基于用户的行为日志(如新闻点击)学习用户和文本...
  • 文本分类——常见分类模型

    万次阅读 多人点赞 2018-11-06 17:37:56
      文本分类方法模型主要分为两个大类,一类是基于规则的分类模型;另一类是基于概率统计的模型。 基于规则的模型   基于规则的分类模型相对简单,易于实现。它在特定领域的分类往往能够取得较好的效果。相对于...
  • 文本分类——特征选择概述

    千次阅读 2018-11-06 15:33:36
    内容提要特征选择概述常见模型文档频率(DF)卡方校验(CHI)信息增益(IG)互信息(MI) 特征选择概述   在向量空间模型中,文本可以选择字、词组、短语、甚至“概念”等多种元素表示。这些元素用来表征文本的性质,区别...
  • 文本生成任务常见评估指标

    千次阅读 2019-05-16 15:40:55
        在传统的文本生成任务中,对于模型生成的文本,往往很难评估他们的质量,一般会采用人工投票的形式,来比较生成的文本和真实的参考文本之间的优劣或接近程度,因此,其评估过程是非常昂贵和耗时的,并且该...
  • 它是自然语言处理的一个小分支,自然语言处理还包括语音识别(常见的)等。 目的: 先决条件:将无结构化的原始文本转化为结构化的,计算机可以识别和处理的信息。 优势特点:从而可以利用机器学习,分类聚类等...
  • 在实际开发中我们经常操作checkbox,不仅仅要获得checkbox选中的值,还有获得... jquery操作checkbox方法(全选、全不选、至少选择一个、选择值/文本) //全选 function selectAll() { //方法一: $
  • 基本文本聚类方法

    万次阅读 2016-06-14 20:26:11
    转自:http://blog.csdn.net/wangran51/article/details/7382258 转自:... 经过N天的努力,我的第一个文本聚类小程序终于火热出炉了.真不容易啊,在网上看了很多程序才明白其中的核心原理。其实原理
  • 文本分类中的降维方法总结

    万次阅读 2017-08-18 11:16:11
    人们通常采用向量空间模型来描述文本向量,但是如果直接用分词算法和词频统计方法得到的特征项来表示文本向量中的各个维,那么这个向量的维度将是非常的大。 这种未经处理的文本矢量不仅给后续工作带来巨大的计算...
  • 基于SVM的中文文本分类方法

    千次阅读 2017-06-15 16:50:21
    基于SVM的中文文本分类方法 1、文本分类简介 文本分类(Text Classification)是将文本文档与规定好的类别进行匹配的过程。文本分类可以分为训练和分类两个阶段,其对应的流程图如下面的图1.1和图1.2所示: 图...
  • 一些工作中用到的常见方法和异常记录
  • 数据库常见的安全问题有哪些

    千次阅读 2019-03-04 16:13:45
    数据库已经成为黑客的主要攻击目标,因为它们存储着大量价值和敏感的信息。 这些信息包括金融、知识产权以及企业数据等各方面的内容。网络罪犯开始从入侵在线业务服务器和破坏数据库中大量获利,因此,确保数据库...
  • http://blog.csdn.net/pipisorry/article/details/51482120文本分析的三类参数估计方法-最大似然估计MLE、最大后验概率估计MAP及贝叶斯估计。参数估计参数估计中,我们会遇到两个主要问题:(1)如何去估计参数的...
  • 文本相似度的方法对比

    千次阅读 2018-09-10 10:34:44
    在这篇博文中,作者比较了各种计算句子相似度的方法,并了解它们是如何操作的。词嵌入(word embeddings)已经在自然语言处理领域广泛使用,它可以让我们轻易地计算两个词语之间的语义相似性,或者找出与目标词语最...
  • pmc_param%5Bentry_id%5D=1000000000167873 自问自答一发。...【数据运营】在运营中,为什么文本分析远比数值型分析重要?(上) 【数据运营】在运营中,为什么文本分析远比数值型分析重要?一个实际案例...
  • 机器学习之文本特征选择

    千次阅读 2017-02-15 20:51:15
    1.基本概念1.1 定义从给定的特征集合中选择出相关特征子集的...选择的准则是经特征选择后能有效提高文本准确率。选择没有改变原始特征空间的性质,只是从原始特征空间中选择了一部分重要的特征,组成一个新的低维空间。
  • 文本特征处理及聚类的几种方法 本项目完整源码地址:https://github.com/angeliababy/textcluster 项目博客地址: https://blog.csdn.net/qq_29153321/article/details/104015257 数据准备 测试数据说明 data_offline...
  • 总结 | 常用文本特征选择

    千次阅读 2017-12-29 00:00:00
    凡是特征选择,总是在将特征的重要程度量化后再进行选择,而如何量化特征的重要性,就成了各种方法间最大的不同。接下来就介绍如何有效地进行文本的特征属性选择文本分类作为一种有效的信息检索和信息过滤的关键...
  • 文本向量化的方法

    万次阅读 2017-02-10 16:54:40
    向量空间模型(Vector Space Model)[3],又称词袋表示法,文本被表示为向量,文本 d 被看成由二元特征组成的特征向量。 一般是先选择特征,再计算权重,特征选则的方式见前一篇文章。权重一般用ifidf, 词...
  • 文本文件的编码方式及内容类型是应用层测试中文本测试关注的重点,常见文本编码方式为UTF -8、GBK2312、GBK、BIG5、GB18030等等,常见文本内容类型为TXT、HTML、XML、Torrent、WML、XHTML等。 下面详细介绍下...
  • 机器学习:文本挖掘之特征选择

    千次阅读 2016-03-14 21:47:18
    ------------------------------------------------------------------------------...下列哪个不属于常用的文本分类的特征选择算法? 卡方检验值 互信息 信息增益 主成分分析(不属于) ----------------------------
  • 这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法、鼠标操作、键盘操作介绍,希望该篇基础性文章对你有所帮助,如果错误或不足之处,请海涵~ 一.定位元素方法 二.操作元素方法 四.
  • 文本挖掘之特征选择(python实现)

    千次阅读 2017-06-03 15:16:14
    机器学习算法的空间、时间复杂度依赖于输入数据的规模,维度规约(Dimensionality reduction)则是一种被用于降低输入数据维数的方法。维度规约可以分为两类: 特征选择(feature selection),从原始的d维空间中,选择...
  • 文本处理

    千次阅读 2020-10-23 09:12:16
    所以这很道理, 许多用于处理文本的工具。在这一章中,我们将看一些被用来“切割”文本的程序。在下一章中, 我们将查看更多的文本处理程序,但主要集中于文本格式化输出程序和其它一些人们需要的工具。 这一章...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 224,736
精华内容 89,894
关键字:

常见的选择文本的方法有哪些