购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 标题重复

标题重复也称内部重复,特指短标题(其字数通常在20个汉字以内)中存在不同程度的语义和内容重复,严重影响用户的体验。表2-1是一些常见标题重复示例。

表2-1 常见标题重复示例

表2-1中的示例是在实际业务场景中遇到的情况,文本标题内容重复较为严重,属于非常低质的内容。在处理这些内容时,我们不仅需要检测出标题是否重复,而且需要对标题重复进行修正,保证标题内容的丰富性。

2.1.1 标题符号规整化处理

本节主要介绍标题符号规整化处理的主要原因,以及规整化处理的方式,通过具体的实现代码可以清晰地看到在业务背景中如何更好地使用数据,更好地让数据在算法中发力,从而高效地解决业务中的低质标题问题。

1.标题符号规整化处理的原因

标题符号规整化是对标题中不符合规则的标点符号进行标准化处理,属于数据预处理的范围,是标题内容重复处理的前提和关键所在。标点符号处理不严谨,将会严重影响后期内容去重的质量。表2-2是一些不规整标题符号示例。

表2-2 不规整标题符号示例

表2-2中有各种不同类型的标点符号重复的情况,在涉及大量数据的场景中,这种低质的内容非常影响内容质量和用户体验,如果不进行良好的内容理解,很难保证推荐和搜索等场景中内容标题的质量。大数据时代,数据是算法的灵魂,解读和分析好数据至关重要。

2.标题符号规整化处理的方式

首先,构建一份标点符号全量词表,用来判断句子中哪些是标点符号,同时构建一份白名单词表,用来判断句子中哪些标点符号属于正常现象,防止过多过滤,将重复的标点符号转换成单个,将起始位置的不合常规的标点符号去掉,将中途的不合常规的标点符号替换成空格,并对白名单中存在缺失的标点符号进行补全。接下来我们将实现标题符号规整化的功能,其实现代码如下所示:

经过标题符号规整化处理之后,文本标题中95%以上的标题是规整的标题,为后续的标题去重打下了非常坚实的基础。

2.1.2 Jieba分词

Jieba分词是Python的一个中文分词组件,支持对中文文本进行分词、词性标注、关键词抽取等功能,并且支持自定义词典。Jieba分词具有支持三种分词模式、繁体分词、自定义词典等多种特点。

1.Jieba分词包的安装

Jieba分词包的安装主要有以下三种方式。

1)全自动安装:pip install jieba/pip3 install jieba。

2)半自动安装:先从https://pypi.python.org/pypi/jieba/下载,解压后运行python setup.py install。

3)手动安装:将jieba目录放置于当前目录或者site-packages目录。

选择上面三种方式的任意一种进行Jieba分词包的安装,最后通过import jieba引用即可。

2.Jieba分词的方式

Jieba分词在应用场景中通常使用下面两种函数实现分词功能。

1)Jieba.cut:该函数接收三个输入参数,首先是需要分词的字符串,然后是cut_all参数,用来控制是否采用全模式,最后是HMM参数,用来控制是否适用HMM模型。

2)Jieba.cut_for_search:该函数接收两个参数,一个是需要分词的字符串,另一个是决定是否使用HMM模型的参数。该方法适用于搜索引擎构建倒排索引的分词,粒度比较细。

注意:待分词的字符串可以是unicode、utf-8、gbk类型的字符串。不建议直接输入gbk类型的字符串,可能无法预料地误解码成utf-8类型。

3.Jieba示例展示

了解了Jieba分词包的安装流程以及分词的方法之后,下面将重点讲解如何在业务场景中使用Jieba分词,主要介绍精确模式、全模式、搜索引擎模式的分词实现以及词性获取等。

1)精确模式:试图将句子最精确地切开,适合文本分析。

2)全模式:把句子中所有可以成词的词语都切分出来,速度非常快,但是不能解决歧义问题。

3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适用于搜索引擎分词。

4)词性获取:分词的词性有助于我们更好地展开业务,因此,需要获得每个词的词性,比如名词、动词、代词等。例如:在过滤词性操作场景中,只需要用到名词。

