文章相似度是在字符串相似度的基础上,基于词,计算两两文章或者句子之间的相似度,其中文章或句子需要以空格分割。本文为您介绍文章相似度算法组件的配置方法。
背景信息
文章相似度的计算方式和字符串相似度类似,支持Levenshtein(Levenshtein Distance)、lCS(Longest Common SubString)、SSK(String Subsequence Kernel)、Cosine(Cosine)和Simhash_Hamming五种相似度计算方式。
Levenshtein支持计算距离和相似度。
距离在参数中表示为levenshtein。
相似度=1-距离。在参数中表示为levenshtein_sim。
lCS支持计算距离和相似度。
距离在参数中表示为lcs。
相似度=1-距离。相似度在参数中表示为lcs_sim。
SSK支持计算相似度,在参数中表示为ssk。
Cosine支持计算相似度,在参数中表示为cosine。
Simhash_Hamming,其中SimHash算法是把原始的文本映射为64位的二进制指纹,Hamming Distance则是计算二进制指纹在相同位置上不同字符的个数,支持计算距离和相似度。
距离在参数中表示为simhash_hamming。
相似度=1-距离/64.0。相似度在参数中表示为simhash_hamming_sim。
说明关于SimHash详细介绍请参见Similarity Estimation Techniques from Rounding Algorithms。
关于HammingDistance详细介绍请参见wiki。
使用限制
支持的计算引擎为MaxCompute。
组件配置
您可以使用以下任意一种方式,配置文章相似度组件参数。
方式一:可视化方式
在Designer(原PAI-Studio)工作流页面配置组件参数。
页签 | 参数 | 描述 |
字段设置 | 相似度计算中第一列的列名 | 默认为表中第一个string类型的列名。 |
相似度计算中第二列的列名 | 默认为表中第二个string类型的列名。 | |
输出表追加的列名 | 指定输出表中追加的列名。 | |
输出表中相似度列的列名 | 指定输出表中相似度列的列名,默认值为output。 说明 列名中不能有特殊字符,只能用英文的a-z,A-Z及数字和下划线_,且以字母开头,名称的长度不超过128字节。 | |
参数设置 | 相似度计算方法 | 指定相似度计算方法类型。取值范围为:
|
子串的长度,ssk和cosine中可用 | 仅当相似度计算方法取值为levenshtein、ssk或cosine时,该参数生效。取值范围为(0,100)。默认值为2。 | |
匹配词组合的权重,ssk中可用 | 仅当相似度计算方法取值为ssk时,该参数生效。取值范围为(0,1)。默认值为0.5。 | |
执行调优 | 计算的核心数 | 系统自动选择。 |
每个核心的内存(MB) | 系统自动选择。 |
方式二:PAI命令方式
使用PAI命令方式,配置该组件参数。您可以使用SQL脚本组件进行PAI命令调用,详情请参见SQL脚本。
PAI -name doc_similarity
-project algo_public
-DinputTableName="pai_test_doc_similarity"
-DoutputTableName="pai_test_doc_similarity_output"
-DinputSelectedColName1="col0"
-DinputSelectedColName2="col1"
参数名称 | 是否必选 | 描述1 | 默认值 |
inputTableName | 是 | 输入表的表名。 | 无 |
outputTableName | 是 | 输出表的表名。 | 无 |
inputSelectedColName1 | 否 | 相似度计算中第一列的列名。 | 表中第一个类型为string的列名 |
inputSelectedColName2 | 否 | 相似度计算中第二列的列名。 | 表中第二个类型为string的列名 |
inputAppendColNames | 否 | 输出表追加的列名。 | 不追加 |
inputTablePartitions | 否 | 输入表选中的分区。 | 选择全表 |
outputColName | 否 | 输出表中相似度列的列名。 说明 列名中不能有特殊字符,只能用英文的a-z,A-Z及数字和下划线_,且以字母开头,名称的长度不超过128字节。 | output |
method | 否 | 相似度计算方法,取值范围:
| levenshtein_sim |
lambda | 否 | 匹配词组合的权重,ssk中可用,取值范围为(0,1)。 | 0.5 |
k | 否 | 子串的长度,ssk和cosine中可用。取值范围为(0,100)。 | 2 |
lifecycle | 否 | 指定输出表的生命周期。 | 无 |
coreNum | 否 | 计算的核心数。 | 系统自动分配 |
memSizePerCore | 否 | 每个核心的内存,单位为MB。 | 系统自动分配 |
示例
生成数据
使用ODPS SQL节点创建表pai_ft_string_similarity_topn_input。命令如下:
drop table if exists pai_doc_similarity_input; create table pai_doc_similarity_input as select * from ( select 0 as id, "北京 上海" as col0, "北京 上海" as col1 union all select 1 as id, "北京 上海" as col0, "北京 上海 深圳" as col1 )tmp
执行成功后,输入表pai_doc_similarity_input的数据如下:
id
col0
col1
1
北京 上海
北京 上海 深圳
0
北京 上海
北京 上海
运行PAI命令
您可以使用SQL脚本执行如下PAI命令,也可以使用ODPS SQL节点执行如下PAI命令。
drop table if exists pai_doc_similarity_output; PAI -name doc_similarity -project algo_public -DinputTableName=pai_doc_similarity_input -DoutputTableName=pai_doc_similarity_output -DinputSelectedColName1=col0 -DinputSelectedColName2=col1 -Dmethod=levenshtein_sim -DinputAppendColNames=id,col0,col1;
输出结果
输出表为pai_doc_similarity_output,如下所示。
id
col0
col1
output
1
北京 上海
北京 上海 深圳
0.6666666666666667
0
北京 上海
北京 上海
1.0
常见问题
相似度计算是基于分词的结果,即以空格分割的每个词作为相似度计算的一个单位。如果是以字符串整体输入,需要使用字符串相似度方法。
参数method中,levenshtein、lcs、simhash_hamming为计算距离。levenshtein_sim、lcs_sim、ssk、cosine、simhash_hamming_sim为计算相似度。距离=1.0-相似度。
相似度计算方法为cosine或ssk时,存在参数k,表示以k个词作为一个组合,进行相似度计算。如果k大于词的个数,即是两个相同的字符串,相似度输出也为0。此时需要调小k的值,使其小于或等于最小词个数。
相关文档
关于Designer组件更详细的内容介绍,请参见Designer概述。
您可以使用字符串相似度组件来计算字符串相似度,详情请参见字符串相似度。
Designer预置了多种算法组件,你可以根据不同的使用场景选择合适的组件进行数据处理,详情请参见组件参考:所有组件汇总。