改进的LCS算法的应用

    笔者在做毕设的时候遇到过一种有趣的近义词识别问题。该问题是想简化每种岗位里的技能实体的数量,比如说java开发工程师里有(java开源框架)和(java相关框架)这两个相似的技能实体。也许有人会认为直接使用word2vec模型就可以很好地解决近义词问题,但是笔者认为word2vec比较适用于粗粒度的近义词识别问题,并不适合于此类细粒度的近义词识别问题,例如使用word2vec很有可能会认为python与java是一对近义词,这是因为用于训练的语料中有很多诸如(熟练使用python、java、mysql等编程语言)这样的句子。(笔者的技能实体数据来自于各种职业的招聘要求信息中)

    为了解决上述问题,笔者想到了一个改进的LCS算法,经测试其在四个不同的职业中的技能实体近义词识别的precision为87.3%,整体效果尚可。

    为了向大家介绍这个改进的LCS算法,我们先来看看什么是LCS算法。

    LCS算法的是动态规划中的一个算法,其学名为最长公共子序列算法。最长公共子序列算法的目的是找寻两个字符串之间的共有部分长度,比如说abcbdab与becgba的最长公共子序列是bcba,一共四个字符长度。

       最长公共子序列的问题的解决方案有两种,一种是使用暴力搜索策略,另一种是使用动态规划思想的策略。

    使用暴力搜索的话势必会产生很大一部分重复遍历,字符串A和字符串B首先要取得所有的子序列情况,时间复杂度分别为:

    因此可以发现暴力的解决最大公共子序列问题会带来无法承受的时间复杂度。因此才有了基于动态规划的LCS算法。

    对于LCS算法,其的基本思想是找到字符串A的第i号位和字符串B的第j号位之前的最大公共子序列的长度。如果A[i]==B[j],则dp[i][j]=dp[i-1][j-1]+1,否者的话就是使得dp[i][j]=max(dp[i][j-1],dp[i-1][j]),由此可以得到状态转义的公式:

其边界为:dp[i][0]=dp[0][j]=0,其中0<=i<=m,0<=j<=n。其中时间复杂度为O(m*n)。

       下面再来看看笔者改进的LCS算法是怎样的。

    改进的LCS算法的思路是:

    第一步:用正则表达式将每个技能实体的英文单词和中文单字抽取出来,按照原来的顺序排列好,避免出现语序打乱出现语义改变的情况,例如:将Java开源框架分割成(Java、开、源、框、架)五个字。

    第二步:取字符串A和字符串B的中最少的分词数为n。

    第三步:利用LCS算法计算字符串A与字符串B的最大公共子序列数为x。

    第四步:根据如下公式进行判断是否为近义词。

改进的LCS算法的应用_第1张图片

    上述公式中的a和length为一个阈值,其随不同的领域设置的值可以不一样,其中的length为整数,并且公式中的x表示的是字符串A和字符串B的最大公共子序列数,而公式中的n则表示的是字符串A和字符串B中的最小分词数,最后公式结果中的1代表是近义词,0代表不是近义词。其中n<=length的时候,以字符串A顺序包含字符串B或者字符串B顺序包含字符串A为近义词,否者不为近义词。当n>length时,以f(x)>=a*n时为近义词,否则判断为不是近义词。其中本文通过对a和length的取值,最后根据经验得出当a=0.8并且length=4的时候,该算法方程在人力资源领域中的技能实体的近义词识别中效果比较好。

    下面来看下改进的LCS算法效果。笔者在其中选取了四个不同的岗位来展示效果这四个岗位分别是:1.前端开发工程师;2.java开发工程师;3.销售运营专员;4.税务专员。

    先进行改进的LCS算法在人力资源技能实体的近义词识别中的效果展示。

改进的LCS算法的应用_第2张图片

前端开发工程师的部分近义词

    前端开发工程师总共识别了出来了61对近义词,其中51对近义词经过人工标注检查为正确的,剩下的10个为错误或者不合理的近义词,在前端开发工程师中的precision为82.0%。

改进的LCS算法的应用_第3张图片

java开发工程师近义词部分接口

    java开发工程师岗位中共识别出67对近义词,其中62对为正确或者合理的近义词,其precision为92.5%。

改进的LCS算法的应用_第4张图片

销售运营专员近义词

    销售运营专员中的共识别出了20个近义词对,其中16对为正确或者合理的,其precision为80%。

改进的LCS算法的应用_第5张图片

税务专员近义词

    税务专员中一共识别出来了18对近义词,其中17对为正确或者合理的,其precision为94.4%。

    经过上述的讨论,在前端开发工程师、java开发工程师、销售运营专员、税务专员这四个岗位中,一共识别出来了166对近义词,其中经过人工比较后有145对近义词为正确的或者合理的,整体precision为87.3%。

 

       下面做一个改进的LCS算法和百度AI短文本相似度算法结果的比较。(以前端开发工程师为例)

    下面是改进的LCS算法在前端开发工程师岗位中识别技能实体的近义词的部分效果图:

改进的LCS算法的应用_第6张图片

改进的LCS算法效果图

    下图将展示的是百度AI通用型短文本相似度算法在前端开发工程师岗位中的技能实体的近义词识别效果图:

改进的LCS算法的应用_第7张图片

百度AI算法的效果图

       相信大家还是觉得上述效果还不错,如果想要源码的同学可以在公众号后台回复改进的LCS算法来获取代码。(公众号:faceSchool)

你可能感兴趣的:(改进的LCS算法的应用)