以上用代码实现如下:

结果如下:

4.Jieba分词的性能分析

Jieba分词的性能分析是指通过对用户词典的限度分析探究对其性能的影响以及探究什么类型的词语更容易召回。

1)用户词典的限度。从源码大小来看,整个Jieba分词的源码总容量为81MB,其中系统词典dict.txt的大小为5.16MB,所以用户词典至少可以大于5.16MB;从词典中的词语数量来看,系统词典总的词语数共349047行,每一行包括词语、词频、词性三个属性,所以初步可以判断用户词典可以很大。表2-3用一些具体数据总结了词典大小对效率的影响。

表2-3 词典大小对效率的影响

通过表2-3可以看出,词表大小和加载时间成正比,词表越大,加载的时间越长。但是加载的词典一般保留在内存中,造成内存和I/O负担较大。

2)相同前缀和后缀的区分。针对无尿急、尿频、尿痛的专业领域的分词,需要在Jieba分词中导入用户词典才能正确区分出来,相关案例如下:

/患者/3/小时/前/无/明显/诱因/出现/上/腹部/疼痛/,/左/上腹/为主/,/持续性/隐痛/,/无/放射/,/无/恶心/及/呕吐/,/无/泛酸/及/嗳气/,/无/腹胀/及/腹泻/,/无/咳嗽/及/咳痰/,/无/胸闷/及/气急/,/无/腰酸/及/腰疼/,/无/尿急/、/尿频/及/尿痛/,/无/头晕/,/无/黑/矇/,/无/畏寒/及/发热/,/无尿/黄/,/无/口苦/,/来/我院/求治/。

可以发现“无尿黄”被划分为“无尿/黄”,查询用户词典后,发现词典中并没有尿黄这个词语,此问题属于词典覆盖不全。但是在词表中确实同时存在无尿和尿频两个词语,初步分析问题可能由词语在词典中的顺序导致,或者由Jieba分词系统内部的分词策略所致;一种可能的分析是,打开词典发现无尿在14221行,尿频在13561行,现在将无尿放在第一行,结果仍然为无/尿频,所以,结果是由Jieba分词内部的算法策略导致的。当两个词语的词频相同时,后匹配的词语优先。

腰部酸痛、腰部、酸痛在词表中同时存在且词频相同,返回的结果优先是腰部酸痛。如果腰部和酸痛的词频高于腰部酸痛的词频,结果仍然返回腰部酸痛,即更倾向于分词长度更长的词语,这样容易扩大召回数量,内容也更加精准和全面。

2.1.3 LAC分词

LAC(Lexical Analysis of Chinese)是百度自然语言处理部研发的一款联合的词法分析工具,支持中文分词、词性标注、专名识别等功能。在实际的业务场景中,需要结合具体的业务选择分词方式,即根据业务效果选择具体的分词方式。

1.LAC分词的安装

LAC分词的安装主要有以下三种方式。

1)全自动安装:pip install lac。

2)半自动安装:先从http://pypi.python.org/pypi/lac/下载,解压后运行python setup.py install。

3)国内网络可使用百度源安装:pip install lac -i https://mirror.baidu.com/pypi/simple。

以上安装方式对Python 2/3均兼容,可结合自己的喜好选择合适的安装方式。LAC有1.0和2.0两个版本,在码云中显示的是1.0版本,但是并没有特意标明。由于LAC1.0版本的安装过程比较麻烦且容易出错,建议优先安装LAC 2.0版本;如果是Windows系统想用WSL(Windows Subsystem for Linux)安装LAC,不能使用WSL 1.0版本,因为其不支持LAC的依赖组件飞桨(Paddle),也就没办法正确安装LAC。安装LAC时需要注意Python的版本尽量不能超过3.7。

2.LAC分词的使用

LAC分词使用简单,主要包括加载默认模型、加载干预词典以及如何设计更好的分词方式等方面的操作,其实现代码如下所示:

结果如下:

