精华内容
下载资源
问答
  • 2020-06-15 10:31:22

    文本匹配工具

    RuleFinder 文本匹配工具是一个用于快速编写匹配规则,提取文本的工具。
    源码地址: https://github.com/xmxoxo/RuleFinder

    当前版本号:0.1.12

    update: 2020/6/12

    本工具包括:类库,规则编辑器,批量提取器。

    RuleLib.py	类库,可自行引用到项目中使用;
    
    RuleEditor.py	规则编辑器,基于flask的WEB应用,可在浏览器中编辑规则;
    
    RulePicker.py	规则提取器,可加载规则后从批量文件中提取匹配结果;
    

    工具有什么用?

    在做NLP的前期文本处理工作时,需要对文本进行人工的分析,使用一些关键词或者句式等来匹配查找文本;甚至在一些简单的模型与处理中,也需要使用文本匹配的方式来对文本进行匹配处理,当然我们可以写很多正则表达式,但正则表达式太过复杂,普通情况下不会用到,而且正则表达式多了也不方便管理,于是产生了这个小工具。

    文本匹配工具,使用简便的匹配规则来对文本进行匹配。工具提供了基于WEB的规则编辑器,可快速编辑规则,验证规则的匹配结果。

    案例:按规则提取句子分类

    在这里插入图片描述

    运行以下命令即可启动案例:

    pip install -r requirements.txt
    python RuleEditor.py  -rule_file ./rules/rule3.txt -test_file ./test/test3.txt
    

    然后在浏览器中访问:http://127.0.0.1:8910

    匹配规则

    匹配规则包含以下元素:

    • 中括号("[]") : 代表其中的内容是可选
    • 尖括号("<>") : 代表其中的内容是必选
    • 竖线("|") : 代表或的关系;
    • 任意字符("**"): 匹配任意的字符;
    • 文字字符("??"):匹配汉字字符,区间为:[\u4E00-\u9FA5]
    • 非空字符("++"):匹配一个以上非空字符,非空字符正则为:"(?:[^  ,;;。‘’"“”]+?)"

    匹配规则与正则相似,规则如下:

    • 中括号[]: 代表其中的内容是可选的,比如:

      “不[得]”,能匹配 “不"和"不得”;

    • 尖括号<>: 代表其中的内容是必选的,比如:

      “<经>营”, 能匹配 “经营”

    • 竖线("|"):代表或的关系,即竖线分隔的内容是可替换的,比如:

      “<注册|成立>时间” 能匹配 “注册时间” 和 “成立时间”

    • 括号(): 是可以嵌套的;例如:

      “不[得<少|小>于]” 能匹配: “不”,"不得少于”,“不得小于”

      “[稳定|正常]运营” 能匹配: “稳定运营”,“正常运营”,“运营”

    • 竖线在其所属的括号内,优先级大于括号中的其他括号,比如

      “<注册[登记]|成立>时间” 能匹配: “注册时间”,“注册登记时间”,“成立时间”

    • 竖线可以脱离括号独立存在,比如:

      “在哪里|哪里有” 可以匹配: “在哪里"和"哪里有”

    更新日志

    v 0.1.12

    • 增加了加载数据文件的功能;
    • 各个客户端之间的规则文件及数据分析相互独立,不会干扰。可打开不同浏览器看效果;

    v 0.1.10

    • 可加载规则文件;
    • 可对规则进行增,删,改;

    使用案例

    1. 安装依赖包
    pip install -r requirements.txt
    
    1. ** 启动规则编辑器 **
      运行以下命令,使用默认参数启动启动规则编辑器:
    python RuleEditor.py  
    

    详细参数可见:

    python RuleEditor.py  -h
    

    默认启动时监听0.0.0.0:8910 端口

    默认加载规则文件为:./rules/rule.txt

    默认加载数据文件为: ./test/test.txt

    1. 访问规则编辑器

    使用浏览器打开以下地址访问规则编辑器:http://127.0.0.1:8910

    浏览器界面如下:

    在这里插入图片描述

    在浏览器界面中可以完成:

    • 规则文件加载;
    • 规则文件新建;
    • 规则添加、删除、编辑;
    • 对数据文件测试当前规则文件所有规则;
    1. 使用规则提取器

    完成规则编辑后,可以使用规则提取器,对整个目录下的文件批量提取结果。

    运行以下命令可运行demo:

    python RulePicker.py -rule ./rules/rule.txt 
    

    运行示例如下:

    13:36:55.38|F:>python RulePicker.py -rule ./rules/rule.txt
    正在批量处理,请稍候...
    正在匹配文件:./test/test.txt
    正在匹配文件:./test/test1.txt
    正在匹配文件:./test/test2.txt
    保存结果:./output/result_20200611134436.csv
    匹配用时: 0.03秒
    匹配结果共3个文件:
    =====文件:test 匹配:5条=====
    =====文件:test1 匹配:1条=====
    =====文件:test2 匹配:2条=====
    

    详细参数运行以下命令查看:

    python RulePicker.py -h
    

    参数如下:

    12:01:36.57|F:>RulePicker.py -h
    usage: RulePicker.py [-h] -rule RULE [-data DATA] [-output OUTPUT]
    
    RulePicker v_0.1.10 by xmxoxo
    
    optional arguments:
      -h, --help      show this help message and exit
      -rule RULE      rule file
      -data DATA      data file path, default: ./test/
      -output OUTPUT  output path, default: ./output/
    
    更多相关内容
  • 英文文本相似度/文本推理/文本匹配数据集——SciTail
  • 中文文本相似度/文本推理/文本匹配数据集——LCQMC
  • 中文文本相似度/文本推理/文本匹配数据集——XNLI
  • 中文文本相似度/文本推理/文本匹配数据集——Chinese SNLI MultiNli
  • 英文文本相似度/文本推理/文本匹配数据集——STS
  • 中文文本相似度/文本推理/文本匹配数据集——CCKS2018
  • 中文文本相似度/文本推理/文本匹配数据集——OCNLI
  • 英文文本相似度/文本推理/文本匹配数据集——SNLI
  • 文本匹配、搜搜问搭、电商搜索问答的数据集 60w文本匹配、搜搜问搭、电商搜索问答的数据集 60w文本匹配、搜搜问搭、电商搜索问答的数据集 60w文本匹配、搜搜问搭、电商搜索问答的数据集 60w文本匹配、搜搜问搭、电商...
  • 文本匹配】交互型模型

    千次阅读 2020-07-21 23:36:47
    表示型的文本匹配模型存在两大问题:(1)对各...(3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化的向量表征,或者直接得到统一的向量表征; (4)融合层:对匹配层输出向量进一步压缩、融合; (5

    表示型的文本匹配模型存在两大问题:(1)对各文本抽取的仅仅是最后的语义向量,其中的信息损失难以衡量;(2)缺乏对文本pair间词法、句法信息的比较

    而交互型的文本匹配模型通过尽早在文本pair间进行信息交互,能够改善上述问题。

    基于交互的匹配模型的基本结构包括:

    (1)嵌入层,即文本细粒度的嵌入表示;

    (2)编码层,在嵌入表示的基础上进一步编码;

    (3)匹配层:将文本对的编码层输出进行交互、对比,得到各文本强化后的向量表征,或者直接得到统一的向量表征;

    (4)融合层:对匹配层输出向量进一步压缩、融合;

    (5)预测层:基于文本对融合后的向量进行文本关系的预测。

    在这里插入图片描述

    1. ARC-II

    ARC-II模型是和表示型模型ARC-I模型在同一篇论文中提出的姊妹模型,采用pair-wise ranking loss的目标函数。
    在这里插入图片描述
    其核心结构为匹配层的设计:

    (1)对文本pair的n-gram Embedding结果进行拼接,然后利用1-D CNN得到文本S_X中任一token i和文本S_Y中任一token j的交互张量元素M_{ij}。该操作既然考虑了n-gram滑动窗口对于local信息的捕捉,也通过拼接实现了文本pair间低层级的交互。

    (2)对交互张量进行堆叠的global max-pooling和2D-CNN操作,从而扩大感受野。

    2. PairCNN

    PairCNN并没有选择在Embedding后直接进行query-doc间的交互,而是首先通过TextCNN的方式分别得到query和doc的向量表征,然后通过一个中间Matrix对query和doc向量进行交互得到pair的相似度向量,然后将query的向量表征、doc的向量表征、相似度向量以及其它的特征向量进行拼接,最后经过两层的MPL得到最后的二分类向量。
    在这里插入图片描述
    PairCNN的模型架构中的亮点在于各View向量的拼接,既能利用原始的语义向量,还能够很便捷的融入外部特征。

    3. MatchPyramid

    无论是ARC-II中的n-gram拼接+1D conv还是Pair-CNN中的中间Matrix虽然均通过运算最终达到了信息交互的作用,但其定义还不够显式和明确,MatchPyramid借鉴图像卷积网络的思想,更加显式的定义了细粒度交互的过程。在这里插入图片描述
    MatchPyramid通过两文本各token embedding间的直接交互构造出匹配矩阵,然后将其视为图片进行2D卷积和2D池化,最后Flatten接MLP计算得匹配分数。本文共提出了三种匹配矩阵的构造方式:

    (1)Indicator:0-1型,即一样的token取1,否则取0;这种做法无法涵盖同义多词的情况;

    (2)Cosine:即词向量的夹角余弦;

    (3)Dot Product:即词向量的内积

    此外值得注意的是因为各个文本pair中句子长度的不一致,本文并没有采用padding到max-lenght的惯用做法,而是采用了更灵活的动态池化层,以保证MPL层参数个数的固定。

    4. DecAtt

    DecAtt将注意力机制引入到交互型文本匹配模型中,从而得到各token信息交互后增强后的向量表征。
    在这里插入图片描述
    模型被概括为如下层级模块:

    (1)Attend层:文章提供了两种注意力方案,分别为文本间的cross-attention,以及各文本内的intra-attention。具体而言,分别采用前向网络F和F_{intra}对文本token embedding进行编码,然后通过F(x)F(y)计算cross-attention的score,以及F_{intra}(x)F_{intra}(y)计算self-attention的score。然后利用softmax将attention score进行归一化,再对各token embedding进行加权平均,得到当前query token处的增强表征,最后与原始token embedding进行拼接计为attend后的最终embedding。

    (2)Compare层:将前序Attend层计算得到的最终embedding,喂入一个全连接层进行向量维度的压缩。

    (3)Aggregate层:将每个文本各token处压缩后的向量进行简单的求和,再拼接起来通过MPL得到最后的匹配得分。

    5. CompAgg

    CompAgg详细对比了在文本间cross-attention得到的各token向量表征与原始token向量进行compare的各种方案。
    在这里插入图片描述
    该模型的主要结构包括:

    (1)reprocessing层:采用类似于LSTM/GRU的神经网络得到token的深层表示(图中的\bar a_i);

    (2)Attention层:利用软注意力机制计算文本间的cross-attention(与DecAtt相同),从而得到各token处交互后的向量表示(图中的h_i);

    (3)Comparison层:通过各种网络结构或计算将\bar a_i和h_i计算求得各token的最终表征。

    (4)Aggregation层:利用CNN网络对Comparison层的输出进行计算,得到最后的匹配得分。

    其中Comparison层的构造方式包括:

    (1)矩阵乘法,类似于Pair-CNN中的中间Matrix

    (2)前向神经网络,即将\bar a_i和h_i进行拼接,然后利用输入FFN;

    (3)分别计算cosine和欧式距离,然后拼接;

    (4)各维度进行减法;

    (5)各维度进行乘法;

    (6)各维度进行减法和乘法,然后再接一个前向网络。

    6. ABCNN

    ABCNN是将Attention机制作用于BCNN架构的文本匹配模型。

    6.1 BCNN

    首先简单介绍下BCNN架构:
    在这里插入图片描述
    BCNN的整体结构比较简单:(1)输入层;(2)卷积层,因为采用了反卷积的形式,所以在size上会增加;

    (3)池化层,采用了两种池化模式,在模型开始阶段采用的是local平均池化,在最后句子向量的抽取时采用了global平均池化;(4)预测层,句子向量拼接后采用LR得到最后的匹配得分。

    ABCNN共包括三种变形,下面依次介绍。

    6.2 ABCNN

    在这里插入图片描述
    ABCNN-1直接将Attention机制作用于word embedding层,得到phrase 级的词向量表示。区别于CompAgg中的软注意力机制,ABCNN-1直接基于下式得到注意力矩阵: A i j = 1 1 + ∣ x i − y j ∣ A_{ij}=\frac{1}{1+|x_i-y_j|} Aij=1+xiyj1,然后分别乘以可学习的权重矩阵 W 0 W_0 W0 W 1 W_1 W1得到attetion feature map。

    6.3 ABCNN-2

    在这里插入图片描述
    ABCNN-2将Attention机制作用于word embedding层后的反卷积层的输出结果,其中注意力矩阵的计算原理与ABCNN-1一致。然后将注意力矩阵沿着row和col的方向分别求和,分别代表着各文本token的attention socre;接着将反卷积层的输出结果与attention socre进行加权平均池化,得到与输入层相同shape的特征图。

    6.4 ABCNN-3

    在这里插入图片描述
    ABCNN-3的基本模块可视为ABCNN-1和ABCNN-2的堆叠,即在嵌入层和卷积层上面都引入了attention的机制用来增强对token向量的表示。

    7. ESIM

    ESIM模型基于NLI任务给出了一种强有力的交互型匹配方法。其采用了BiLSTM和Tree-LSTM分别对文本序列和文本解析树进行编码,其亮点在于:

    (1)匹配层定义了cross-attention得到各token的向量表示与原token向量间的详细交互关系,即采用 [ a ˉ , a ^ , a ˉ − a ^ , a ˉ ∗ a ^ ] [\bar a, \hat a,\bar a-\hat a,\bar a* \hat a] [aˉ,a^,aˉa^,aˉa^]作为最终文本token的向量表示,这也成为后续文本匹配模型的惯用做法。

    (2)聚合层通过BiLSTM得到各文本token的编码,从而进一步增强了文本序列的信息传递;

    (3)预测层通过拼接各文本token编码的max-pooling和mean-pooling结果,再经过MPL进行匹配预测。

    在这里插入图片描述

    8. Bimpm

    Bimpm可视为对之前各类交互型文本匹配模型的一次总结。
    在这里插入图片描述
    该模型在各层的具体做法总结如下:

    (1)编码层采用BiLSTM得到每个token隐层的向量表示;

    (2)匹配层遵循 m k = c o s i n e ( W k ∗ v 1 , W k ∗ v 2 ) m_k=cosine(W_k*v_1,W_k*v_2) mk=cosine(Wkv1,Wkv2)的方式可以得到两个文本的任意token pair之间在第k个view下的匹配关系,至于 v 1 v_1 v1 v 2 v_2 v2如何取,文章提供了4种策略:

    • 策略一:其中一个句子取各token隐层的向量表示,另一个句子采用隐层最后时间步处的输出;
    • 策略二:其中一个句子取各token隐层的向量表示,另一个句子采用隐层各时间步输出与之匹配后取再取Max-Pooling值;
    • 策略三:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后得到的加权句子向量;
    • 策略四:其中一个句子取各token隐层的向量表示,另一个句子采用cross-attentive后attention score最高处token的向量作为句子向量。

    这四种策略的区别在于对句子向量的计算不同。

    在这里插入图片描述
    (3)聚合层,首先对上面各种策略得到的输出层再通过一层BiLSTM层,然后将各策略下最后时间步的输出进行拼接,得到最后的聚合向量;

    (4)预测层:两层MPL+softmax

    9. HCAN

    HCAN是除Bert类模型外在文本匹配领域表现最为优异的深度模型之一,其采用了较为复杂的模型结构。
    在这里插入图片描述
    针对于信息抽取问题,文章首先分析了相关性匹配和语义匹配的差异:

    (1)相关性匹配主要关注于关键词的对比,因此更关注低层级词法、语法结构层面的匹配性;

    (2)语义匹配代表着文本的平均意义,因此其关注更高、更丑想的语义层面的匹配性。

    该模型首先采用三类混合的编码器对query和context进行编码:

    (1)深层相同卷积核大小的CNN编码器;

    (2)不同卷积核大小的CNN编码器的并行编码;

    (3)沿着时序方向的stacked BiLSTM编码;

    对于前两者,通过控制卷积核的大小可以更好的捕捉词法和句法特征,即符合相关性匹配的目的;而对于后者,其能表征更长距离的文本意义,满足语义匹配的目的。

    在这三类编码器的编码结果基础上,模型分别进行了相关性匹配和语义匹配操作。其中相关性匹配主要采用各phrase间内积+max pooling/mean pooling的方式获取相关性特征,并通过IDF指进行各phrase的权重调整。而在语义匹配中,模型采用了精心设计的co-attention机制,并最终通过BiLSTM层输出结果。

    最后的预测层仍采用MPL+softmax进行预测。

    10. 小结

    交互型语言匹配模型由于引入各种花式attention,其模型的精细度和复杂度普遍强于表示型语言模型。交互型语言匹配模型通过尽早让文本进行交互(可以发生在Embedding和/或Encoding之后)实现了词法、句法层面信息的匹配,因此其效果也普遍较表示型语言模型更好。

    【Reference】

    1. ARC-II: Convolutional Neural Network Architectures for Matching Natural Language Sentences

    2. PairCNN: Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks

    3. MatchPyramid: Text Matching as Image Recognition

    4. DecAtt: A Decomposable Attention Model for Natural Language Inference

    5. CompAgg: A Compare-Aggregate Model for Matching Text Sequences

    6. ABCNN: ABCNN: Attention-Based Convolutional Neural Network
      for Modeling Sentence Pairs

    7. ESIM: Enhanced LSTM for Natural Language Inference

    8. Bimpm: Bilateral Multi-Perspective Matching for Natural Language Sentences

    9. HCAN: Bridging the Gap Between Relevance Matching and Semantic Matching
      for Short Text Similarity Modeling

    10. 文本匹配相关方向打卡点总结(数据,场景,论文,开源工具)

    11. 谈谈文本匹配和多轮检索

    12. 贝壳找房【深度语义匹配模型 】原理篇一:表示型

    展开全文
  • 文本匹配(语义相似度/行为相关性)技术综述

    万次阅读 多人点赞 2019-01-13 13:08:39
    NLP 中,文本匹配技术,不像 MT、MRC、QA 等属于 end-to-end 型任务,通常以文本相似度计算、文本相关性计算的形式,在某应用系统中起核心支撑作用,比如搜索引擎、智能问答、知识检索、信息流推荐等。本篇将纵览...

    NLP 中,文本匹配技术,不像 MT、MRC、QA 等属于 end-to-end 型任务,通常以文本相似度计算、文本相关性计算的形式,在某应用系统中起核心支撑作用,比如搜索引擎、智能问答、知识检索、信息流推荐等。本篇将纵览文本匹配的技术发展,并重点介绍文本语义相似度计算技术,以及多轮对话场景中的文本语义相似度计算技术。


    1、文本匹配任务

    在真实场景中,如搜索引擎、智能问答、知识检索、信息流推荐等系统中的召回、排序环节,通常面临的是如下任务:

    从大量存储的 doc 中,选取与用户输入 query 最匹配的那个 doc。

    • 在搜索引擎中,“doc”对应索引网页的相关信息,如 title、content 等,“query”对应用户的检索请求,“最匹配”对应(点击行为)相关度最高。
    • 在智能问答中,“doc”对应 FAQ 中的 question,“query”对应用户的问题,“最匹配”对应语义相似度最高。
    • 在信息流推荐中,“doc”对应待推荐的 feed 流,“query”对应用户的画像,“最匹配”对应用户最感兴趣等众多度量标准。

    解决这些任务,无监督和有监督学习都提供了一些具体方法,我们这里先谈论有监督学习。通常,这些任务的训练样本具有同样的结构:

    共 N 组数据,每组数据结构相同:1 个 query,对应的 M 个 doc,对应的 M 个标签。

    • 在搜索引擎中,query 会被表征为包含文本语义和用户信息的 embedding,doc 会被表征为包含索引网页各项信息的 embedding
    • 在智能问答中,query 会被表征为以文本语义为主的 embedding,doc 同样表征为以文本语义为主的 embedding
    • 在信息流推荐中,query 会被表征为包含文本特征各项信息的 embedding,doc 会被表征为包含用户历史、爱好等信息的 embedding

    可见,query 和 doc 的表征形式较固定,至于具体 embedding 包含的信息根据具体任务、场景、目标变化极大,按需设计。

    但至于训练样本中的标签,形式则区别甚大。可以分成下述三种形式:

    • pointwise,M 通常为 1,标签形式为 0 或 1,标签 0 表示 query 与该 doc 不匹配,标签 1 表示匹配。M 也可大于 1 ,此时,一组数据中只有一个 1 其余全为 0,表示这 M 个 doc 中只有这一个与 query 匹配,其余全都不匹配。
    • pairwise,M 通常为 2,标签形式为 0 或 1 ,标签 0 表示 query 与第一个 doc 比与第二个 doc 更匹配,标签 1 表示 query 与第二个 doc 比与第一个 doc 更匹配,当然也可以反之。
    • listwise,M 通常大于等于 2,标签形式为 1 到 M 的正整数,标签 m 表示 query 与该 doc 的匹配度在该组里位列第 m 位。

    上述三种不同监督形式,形成了不同的学习方式,彼此之间优劣异同就涉及到 Learning2Rank 技术了,具体可参考之前的博文,这里不再赘述。虽然越靠后的形式得到的模型越符合我们预期,但其对训练样本形式的严苛性和算法设计的复杂性使得工业应用难以开展,通常,解决我们遇到的任务,多采用 pointwise 或者 pairwise 方式。

    再回顾下 “从大量存储的 doc 中,选取与用户输入 query 最匹配的那个 doc” 这个经典问题,doc 与 query 的具体指代的改变使之可以推广到多个具体任务中,监督信息则可以从两个维度拓展:

    • 监督信号的含义,决定了 doc 与 query 匹配的准则。如在智能问答、知识检索中,doc 与 query 形式基本一致,标注时,如果根据文本语义相似度对 doc 与 query 打标签,那自然最终学习到的模型就是语义相似度模型,如果根据检索后点击行为对 doc 与 query 打标签,那自然最终学习到的模型就是行为相关性模型
    • 监督信号的标注形式,决定了其可采纳的学习形式。通常,按 listwise、pairwise、pointwise 顺序,形式可以退化,即由 listwise 形式的数据构造出 pointwise 形式的数据,也可以引入其他信息后,按逆序进行升格,即由 pointwise 形式的数据构造出 listwise 形式的数据。

    这一节,我们尽量将问题泛化,将多个相关任务进行了关联。那么,下面将就具体的任务 —— 文本语义相似度计算 —— 进行介绍。

    2、文本语义相似度计算

    PI、SSEI、STS、IR-QA、Ad-hoc retrieval

    谈起相似度计算,经常会出现几个关联的 NLP 任务,彼此存在微妙的区别:

    • paraphrase identification,即 PI,是判断一文本是否另一文本的复述
    • semantic text similarity,即 STS,是计算两文本在语义层面的相似性
    • sentence semantic equivalent identification,即 SSEI,是判断两文本在语义层面是否一致
    • IR-QA,是给定一个 query,直接从一堆 answer 中寻找最匹配的,省略了 FAQ 中 question-answer pair 的 question 中转
    • Ad-hoc retrieval,属于典型的相关匹配问题

    当然,如何定义“相似”也是个开放问题。
    Quora 曾尝试从更实用的角度给出定义,如果多个 query 所反映的意图一致,或者说可以用同一个 answer 回答,则可以认为语义一致,即 SSEI。这也更符合 FAQ 问答系统中文本语义相似度计算的诉求。

    此外,需要注意的是,虽然定义有区别,但几个任务基于神经网络提出的很多模型,是彼此通用的。许多经典模型在一个任务上被提出,评估时都会在其他几个任务的数据上跑一下。当然,一个模型迁移到其他任务时,也会进行针对性的微调,后面也会介绍到。总之,应该多关注这几个相关任务上的技术发展,借鉴引用。

    常用数据集

    • PI、SSEI、STS 英文:MSRP、SICK、SNLI、STS、Quora QP、MultiNLI
    • PI、SSEI、STS 中文:LCQMC、BQ corpus
    • IR-QA 英文:wikiQA、insuranceQA

    无监督技术

    不少经典的无监督 STS 技术,虽然简朴,但也能取得不错的效果:

    • 基于词汇重合度:TFIDF、VSM、LD、LCS、BM25、Jaccord、SimHash 等
    • 基于浅层语义的主题模型:LSA、pLSA、LDA 等
    • 基于浅层语义的 encoding 模型:embedding centroid、WMD、InferSent、pretrained encoder 等

    虽然无监督技术较粗糙,但能有效解决冷启动问题。如 Solr 全文检索引擎就在用基于 Ngram LD 的相似度召回技术,FAQ 问答引擎中使用 BOW+LD 也能取得不错的效果。主题模型和基于词向量的模型,本质上都是基于词共现信息的,虽然引入了词义信息,但实际使用中,并无法替代基于词汇重合度的经典算法,效果相差不大。

    基于有监督的相似度计算,我们这边主要介绍基于神经网络的,基本可以分为两大类,sentence encoding (sentence representation) 类、sentence interaction 类。下面将分别介绍。

    SE 网络

    SE 网络结构如下:

    在这里插入图片描述

    • representation-based 类模型,思路是基于 Siamese 网络,提取文本整体语义再进行匹配
    • 典型的 Siamese 结构,双塔共享参数,将两文本映射到同一空间,才具有匹配意义
    • 表征层进行编码,使用 MLP、CNN、RNN、Self-attention、Transformer encoder、BERT 均可
    • 匹配层进行交互计算,采用点积、余弦、高斯距离、MLP、相似度矩阵均可
    • 经典模型有:DSSM、CDSSM、MV-LSTM、ARC-I、CNTN、CA-RNN、MultiGranCNN 等
    • 优点是可以对文本预处理,构建索引,大幅降低在线计算耗时
    • 缺点是失去语义焦点,易语义漂移,难以衡量词的上下文重要性

    SI 网络

    SI 网络结构如下:

    在这里插入图片描述

    • interaction-based 类模型,思路是捕捉直接的匹配信号(模式),将词间的匹配信号作为灰度图,再进行后续建模抽象
    • 交互层,由两文本词与词构成交互矩阵,交互运算类似于 attention,加性乘性都可以
    • 表征层,负责对交互矩阵进行抽象表征,CNN、S-RNN 均可
    • 经典模型有:ARC-II、MatchPyramid、Match-SRNN、K-NRM、DRMM、DeepRank、DUET、IR-Transformer、DeepMatch、ESIM、ABCNN、BIMPM 等
    • 优点是更好地把握了语义焦点,能对上下文重要性进行更好的建模
    • 缺点是忽视了句法、句间对照等全局性信息,无法由局部匹配信息刻画全局匹配信息

    深度语义

    为了更好实现语义匹配、逻辑推理,需要 model 深度信息,可以从如下角度改进上述基础 SE、SI 网络:

    • 结合 SE 与 SI 网络:两者的作用并非谁是谁子集的关系,是相互补充的关系,简单加权组合即可。
    • 考虑词语的多粒度语义信息:即在基础模型基础上分别对 unigram、bigram、trigram 进行建模,从而 model 文本的word、term、phrase 层面的语义信息,融合的方式不唯一,在输入层、表示层、匹配层都可以尝试,通常来说越早融合越好提升效果,因为更早发挥了多粒度间的互补性。可参考腾讯的 MIX。
    • 引入词语的多层次结构信息:即引入 term weight、pos、word position、NER 等层面的 element-wise 信息到语义信息中。可参考腾讯的 MIX。
    • 引入高频 bigram 和 collocation 片段:主要为了加入先验,降低学习难度。Ngram 表义更精确但也更稀疏,可借助统计度量,只挑选少量对匹配任务有很好信息量的高频共现 term 组合作为 bigram 加入词典。Collocation 即关注跨词的一些 term 组合,如借助依存分析或者频繁项集挖掘获得 collocation 片段。
    • 参考 CTR 中 FM,处理业务特征:如美团的排序算法演进中,参考了 CTR 中的 wide&deep 模型来添加业务特征,即,有的业务特征不做变换直接连接到最外层,有的业务特征做非线性变化后不够充分,会再进行多项式非线性变换。
    • 对两文本中的差异部分单独建模:即在基础模型基础上,再使用一个单独模型处理两文本差异部分,强化负样本的识别能力。可参考 HIT 的 GSD 模型。
    • 引入混合学习策略:如迁移学习,可参考 MT-hCNN;如多任务学习;以及两者多种方式的组合,具体比较可参考 HIT 的 DFAN,如引入多任务学习和基于 Seq2Seq 的迁移学习的混合策略效果可能最好。
    • 使用复杂 Learning2Rank 学习方式:详见下节。

    学习形式

    前面,提过可以按 pointwise、pairwise、listwise 顺序升格进行学习,在权衡标签获取难度和效果后,通常选用 DSSM 结构,即形式上的 listwise,loss 上的 pairwise 结构。

    提供一种最佳实践方案:基于 DSSM 结构分别训练 SE 和 SI 网络,训练好的 SE 网络结合 faiss 作为预召回模块,训练好的 SI 网络作为匹配模块。

    针对性调整

    值得注意的是,前面虽然说 PI、SSEI、STS、IR-QA、Ad-hoc retrieval 等任务基于神经网络提出的很多模型是彼此通用的,但彼此借鉴时,还是有不少细节需要调整的。

    IR-based QA 中提出的模型虽然也通用于相似度计算,但细节需要调整。如,Siamese 网络最后 matching layer 采用 cos 的话,对于 paraphrase 任务自然是没问题,两文本 encoding 后向量相同则得分高,但对 QA 任务则不尽然,此时 answer 未必是最优的。因此,基于 SE 结构的 QA 任务通常会加各种 attention,而 paraphrase 任务加 attention 基本没有增益。在 QA 任务上, attention 起到将 Q 中信息线性映射到 A 中信息的空间的作用,而 paraphrase 没这个必要。

    语义匹配任务和相关匹配任务,很多模型也是通用的,但两个任务强调的有效信息是截然不同的,因此在基础模型上也会进行不少调整。如,需要格外关注 query 与 doc 完全匹配的 term,强调 query 中 term 的重要性,有时不必将 doc 作为整体和 query 进行匹配,等等。计算所提出了一系列相关匹配模型,如 DRMM、aNMM 等,可以参考 MatchZoo

    可见,看起来很相似的任务,也会导致很不同的解决方案,再次验证了 no-free-lunch 定理。

    多轮对话场景

    下面简单介绍几个经典的 IR-based 多轮对话的 QA 模型:

    • 百度在 EMNLP2016 提出的 Multi-view 模型:联合考虑了 word-level matching 和 utterance-level matching,只是方式粗糙了些,均基于 SE 结构,类似于层次化结构。
    • MSRA 在 ACL2017 提出的 SMN 模型:将 SE 改进到 SI, 联合考虑 word-level interaction 和 segment-level interaction。不过其 representation 过程用的两个 DRU,过于繁琐,可以参考阿里小蜜在2018的 MT-hCNN,进行了改进。
    • 上交在 COLING2018 提出的 DUA 模型:采用了 Self-attention 对 utterance 进行了 deep encoding。
    • 百度在 ACL2018 提出的 DAM 模型:算是最新技术的集大成者,摒弃之前建模 utterance embedding sequence 的思路,先使用 Transformer encoder 得到文本多粒度的表征,然后借助 attention 设计了两种交互方式得到了 self-attention-match 和 cross-attention-match 两种对齐矩阵,再采用 3D-conv 进行聚合分类预测,实现了 SOTA,干净利落。

    核心内容就介绍到这里吧,记得之前 HIT-SCIR 的刘挺老师在梳理中文信息处理前沿技术进展时,列了 NLP 中四个主流任务,包括解析、分类、匹配和生成。可见,文本匹配任务的重要性,后续这个方向有好的进展,也会及时更新在文章里,欢迎大家讨论。

    展开全文
  • 本文将详细讲解数据预处理、Jieba分词和文本聚类知识,这篇文章可以说是文本挖掘和自然语言处理的入门文章。两万字基础文章,希望对您有所帮助。欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列...

    欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

    前一篇文章讲述了分类算法的原理知识级案例,包括决策树、KNN、SVM,并通过详细的分类对比实验和可视化边界分析与大家总结。本文将详细讲解数据预处理、Jieba分词和文本聚类知识,这篇文章可以说是文本挖掘和自然语言处理的入门文章。两万字基础文章,希望对您有所帮助。

    下载地址:

    前文赏析:

    第一部分 基础语法

    第二部分 网络爬虫

    第三部分 数据分析和机器学习

    作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


    前文第一部分详细介绍了各种Python网络数据爬取方法,但所爬取的语料都是中文知识,在第二部分前面的章节也讲述了常用的数据分析模型及实例。这些实例都是针对数组或矩阵语料进行分析的,那么如何对中文文本语料进行数据分析呢?在本章作者将带领大家走进文本聚类分析领域,讲解文本预处理和文本聚类等实例内容。

    一.数据预处理概述

    在数据分析和数据挖掘中,通常需要经历前期准备、数据爬取、数据预处理、数据分析、数据可视化、评估分析等步骤,而数据分析之前的工作几乎要花费数据工程师近一半的工作时间,其中的数据预处理也将直接影响后续模型分析的好坏。

    数据预处理(Data Preprocessing)是指在进行数据分析之前,对数据进行的一些初步处理,包括缺失值填写、噪声处理、不一致数据修正、中文分词等,其目标是得到更标准、高质量的数据,纠正错误异常数据,从而提升分析的结果。

    图1是数据预处理的基本步骤,包括中文分词、词性标注、数据清洗、特征提取(向量空间模型存储)、权重计算(TF-IDF)等。

    在这里插入图片描述

    1.中文分词技术及Jieba工具
    在得到语料之后,首先需要做的就是对中文语料进行分词。由于中文词语之间是紧密联系的,一个汉语句子是由一串前后连续的汉字组成,词与词之间没有明显的分界标志,所以需要通过一定的分词技术把句子分割成空格连接的词序列。本章介绍了中文常用的分词技术,同时着重讲解了Python常用分词工具Jieba进行分词的实例。

    2.数据清洗及停用词过滤
    在使用Jieba中文分词技术得到分完词的语料后,可能会存在脏数据和停用词等现象。为了得到更好的数据分析结果,需要对这些数据集进行数据清洗和停用词过滤等操作,这里利用Jieba库进行清洗数据。

    3.词性标注
    词性标注是指为分词结果中的每个单词或词组标注一个正确的词性,即确定每个词是名词、动词、形容词或其他词性的过程。通过词性标注可以确定词在上下文中的作用,通常词性标注是自然语言处理和数据预处理的基础步骤,Python也提供了相关库进行词性标注。

    在这里插入图片描述

    4.特征提取
    特征提取是指将原始特征转换为一组具有明显物理意义或者统计意义的核心特征,所提取的这组特征可以尽可能地表示这个原始语料,提取的特征通常会存储至向量空间模型中。向量空间模型是用向量来表征一个文本,它将中文文本转化为数值特征。本章介绍了特征提取、向量空间模型和余弦相似性的基本知识,同时结合实例进行深入讲解。

    5.权重计算及TFIDF
    在建立向量空间模型过程中,权重的表示尤为重要,常用方法包括布尔权重、词频权重、TF-IDF权重、熵权重方法等。本章讲述了常用的权重计算方法,并详细讲解了TF-IDF的计算方法和实例。

    现在假设存在表1所示的数据集,并存储至本地test.txt文件中,整章内容都将围绕该数据集进行讲解,数据集共分为9行数据,包括3个主题,即:贵州旅游、大数据和爱情。接下来依次对数据预处理的各个步骤进行分析讲解。

    在这里插入图片描述

    贵州省位于中国的西南地区,简称“黔”或“贵”。
    走遍神州大地,醉美多彩贵州。
    贵阳市是贵州省的省会,有“林城”之美誉。
    数据分析是数学与计算机科学相结合的产物。
    回归、聚类和分类算法被广泛应用于数据分析。
    数据爬取、数据存储和数据分析是紧密相关的过程。
    最甜美的是爱情,最苦涩的也是爱情。
    一只鸡蛋可以画无数次,一场爱情能吗?
    真爱往往珍藏于最平凡、普通的生活中。
    

    二.中文分词

    当读者使用Python爬取了中文数据集之后,首先需要对数据集进行中文分词处理。由于英文中的词与词之间是采用空格关联的,按照空格可以直接划分词组,所以不需要进行分词处理,而中文汉字之间是紧密相连的,并且存在语义,词与词之间没有明显的分隔点,所以需要借助中文分词技术将语料中的句子按空格分割,变成一段段词序列。下面开始详细介绍中文分词技术及Jiaba中文分词工具。

    1.中文分词技术

    中文分词(Chinese Word Segmentation)指将汉字序列切分成一个个单独的词或词串序列,它能够在没有词边界的中文字符串中建立分隔标志,通常采用空格分隔。中文分词是数据分析预处理、数据挖掘、文本挖掘、搜索引擎、知识图谱、自然语言处理等领域中非常基础的知识点,只有经过中文分词后的语料才能转换为数学向量的形式,继续进行后面的分析。同时,由于中文数据集涉及到语义、歧义等知识,划分难度较大,比英文复杂很多。下面举个简单示例,对句子“我是程序员”进行分词操作。

    输入:我是程序员
    输出1:我\是\程\序\员
    输出2:我是\是程\程序\序员
    输出3:我\是\程序员
    

    这里分别采用了三种方法介绍中文分词。

    • “我\是\程\序\员”采用的是一元分词法,将中文字符串分隔为单个汉字;
    • “我是\是程\程序\序员”采用二元分词法,将中文汉字两两分隔;
    • “我\是\程序员”是比较复杂但更实用的分词方法,它根据中文语义来进行分词的,其分词结果更准确。

    中文分词方法有很多,常见的包括:

    • 基于字符串匹配的分词方法
    • 基于统计的分词方法
    • 基于语义的分词方法

    这里介绍比较经典的基于字符串匹配的分词方法。

    基于字符串匹配的分词方法又称为基于字典的分词方法,它按照一定策略将待分析的中文字符串与机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功,并识别出对应的词语。该方法的匹配原则包括最大匹配法(MM)、逆向最大匹配法(RMM)、逐词遍历法、最佳匹配法(OM)、并行分词法等。

    正向最大匹配法的步骤如下,假设自动分词词典中的最长词条所含汉字的个数为n。

    • ① 从被处理文本中选取当前中文字符串中的前n个中文汉字作为匹配字段,查找分词词典,若词典中存在这样一个n字词,则匹配成功,匹配字段作为一个词被切分出来。
    • ② 若分词词典中找不到这样的一个n字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的中文字符作为新的匹配字段,继续进行匹配。
    • ③ 循环步骤进行匹配,直到匹配成功为止。

    例如,现在存在一个句子“北京理工大学生前来应聘”,使用正向最大匹配方法进行中文分词的过程如下所示。

    分词算法:正向最大匹配法
    输入字符:北京理工大学生前来应聘
    分词词典:北京、北京理工、理工、大学、大学生、生前、前来、应聘
    最大长度:6
    

    匹配过程:

    • (1)选取最大长度为6的字段匹配,即“北京理工大学”匹配词典“北京理工大学”在词典中没有匹配字段,则去除一个汉字,剩余“北京理工大”继续匹配,该词也没有匹配字段,继续去除一个汉字,即“北京理工”,分词词典中存在该词,则匹配成功。结果:匹配“北京理工”

    • (2)接着选取长度为6的字符串进行匹配,即“大学生前来应” “大学生前来应”在词典中没有匹配字段,继续从后去除汉字,“大学生” 三个汉字在词典中匹配成功。结果:匹配“大学生”

    • (3)剩余字符串“前来应聘”继续匹配“前来应聘”在词典中没有匹配字段,继续从后去除汉字,直到“前来”。结果:匹配“前来”

    • (4)最后的字符串“应聘”进行匹配。结果:匹配“应聘”

    • 分词结果:北京理工 \ 大学生 \ 前来 \ 应聘

    随着中文数据分析越来越流行、应用越来越广,针对其语义特点也开发出了各种各样的中文分词工具,常见的分词工具包括:

    • Stanford汉语分词工具
    • 哈工大语言云(LTP -cloud)
    • 中国科学院汉语词法分析系统(ICTCLAS)
    • IKAnalyzer分词
    • 盘古分词
    • 庖丁解牛分词

    同时针对Python语言的常见中文分词工具包括:盘古分词、Yaha分词、Jieba分词等,它们的用法都相差不大,由于结巴分词速度较快,可以导入词典如“颐和园”、“黄果树瀑布”等专有名词再进行中文分词等特点,本文主要介绍结巴(Jieba)分词工具讲解中文分词。


    2.Jieba中文分词用法

    (1) 安装过程
    作者推荐大家使用PIP工具来安装Jieba中文分词包。安装语句如下:

    pip install jieba
    

    调用命令“pip install jieba”安装jieba中文分词包如图所示。

    在这里插入图片描述

    安装过程中的会显示安装配置相关包和文件的百分比,直到出现“Successfully installed jieba”命令,表示安装成功。注意,在安装过程中会遇到各种问题,大家一定要学会独立搜索答案解决这些问题,才能提升您独立解决问题的能力。

    同时,如果您使用Anaconda Spyder集成环境,则调用“Anaconda Prompt”命令行模式输入“pip install jieba”命令进行安装。如果您的Python开发环境已经安装了该扩展包,则会提示已经存在Jieba中文分词包,如图所示。

    在这里插入图片描述


    (2) 基础用法
    首先读者看一段简单的结巴分词代码。

    • jieba.cut(text,cut_all=True)
      分词函数,第一个参数是需要分词的字符串,第二个参数表示是否为全模式。分词返回的结果是一个可迭代的生成器(generator),可使用for循环来获取分词后的每个词语,更推荐读者转换为list列表再使用。
    • jieba.cut_for_search(text)
      搜索引擎模式分词,参数为分词的字符串,该方法适合用于搜索引擎构造倒排索引的分词,粒度比较细。
    #coding=utf-8
    #By:Eastmount CSDN
    import jieba  
      
    text = "小杨毕业于北京理工大学,从事Python人工智能相关工作。"  
    
    #全模式
    data = jieba.cut(text,cut_all=True)
    print(type(data))
    print(u"[全模式]: ", "/".join(data))
    
    #精确模式  
    data = jieba.cut(text,cut_all=False)
    print(u"[精确模式]: ", "/".join(data))
    
    #默认是精确模式 
    data = jieba.cut(text)  
    print(u"[默认模式]: ", "/".join(data))
    
    #搜索引擎模式 
    data = jieba.cut_for_search(text)    
    print(u"[搜索引擎模式]: ", "/".join(data))
    
    #返回列表
    seg_list = jieba.lcut(text, cut_all=False)
    print("[返回列表]: {0}".format(seg_list))
    

    输出结果如下所示。

    在这里插入图片描述

    最终的分词结果比较理想,其中精确模式输出的“小/杨/毕业/于/北京理工大学/,/从事/Python/人工智能/相关/工作/。”比较精准。下面简单叙述结巴中文分词的三种分词模式。

    全模式
    该模式将语料中所有可以组合成词的词语都构建出来,其优点是速度非常快,缺点是不能解决歧义问题,并且分词结果不太准确。其分词结果为“小/杨/毕业/于/北京/北京理工/北京理工大学/理工/理工大/理工大学/工大/大学///从事/Python/人工/人工智能/智能/相关/工作//”。

    精确模式
    该模式利用其算法将句子最精确地分隔开,适合文本分析,通常采用这种模式进行中文分词。其分词结果为“小/杨/毕业/于/北京理工大学/,/从事/Python/人工智能/相关/工作/。”,其中“北京理工大学”、“人工智能”这些完整的名词被精准识别,但也有部分词未被识别,后续导入词典可以实现专有词汇识别。

    搜索引擎模式
    该模式是在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。其结果为“小/杨/毕业/于/北京/理工/工大/大学/理工大/北京理工大学/,/从事/Python/人工/智能/人工智能/相关/工作/。”。

    Python提供的结巴(Jieba)中文分词包主要利用基于Trie树结构实现高效的词图扫描(构建有向无环图DAG)、动态规划查找最大概率路径(找出基于词频的最大切分组合)、基于汉字成词能力的HMM模型等算法,这里不进行详细叙述,本书更侧重于应用案例。同时结巴分词支持繁体分词和自定义字典方法。

    • ==load_userdict(f) ==

    (3) 中文分词实例
    下面对表1中的语料进行中文分词。代码为依次读取文件中的内容,并调用结巴分词包进行中文分词,然后存储至本地文件中。

    #coding=utf-8
    #By:Eastmount CSDN
    import os  
    import codecs
    import jieba  
    import jieba.analyse
    
    source = open("test.txt", 'r')
    line = source.readline().rstrip('\n')
    content = []
    while line!="":
        seglist = jieba.cut(line,cut_all=False)  #精确模式  
        output = ' '.join(list(seglist))         #空格拼接  
        print(output)
        content.append(output)
        line = source.readline().rstrip('\n')
    else:
        source.close() 
    

    输出如图所示,可以看到分词后的语料。

    在这里插入图片描述


    三.数据清洗

    在分析语料的过程中,通常会存在一些脏数据或噪声词组干扰我们的实验结果,这就需要对分词后的语料进行数据清洗(Data Cleaning)。比如前面使用Jieba工具进行中文分词,它可能存在一些脏数据或停用词,如“我们”、“的”、“吗”等。这些词降低了数据质量,为了得到更好的分析结果,需要对数据集进行数据清洗或停用词过滤等操作。本节主要介绍数据清洗概念、中文数据清洗技术及停用词过滤,并利用Jieba分词工具进行停用词和标点符号的清洗。

    1.数据清洗概述

    脏数据通常是指数据质量不高、不一致或不准确的数据,以及人为造成的错误数据等。作者将常见的脏数据分为四类:

    • 残缺数据
      该类数据是指信息存在缺失的数据,通常需要补齐数据集再写入数据库或文件中。比如统计9月份30天的销售数据,但期间某几天数据出现丢失,此时需要对数据进行补全操作。
    • 重复数据
      数据集中可能存在重复数据,此时需要将重复数据导出让客户确认并修正数据,从而保证数据的准确性。在清洗转换阶段,对于重复数据项尽量不要轻易做出删除决策,尤其不能将重要的或有业务意义的数据过滤掉,校验和重复确认的工作是必不可少的。
    • 错误数据
      该类脏数据常常出现在网站数据库中,是指由于业务系统不够健全,在接收输入后没有进行判断或错误操作直接写入后台数据库造成的,比如字符串数据后紧跟一个回车符、不正确的日期格式等。这类错误可以通过去业务系统数据库用SQL语句进行挑选,再交给业务部门修正。
    • 停用词
      分词后的语料并不是所有的词都与文档内容相关,往往存在一些表意能力很差的辅助性词语,比如中文词组“我们”、“的”、“可以”等,英文词汇“a”、“the”等。这类词在自然语言处理或数据挖掘中被称为停用词(Stop Words),它们是需要进行过滤的。通常借用停用词表或停用词字典进行过滤。

    数据清洗主要解决脏数据,从而提升数据质量,它主要应用于数据仓库、数据挖掘、数据质量管理等领域。读者可以简单将数据清洗定位为:只要是有助于解决数据质量问题的处理过程就被认为是数据清洗,不同领域的数据清洗定义有所不同。总之,数据清洗的目的是保证数据质量,提供准确数据,其任务是通过过滤或者修改那些不符合要求的数据,从而更好地为后面的数据分析作铺垫。

    在这里插入图片描述

    为了解决上述问题,将数据清洗方法划分为:

    • 解决残缺数据
      对于空值或缺失数据,需要采用估算填充方法解决,常见的估算方法包括样本均值、中位数、众数、最大值、最小值等填充,比如选取所有数据的平均值来填充缺失数据。这些方法会存在一定的误差,如果空值数据较多,则会对结果造成影响,偏离实际情况。
    • 解决重复数据
      简单的重复数据需要人为识别,而计算机解决重复数据的方法较为复杂。其方法通常会涉及到实体识别技术,采用有效的技术识别处相似的数据,这些相似数据指向同一实体,再对这些重复数据进行修正。
    • 解决错误数据
      对于错误数据,通常采用统计方法进行识别,如偏差分析、回归方程、正态分布等,也可以用简单的规则库检测数值范围,使用属性间的约束关系来校对这些数据。
    • 解决停用词
      停用词概念由Hans Peter Luhn提出,并为信息处理做出了巨大的贡献。通常存在一个存放停用词的集合,叫做停用词表,停用词往往由人工根据经验知识加入,具有通用性。解决停用词的方法即利用停用词词典或停用词表进行过滤。比如“并”、“当”、“地”、“啊”等字都没有具体的含义,需要过滤,还存在一些如“我们”、“但是”、“别说”、“而且”等词组也需要过滤。

    2.中文语料清洗

    前面已将Python爬取的中文文本语料进行了分词处理,接下来 需要对其进行数据清洗操作,通常包括停用词过滤和特殊标点符号去除等,而对于空值数据、重复数据,作者更建议大家在数据爬取过程中就进行简单的判断或补充缺失值。下面对表1所提供的中文语料(包括贵州、大数据和爱情三个主题)进行数据清洗实例操作。

    (1) 停用词过滤
    上图是使用结巴工具中文分词后的结果,但它存在一些出现频率高却不影响文本主题的停用词,比如“数据分析是数学与计算机科学相结合的产物”句子中的“是”、“与”、“的”等词,这些词在预处理时是需要进行过滤的。

    这里作者定义一个符合该数据集的常用停用词表的数组,然后将分词后的序列,每一个字或词组与停用词表进行比对,如果重复则删除该词语,最后保留的文本能尽可能地反应每行语料的主题。代码如下:

    #coding=utf-8
    #By:Eastmount CSDN
    import os  
    import codecs
    import jieba  
    import jieba.analyse
    
    #停用词表
    stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与',
                             '和', '也', '被', '吗', '于', '中', '最'])
    
    source = open("test.txt", 'r')
    line = source.readline().rstrip('\n')
    content = []                                 #完整文本
    
    while line!="":
        seglist = jieba.cut(line,cut_all=False)  #精确模式
        final = []                               #存储去除停用词内容
        for seg in seglist: 
            if seg not in stopwords:  
                final.append(seg)
        output = ' '.join(list(final))           #空格拼接
        print(output)
        content.append(output)
        line = source.readline().rstrip('\n')
    else:
        source.close()
    

    其中stopwords变量定义了停用词表,这里只列举了与我们test.txt语料相关的常用停用词,而在真实的预处理中,通常会从文件中导入常见的停用词表,包含了各式各样的停用词,读者可以去网上搜索查看。

    核心代码是for循环判断分词后的语料是否在停用词表中,如果不在则添加到新的数组final中,最后保留的就是过滤后文本,如图所示。

    在这里插入图片描述


    (2) 去除标点符号
    在做文本分析时,标点符号通常也会被算成一个特征,从而影响分析的结果,所以我们需要把标点符号也进行过滤。其过滤方法和前面过滤停用词的方法一致,建立一个标点符号的数组或放到停用词stopwords中,停用词数组如下:

    stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与',
                             '和', '也', '被', '吗', '于', '中', '最',
                             '“', '”', '。', ',', '?', '、', ';'])
    

    同时将文本内容存储至本地result.txt文件中,完整代码如下:

    # coding=utf-8
    #By:Eastmount CSDN
    import os  
    import codecs
    import jieba  
    import jieba.analyse
    
    #停用词表
    stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与',
                             '和', '也', '被', '吗', '于', '中', '最',
                             '“', '”', '。', ',', '?', '、', ';'])
    
    source = open("test.txt", 'r')
    result = codecs.open("result.txt", 'w', 'utf-8')
    line = source.readline().rstrip('\n')
    content = []                                 #完整文本
    
    while line!="":
        seglist = jieba.cut(line,cut_all=False)  #精确模式
        final = []                               #存储去除停用词内容
        for seg in seglist:   
            if seg not in stopwords:  
                final.append(seg)
        output = ' '.join(list(final))           #空格拼接
        print(output)
        content.append(output)
        result.write(output + '\r\n')
        line = source.readline().rstrip('\n')
    else:
        source.close()
        result.close()
    

    输出结果如图7所示,得到的语料非常精炼,尽可能的反应了文本主题,其中1-3行为贵州旅游主题、4-6为大数据主题、7-9位爱情主题。

    在这里插入图片描述


    四.特征提取及向量空间模型

    本小节主要介绍特征提取、向量空间模型和余弦相似性的基础知识,并用表21.1所提供的语料进行基于向量空间模型的余弦相似度计算。

    1.特征规约

    经过网络爬取、中文分词、数据清洗后的语料通常称为初始特征集,而初始特征集通常都是由高维数据组成,并且不是所有的特征都很重要。高维数据中可能包含不相关的信息,这会降低算法的性能,甚至高维数据会造成维数灾难,影响数据分析的结果。

    研究发现,减少数据的冗余维度(弱相关维度)或提取更有价值的特征能够有效地加快计算速度,提高效率,也能够确保实验结果的准确性,学术上称为特征规约。

    特征规约是指选择与数据分析应用相关的特征,以获取最佳性能,并且处理的工作量更小。特征规约包含两个任务:特征选择和特征提取。它们都是从原始特征中找出最有效的特征,并且这些特征能尽可能地表征原始数据集。

    (1) 特征提取
    特征提取是将原始特征转换为一组具有明显物理意义或者统计意义的核心特征,所提取的这组特征可以尽可能地表示这个原始语料。特征提取分为线性特征提取和非线性特征提取,其中线性特征提取常见的方法包括:

    • PCA主成分分析方法。该方法寻找表示数据分布的最优子空间,将原始数据降维并提取不相关的部分,常用于降维,参考前面聚类那篇文章。
    • LDA线性判别分析方法。该方法寻找可分性判据最大的子空间。
    • ICA独立成分分析方法。该方法将原始数据降维并提取出相互独立的属性,寻找一个线性变换。

    非线性特征提取常见方法包括Kernel PCA、Kernel FDA等。

    (2) 特征选择
    特征选择是从特征集合中挑选一组最具统计意义的特征,从而实现降维,通常包括产生过程、评价函数、停止准则、验证过程四个部分。传统方法包括信息增益(Information Gain,简称IG)法、随机产生序列选择算法、遗传算法( Genetic Algorithms,简称GA )等。

    下图是图像处理应用中提取Lena图的边缘线条特征的实例,可以利用一定量的特征尽可能的描述整个人的轮廓,它和数据分析中的应用也是相同的原理。

    在这里插入图片描述


    2.向量空间模型

    向量空间模型(Vector Space Model,简称VSM)是通过向量的形式来表征一个文档,它能够将中文文本转化为数值特征,从而进行数据分析。作为目前最为成熟和应用最广的文本表示模型之一,向量空间模型已经广泛应用于数据分析、自然语言处理、中文信息检索、数据挖掘、文本聚类等领域,并取得了一定成果。

    采用向量空间模型来表示一篇文本语料,它将一个文档(Document)或一篇网页语料(Web Dataset)转换为一系列的关键词(Key)或特征项(Term)的向量。

    • 特征项(Trem)
      特征项是指文档所表达的内容由它所含的基本语言单位(字、词、词组或短语)组成,在文本表示模型中,基本语言单位即称为文本的特征项。例如文本Doc中包含n个特征项,表示为:

    在这里插入图片描述

    • 特征权重(Trem Weight)
      特征权重是指为文档中的某个特征项ti(1≤ i ≤n)赋予权重wi,以表示该特征项对于文档内容的重要程度,权重越高的特征项越能反应其在文档中的重要性。文本Doc中存在n个特征项,即:{t1, t2, t3, … , tn-1, tn},它是一个n维坐标,接着需要计算出各特征项ti在文本中的权重wi,为对应特征的坐标值。按特征权重文本表示如下,其中,WDoc称为文本Doc的特征向量。

    在这里插入图片描述

    • 文档表示
      得到了特征项和特征权重后,需要表示一篇文档,则利用下面这个公式。其中,文档Doc共包含n个特征词和n个权重。ti是一系列相互之间不同的特征词,i=1,2,…,n。wi(d)是特征词ti在文档d中的权重,它通常可以被表达为ti在d中呈现的频率。

    在这里插入图片描述

    特征项权重W有很多种不同的计算方法,最简单的方法是以特征项在文本中的出现次数作为该特征项的权重,第五部分将详细叙述。

    在这里插入图片描述

    从上图可以看到,将文档存储为词频向量的过程,转换为{1,0,1,0,…,1,1,0}形式。特征项的选取和特征项权重的计算是向量空间模型的两个核心问题,为了使特征向量更能体现文本内容的含义,要为文本选择合理的特征项,并且在给特征项赋权重时遵循对文本内容特征影响越大的特征项的权值越大的原则。


    3.余弦相似度计算

    当使用上面的向量空间模型计算得到两篇文章的向量后,则可以计算两篇文章的相似程度,两篇文章间的相似度通过两个向量的余弦夹角Cos来描述。文本D1和D2的相似度计算公式如下:

    在这里插入图片描述

    其中,分子表示两个向量的点乘积,分母表示两个向量的模的乘积。通过余弦相似性计算后,得到了任意两篇文章的相似程度,可以将相似程度越高的文档归类到同一主题,也可以设定阈值进行聚类分析。该方法的原理是将语言问题转换为数学问题来解决实际问题。

    下图是向量空间模型图,它展示了文档Term1、Term2、…、TermN之间的余弦相似度计算方法,如果两篇文档越相似,则其夹角θ越小,Cos值越接近于1,当两篇文档完全相似时,此时的夹角为0°,Cos值为1。这也展示了余弦相似性的原理知识。

    在这里插入图片描述

    下面我们借用两个句子来计算其与“北京理工大学生前来应聘”的余弦相似程度。假设存在三个句子,需要看哪一个句子和“北京理工大学生前来应聘”相似程度更高,则认为主题更为类似。那么,如何计算句子A和句子B的相似性呢?

    句子1:北京理工大学生前来应聘
    
    句子2:清华大学大学生也前来应聘
    
    句子3: 我喜欢写代码
    

    下面采用向量空间模型、词频及余弦相似性计算句子2和句子3分别与句子1的相似性。

    第一步:中文分词。

    句子1:北京理工 / 大学生 / 前来 / 应聘
    
    句子2:清华大学 / 大学生 // 前来 / 应聘
    
    句子3: 我 / 喜欢 // 代码
    

    第二步:列出所有词语,按照词出现的先后顺序。

    北京理工 / 大学生 / 前来 / 应聘 / 清华大学 /// 喜欢 // 代码
    

    第三步:计算词频。如表所示。

    在这里插入图片描述

    第四步:写出词频向量。

    句子1[1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
    
    句子2[0, 1, 1, 1, 1, 1, 0, 0, 0, 0]
    
    句子3[0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
    

    第五步:计算余弦相似度。

    在这里插入图片描述

    在这里插入图片描述

    其结果显示句子1和句子2的相似度为0.67,存在一定的相似主题;而句子1和句子3的相似度为0,完全不相似。

    总之,余弦相似度是一种非常有用的算法,只要是计算两个向量的相似程度,都可用它。当余弦值越接近1时,表明两个向量的夹角越接近0度,两个向量越相似。但余弦相似性作为最简单的相似度计算方法,也存在一些缺点,如计算量太大、词之间的关联性没考虑等。


    五.权重计算

    前面讲述的词频权重计算的方法过于简单,下面就给大家介绍下其他权重计算方法。

    权重计算是指通过特征权重来衡量特征项在文档表示中的重要程度,给特征词赋予一定的权重来衡量统计文本特征词。常用的权重计算方法包括:布尔权重、绝对词频、倒文档词频、TF-IDF、TFC、熵权重等。

    1.常用权重计算方法

    (1) 布尔权重
    布尔权重是比较简单的权重计算方法,设定的权重要么是1,要么是0。如果在文本中出现了该特征词,则文本向量对应该特征词的分量赋值为1;如果该特征词没有在文本中出现,则分量为0。公式如下所示,其中wij表示特征词ti在文本Dj中的权重。

    在这里插入图片描述

    假设特征向量为:

    • {北京理工,大学生,前来,应聘,清华大学,也,我,喜欢,写,代码}

    现在需要计算句子“北京理工大学生前来应聘”的权重,则特征词在特征向量中存在的,对应分量为1,不存在的对应分量为0,最终特征向量结果为:

    • {1,1,1,1,0,0,0,0,0,0}

    但是实际应用中,布尔权重0-1值是无法体现特征词在文本中的重要程度,那就衍生出了词频这种方法。


    (2) 绝对词频
    词频方法又称为绝对词频(Term Frequency,简称TF),它首先计算特征词在文档中出现的频率,再来表征文本。通常使用tfij表示,即特征词ti在训练文本Dj中出现的频率。

    在这里插入图片描述

    假设句子为“北京理工大学的大学生和清华大学的大学生前来应聘”,而对应的特征词为:{北京理工,大学生,前来,应聘,清华大学,也,我,喜欢,写,代码,的,和},对应词频向量为:

    • {1,2,1,1,1,0,0,0,0,0,2,1}

    前面所采用的向量空间模型计算文本余弦相似性的例子也使用的是词频,这是权重计算方法中最简单、有效的方法之一。


    (3) 倒文档频率
    由于词频方法无法体现低频特征项的区分能力,往往存在某些特征项频率很高,却在文本中起到很低影响程度的现象,如“我们”、“但是”、“的”等词语;同时,有的特征项虽然出现的频率很低,但表达着整个文本的核心思想,起着至关重要的作用。

    倒文档频率(Inverse Document Frequency,简称IDF)方法是Spark Jones在1972年提出的,用于计算词与文献相关权重的经典方法。公式如下:

    在这里插入图片描述

    其中,参数|D|表示语料的文本总数,表示文本所包含特征词ti的数量。

    在倒文档频率方法中,权重是随着特征词的文档数量的变化呈反向变化。如某些常用词“我们”、“但是”、“的”等,在所有文档中出现频率很高,但它的IDF值却非常低。甚至如果它每篇文档都出现,则log1的计算结果为0,从而降低了这些常用词的作用;相反,如果某篇介绍“Python”的词,仅仅在该篇文档中出现,它的作用就非常高。

    同样还有很多权重计算方法,包括TF-IDF、熵权重、TF-IWF、基于错误驱动的特征权重算法等,读者可以自行研究,这里仅仅简单引入了最基础的几种方法。


    2.TF-IDF

    TF-IDF(Term Frequency-Invers Document Frequency)是近年来用于数据分析和信息处理经典的权重计算技术。该技术根据特征词在文本中出现的次数和在整个语料中出现的文档频率来计算该特征词在整个语料中的重要程度,其优点是能过滤掉一些常见却无关紧要的词语,尽可能多的保留影响程度高的特征词。

    其中,TF(Term Frequency)表示某个关键词在整篇文章中出现的频率或次数。IDF(Invers Document Frequency)表示倒文本频率,又称为逆文档频率,它是文档频率的倒数,主要用于降低所有文档中一些常见却对文档影响不大的词语的作用。TF-IDF的完整公式如下:

    在这里插入图片描述

    式中tfidfi,j表示词频tfi,j和倒文本词频idfi的乘积,TF-IDF中权重与特征项在文档中出现的频率成正比,与在整个语料中出现该特征项的文档数成反比。tfidfi,j值越大则该特征词对这个文本的重要程度越高。

    TF词频的计算公式如下:

    在这里插入图片描述

    其中,ni,j为特征词ti在训练文本Dj中出现的次数,是文本Dj中所有特征词的个数,计算的结果即为某个特征词的词频。

    TF-IDF公式推导如下所示:

    在这里插入图片描述

    TF-IDF技术的核心思想是如果某个特征词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来做权重计算。TF-IDF算法简单快速,结果也符合实际情况,其缺点是单纯以词频衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多,并且该算法无法体现词的位置信息。


    3.Sklearn计算TF-IDF

    Scikit-Learn是基于Python的机器学习模块,基本功能主要分为六个部分:分类、回归、聚类、数据降维、模型选择和数据预处理,具体可以参考官方网站上的文档。本书前面详细介绍了Scikit-Learn的安装及使用方法。这里主要使用Scikit-Learn中的两个类CountVectorizer和TfidfTransformer,用来计算词频和TF-IDF值。

    • CountVectorizer
      该类是将文本词转换为词频矩阵的形式。比如“I am a teacher”文本共包含四个单词,它们对应单词的词频均为1,“I”、“am”、“a”、“teacher”分别出现一次。CountVectorizer将生成一个矩阵a[M][N],共M个文本语料,N个单词,比如a[i][j]表示单词j在i类文本下的词频。再调用fit_transform()函数计算各个词语出现的次数,get_feature_names()函数获取词库中的所有文本关键词。

    计算result.txt文本的词频代码如下,下表是表1数据集被中文分词、数据清洗后的结果,如下所示。

    在这里插入图片描述

    贵州省 位于 中国 西南地区 简称 黔 贵
    走遍 神州大地 醉美 多彩 贵州
    贵阳市 是 贵州省 省会 有 林城 美誉
    数据分析 是 数学 计算机科学 相结合 产物 
    回归 聚类 分类 算法 广泛应用 数据分析
    数据 爬取 数据 存储 数据分析 紧密 相关 过程
    最 甜美 爱情 最 苦涩 爱情
    一只 鸡蛋 可以 画 无数次 一场 爱情
    真爱 往往 珍藏 最 平凡 普通 生活
    

    代码如下:

    #coding:utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer  
      
    #存储读取语料 一行预料为一个文档
    corpus = []  
    for line in open('result.txt', 'r', encoding="utf-8").readlines():  
        corpus.append(line.strip())
        
    #将文本中的词语转换为词频矩阵  
    vectorizer = CountVectorizer()
    
    #计算个词语出现的次数  
    X = vectorizer.fit_transform(corpus)
    
    #获取词袋中所有文本关键词  
    word = vectorizer.get_feature_names()  
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')
        
    #查看词频结果  
    print(X.toarray())
    

    输出如下图所示。

    在这里插入图片描述

    • TfidTransformer
      当使用CountVectorizer类计算得到词频矩阵后,接下来通过TfidfTransformer类实现统计vectorizer变量中每个词语的TF-IDF值,代码补充如下。
    #coding:utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer  
    from sklearn.feature_extraction.text import TfidfTransformer
    
    #存储读取语料
    corpus = []  
    for line in open('result.txt', 'r', encoding="utf-8").readlines():  
        corpus.append(line.strip())
    vectorizer = CountVectorizer()        #将文本中的词语转换为词频矩阵 
    X = vectorizer.fit_transform(corpus)  #计算个词语出现的次数  
    word = vectorizer.get_feature_names() #获取词袋中所有文本关键词   
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')  
    print(X.toarray())                    #查看词频结果 
    
    #计算TF-IDF值
    transformer = TfidfTransformer()  
    print(transformer)
    tfidf = transformer.fit_transform(X) #将词频矩阵X统计成TF-IDF值  
    #查看数据结构 
    print(tfidf.toarray())               #tfidf[i][j]表示i类文本中的tf-idf权重
    

    运行部分结果如下图所示。

    在这里插入图片描述

    TF-IDF值采用矩阵数组的形式存储,每一行数据代表一个文本语料,每一行的每一列都代表其中一个特征对应的权重,得到TF-IDF后就可以运用各种数据分析算法进行分析,比如聚类分析、LDA主题分布、舆情分析等等。


    六.文本聚类

    获取文本TF-IDF值之后,本小节简单讲解使用TF-IDF值进行文本聚类的过程,主要包括如下五个步骤:

    • 第一步,对中文分词和数据清洗后的语料进行词频矩阵生成操作。主要调用CountVectorizer类计算词频矩阵,生成的矩阵为X。
    • 第二步,调用TfidfTransformer类计算词频矩阵X的TF-IDF值,得到Weight权重矩阵。
    • 第三步,调用Sklearn机器学习包的KMeans类执行聚类操作,设置的类簇数n_clusters为3,对应语料贵州、数据分析和爱情的三个主题。然后调用fit()函数训练,并将预测的类标赋值给y_pred数组。
    • 第四步,调用Sklearn库PCA()函数进行降维操作。由于TF-IDF是多维数组,是9行文本所有特征对应的权重,而在绘图之前需要将这些特征降低为二维,对应X和Y轴。
    • 第五步,调用Matplotlib函数进行可视化操作,绘制聚类图形,并设置图形参数、标题、坐标轴内容等。

    代码如下。

    # coding:utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer  
      
    #第一步 生成词频矩阵
    corpus = []  
    for line in open('result.txt', 'r', encoding="utf-8").readlines():  
        corpus.append(line.strip())
    vectorizer = CountVectorizer() 
    X = vectorizer.fit_transform(corpus) 
    word = vectorizer.get_feature_names()    
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')  
    print(X.toarray())
    
    #第二步 计算TF-IDF值
    transformer = TfidfTransformer()  
    print(transformer)
    tfidf = transformer.fit_transform(X)
    print(tfidf.toarray())
    weight = tfidf.toarray()
    
    #第三步 KMeans聚类
    from sklearn.cluster import KMeans  
    clf = KMeans(n_clusters=3)  
    s = clf.fit(weight) 
    y_pred = clf.fit_predict(weight)
    print(clf)
    print(clf.cluster_centers_) #类簇中心
    print(clf.inertia_)         #距离:用来评估簇的个数是否合适 越小说明簇分的越好
    print(y_pred)               #预测类标
    
    #第四步 降维处理
    from sklearn.decomposition import PCA  
    pca = PCA(n_components=2)   #降低成两维绘图 
    newData = pca.fit_transform(weight)  
    print(newData)
    x = [n[0] for n in newData]  
    y = [n[1] for n in newData]  
    
    #第五步 可视化
    import numpy as np  
    import matplotlib.pyplot as plt   
    plt.scatter(x, y, c=y_pred, s=100, marker='s')  
    plt.title("Kmeans")    
    plt.xlabel("x")  
    plt.ylabel("y")    
    plt.show() 
    

    聚类输出如图所示。

    请添加图片描述

    图中共绘制了6个点,将数据聚集为三类,对应不同的颜色。其中对应的类标为:

    • [2 0 2 0 0 0 1 1 0]

    它将第1、3行语料聚集在一起,类标为2;第2、4、5、6、9行聚集为一组,类标为0;第7、8行语料聚集为最后一组,类标为1。而真实数据集中,第1、2、3行表示贵州主题,第4、5、6行表示数据分析主题,第7、8、9行表示爱情主题,所以数据分析预测结果会存在一定误差,我们需要将误差尽可能的降低,类似于深度学习,也是在不断学习中进步。

    您可能会疑惑为什么9行数据,却只绘制了6个点呢?下面是9行数据进行降维处理生成的X和Y坐标,可以看到部分数据是一样的,这是因为这9行语料所包含的词较少,出现的频率基本都是1次,在生成词频矩阵和TF-IDF后再经降维处理可能出现相同的现象,而真实分析中语料所包含词语较多,聚类分析更多的散点更能直观地反应分析的结果。

    [[-0.19851936  0.594503  ]
     [-0.07537261  0.03666604]
     [-0.19851936  0.594503  ]
     [-0.2836149  -0.40631642]
     [-0.27797826 -0.39614944]
     [-0.25516435 -0.35198914]
     [ 0.68227073 -0.05394154]
     [ 0.68227073 -0.05394154]
     [-0.07537261  0.03666604]]
    

    研究生期间,作者在研究知识图谱、实体对齐知识时,曾采用过KMeans聚类算法对所爬取的四个主题百科数据集进行文本聚类分析,其聚类结果如图所示。

    在这里插入图片描述

    图中红色表示旅游景点主题文本、绿色表示保护动物主题文本、蓝色表示人物明星主题文本、黑色表示国家地理主题文本。从图中可以发现四类主题分别聚集成四个类簇。这是文本分析的一个简单示例,希望读者能根据本章的知识点,分析自己所研究的文本知识。


    七.总结

    前面讲述的数据分析内容几乎都是基于数字、矩阵的,而也有一部分数据分析会涉及文本处理分析,尤其是中文文本数据,它们究竟怎么处理呢?当我们通过网络爬虫得到中文语料之后,我们究竟能不能进行数据分析呢?答案肯定是能的。

    但是不同于之前的数据分析,它还需要经历中文分词、数据清洗、特征提取、向量空间模型、权重计算等步骤,将中文数据转换为数学向量的形式,这些向量就是对应的数值特征,然后才能进行相应的数据分析。本章讲解贯穿着自定义的数据集,它包含了贵州、数据分析、爱情三个主题的语料,采用KMeans聚类算法进行实例讲解,希望读者认真学习,掌握中文语料分析的方法,如何将自己的中文数据集转换成向量矩阵,再进行相关的分析。

    在这里插入图片描述

    最后希望读者能复现每一行代码,只有实践才能进步。同时更多聚类算法和原理知识,希望读者下来自行深入学习研究,也推荐大家结合Sklearn官网和开源网站学习更多的机器学习知识。

    该系列所有代码下载地址:

    感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~

    在这里插入图片描述

    (By:娜璋之家 Eastmount 2021-08-06 夜于武汉 https://blog.csdn.net/Eastmount )


    参考文献:

    • [1] 杨秀璋. 专栏:知识图谱、web数据挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.
    • [2] 杨秀璋. [python] LDA处理文档主题分布及分词、词频、tfidf计算[EB/OL]. (2016-03-15)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50891162.
    • [3] 杨秀璋. [python] 使用scikit-learn工具计算文本TF-IDF值[EB/OL]. (2016-08-08)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50323063.
    • [4] 杨秀璋. [python] 基于k-means和tfidf的文本聚类代码简单实现[EB\OL]. (2016-01-16)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50473675.
    • [5] 杨秀璋. [python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像[EB/OL]. (2016-01-20)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50545937.
    • [6] 张良均,王路,谭立云,苏剑林. Python数据分析与挖掘实战[M]. 北京:机械工业出版社,2016.
    • [7] (美)Wes McKinney著. 唐学韬等译. 利用Python进行数据分析[M]. 北京:机械工业出版社,2013.
    • [8] Jiawei Han,Micheline Kamber著. 范明,孟小峰译. 数据挖掘概念与技术. 北京:机械工业出版社,2007.
    展开全文
  • 文本匹配(语义相似度)综述

    万次阅读 多人点赞 2020-04-11 21:34:30
    打卡的任务场景和数据集 一、相似度计算&复述识别(textual similarity¶phrase identification) 二、问答匹配(answer selection) 三、对话匹配(response selection) 四、自然语言推理/文本蕴含识别...
  • 文本匹配方法系列––BERT匹配模型

    千次阅读 2020-06-03 10:51:35
    在介绍深层次交互匹配方法之前,本文接着多语义匹配方法[1]介绍基于BERT模型实现文本匹配的方法。将其单独介绍主要因为BERT实现文本匹配操作方便且效果优秀,比较适用于工业应用场景。关于bert模型,Dev
  • NLP之文本匹配及语义匹配应用介绍

    万次阅读 多人点赞 2019-07-11 18:11:57
    2、文本匹配方法概述2-1 传统文本匹配方法2-2 主题模型2-3 深度语义匹配模型表示型交互型3、语义匹配应用介绍3-1 短文本-短文本语义匹配3-2 短文本-长文本语义匹配案例1-用户查询-广告页面相似度案例2:文档关键词...
  • 我当前正在分析具有以下结构的日志文件:1)时间戳,前接#字符,接\n2)任意#在该时间戳之后发生的事件,所有事件都后跟\n3)重复。。在这是一个exmaple:#10004!03!02!#12990L0K0J0E#133506!0X#0[#b1010 Z$b1x [$......
  • 深度文本匹配的基本方法

    千次阅读 2018-07-05 12:02:49
    基于单语义文档表达的深度学习模型主要思路是,首先将单个文本先表达成一个稠密向量(分布式表达),然后直接计算两个向量间的相似度作为文本间的匹配度。 基于多语义文档表达的深度学习模型 基于多语义的文档表达...
  • NLP | 搜索文本匹配算法

    千次阅读 2020-07-17 18:26:13
    搜索即找到跟搜索词句很相似的文本,例如在百度中搜索"人的名",结果如下 那么怎么评价两个文本之间的相似度呢? 余弦相似度 (cosine similiarity) 本文介绍基于VSM(Vector Space Model) 的余弦相似度算法来...
  • 中文/英文 文本相似度/文本推理/文本匹配数据集汇总(SNLI、MSRP、MultiNLI、Quora、SciTail、SICK、STS、CCKS2018、LCQMC、OCNLI、XNLI)1. 所有数据集合集1.1 包含的数据集1.2 合集链接2. 英文数据集2.1 MSRP2.2 ...
  • 文本数据清洗

    千次阅读 2021-11-24 22:24:31
    新闻文本数据中不仅包括了中文字符,还包括了数字、英文字符、标点等非常规字符,这些都是无意义,并且需要处理的数据,清洗的方法使用的是正则表达式。 方法一:借助Unicode编码,16进制筛出中文字符 匹配规则为...
  • 【比赛报告】biendata_2021搜狐校园文本匹配算法大赛_解决方案前言一、赛题二、模型设计三、训练技巧和提升方案四、总结代码开源 前言 比赛网页 之前写过相关的赛题解读,想了解的朋友移步《语义匹配(二)搜狐...
  • 深度文本匹配发展总结

    万次阅读 2018-07-28 02:39:15
    文本匹配是自然语言处理中的一个核心问题,很多自然语言处理的任务都可以抽象成文本匹配问题,例如信息检索可以归结成查询项和文档的匹配,问答系统可以归结为问题和候选答案的匹配,对话系统可以归结为对话和回复的...
  • 海量文本相似度匹配

    千次阅读 2018-12-14 10:41:37
    1 词与词之间的匹配(主要用于分词,单词补全,模板匹配) 1.1 一对一 KMP 1.2一对多 前缀树 1.3多对多 给一个字典,再给一个m长的文本(m长的文本里面包含很多的词),问这个文本里出现了字典里的哪些字。 ...
  • 文本匹配文本相似度模型之DSSM

    千次阅读 2019-05-14 18:17:30
    本文是我的匹配模型合集的其中一期,如果你想了解更多的匹配模型,欢迎参阅我的另一篇博文匹配模型合集 所有的模型均采用tensorflow...DSSM也算是深度学习在文本匹配领域中的一个先驱者,接下来我们会先从其结构开...
  • 1. 文本相似度问题与应用 2. 文本相似度模型介绍 3. 实战:基于Python实现编辑距离 4. 实战:基于simhash实现相似文本判断 5. 实战:词向量Word AVG 1. 文本相似度问题与应用 文本相似度问题 文本相似度问题...
  • mysql去除(富文本)html标签 模糊匹配

    千次阅读 2020-09-25 16:27:53
    有时我们数据库存的文本是富文本,当我们需要对其进行搜索,我们对数据进行模糊匹配,但是会引发一个问题,富文本标签也被匹配到了,虽然不是什么大问题,但是也是有可能会影响用户体验的,所以我们需要对其进行处理...
  • 向AI转型的程序员都关注了这个号????????????机器学习AI算法工程 公众号:datayx针对互联网求职招聘场景的人岗匹配推荐问题,本文提出了一种建模求职者与招聘者双方偏好的新型...
  • 一种解决bert长文本匹配的方法

    千次阅读 2019-11-05 21:39:18
    bert1提出来打开了迁移学习的大门,首先通过无监督的语料训练通用的语言模型,然后基于自己的语料微调(finetune)模型来达到不同的业务需求。我们知道bert可以支持的最大token长度为512,如果最大长度超过512,该...
  • 短文本匹配的一些经典方法和常用深度学习方法的论文阅读

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 380,586
精华内容 152,234
关键字:

匹配后的数据变文本