3.LAC分词的优势

通过深度学习模型联合学习分词、词性标注、专名识别任务,整体的F1值超过0.91,词性标注的F1值超过0.94,专名识别的F1值超过0.85,效果业内领先。精简模型参数,结合飞桨预测库的性能优化,CPU单线程性能达到800 QPS,效率业内领先。

实现简单可控的干预机制,精准匹配用户词典对模型进行干预。词典支持长片段形式,使得干预更为精准。支持一键安装,同时提供Python、Java和C++调用接口与调用示例,实现快速调用和集成。定制超轻量级模型,大小仅为2MB,由于主流千元手机单线程性能达200 QPS,因此它能够满足大多数移动端应用的需求,同等体量级效果业内领先。

4.LAC分词的适用场景

LAC分词的适用场景主要与实体识别任务相关,比如知识图谱、知识问答、信息抽取等,也可以作为其他模型算法的基础工具。因为,LAC分词是以实体作为粒度的,同时兼具实体识别的效果,而在搜索引擎中使用的分词粒度会更小一些,或者同时提供多种粒度,如果要面向搜索的分词,用户可以自行微调模型。

2.1.4 基于分词及字符串等方式进行重复识别

基于分词方式识别标题是否重复是很容易想到的一种方式,它首先通过不同的方式对标题进行分词操作,然后通过分词结果重复的占比来决定重复程度。在选择具体的阈值时,需要结合具体的情况而定。下面主要介绍基于Jieba分词方式的重复识别过程。基于LAC分词方式的重复识别过程读者可以自行了解,本章不再进行详细讲解。

1.基于Jieba分词方式进行重复识别

基于分词方式的重复识别过程:首先对标题进行符号规整化处理,然后通过Jieba分词和LAC分词方式对标题进行分词处理,最后通过列表去重方式,统计去重之后的结果长度和原有标题的分词长度的占比,利用不同的阈值划分重复程度。基于Jieba分词方式进行重复程度识别的实现代码如下所示:

在分词去重的过程中,只有选择更加合理的阈值,才能在业务场景中产生较好的结果,因此,需要探究不同阈值划分对准确率的影响,如表2-4所示。

表2-4 不同阈值划分对准确率的影响

如表2-4所示,随着阈值的提升,准确率在逐渐升高。阈值的划分可以体现出重复的程度,但是只有结合具体的应用场景选择合理的阈值,才能产生最佳的业务效果。

2.基于字符串方式进行重复识别

一般在实践的过程中,通过分词方式进行文本内容重复识别(去重)的时候,需要合理地划分阈值,但选定阈值的过程特别费时费力。如果内容不多,可以考虑基于字符串或者正则表达式的方式(即字符串去重和正则表达式去重方式)进行重复识别,使用时需要结合具体的数据评估效果进行方式选择。

1)字符串去重:通过字符串重复的特点进行去重,其长度必定能够被重复序列的长度整除;可以生成从1到 n /2的长度除数的解决方案,将原始字符串除以具有除数长度的子串,并测试结果集的相等性。字符串去重的实现代码如下所示:

2)正则表达式去重:通过正则表达式进行内容去重。例如,正则表达式(.+?)\1+$分为三部分:(.+?)是一个匹配组,包含至少一个(但尽可能少)任意字符;\1+检测第一部分中匹配组至少出现一次重复;$检查字符串的结尾,以确保在重复的子字符串之后没有额外的非重复内容,并且使用re.match()确保在重复的子字符串之前没有非重复的文本。正则表达式去重的实现代码如下所示:

基于分词方式去重或者字符串等方式去重是在场景中比较容易想到的,通常适用范围比较有限,适合针对标题重复这种简单的问题,通过数据进行评估并查看效果。下面会在段落重复识别中讲解通过N-gram算法进行重复识别的过程。 Cg9y7lcRZ9patYrCXipS0tQ/RkDvMdWKxw0LujEmBnG/j9B6I73Kl6wcPx7h5UOq

点击中间区域
呼出菜单
上一章
目录
下一章
×