一、分词及相似度的比对
近期的工作内容涉及到了关于数据相似度比对的处理。现针对一些重点内容做以总结。
主要目的是根据本地库中的商家信息和从大众点评等网站抓取到的商家信息,找出不在本地库中包含的商家。现主要根据商家名称和商家地址两个属性来确定是否是同一个商家。因数据来源不同,所以商家名称和地址等信息在数据完整性、准确性、规范性等方面都存在误差。因此,需要将两组数据的商家名称和地址进行分词,划分为粒度较小的词,之后再按照相似度比对的算法进行处理。
1.分词
将两组数据中的商家名称和商家地址进行分词。分词工具我们采用开源的IKAnalyzer2012,将分词后的结果保存在一张数据表中,表的基本结构如下所示:
2.相似度比对
近期的工作内容涉及到了关于数据相似度比对的处理。现针对一些重点内容做以总结。
主要目的是根据本地库中的商家信息和从大众点评等网站抓取到的商家信息,找出不在本地库中包含的商家。现主要根据商家名称和商家地址两个属性来确定是否是同一个商家。因数据来源不同,所以商家名称和地址等信息在数据完整性、准确性、规范性等方面都存在误差。因此,需要将两组数据的商家名称和地址进行分词,划分为粒度较小的词,之后再按照相似度比对的算法进行处理。
1.分词
将两组数据中的商家名称和商家地址进行分词。分词工具我们采用开源的IKAnalyzer2012,将分词后的结果保存在一张数据表中,表的基本结构如下所示:
id | bigint | 主键 |
item_id | bigint | 对应项的ID |
item_attr | varchar | 对应项的属性名称 |
item_value | varchar | 对应项的分词结果 |
length | int | 分词后的长度 |
对于IKAnalyzer2012的具体使用,可以参考其文档。
以下代码将sourceStr进行分词后返回一个分词列表。
public List<String> segmentWord(String sourceStr) {
List<String> returnList = new ArrayList();
if (null != sourceStr) {
StringReader reader = new StringReader(sourceStr);
IKAnalyzer ss = new IKAnalyzer(true);
TokenStream tokenStream = ss.tokenStream("", reader);
try {
while (tokenStream.incrementToken()) {
TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class);
returnList.add(termAttribute.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
return returnList;
}
2.相似度比对
经过分词,原来的商家名称和地址就会被分为一系列粒度较小的词,之后将要比对的分词的列表依次循环,逐个做比对,判断分词后的结构是否匹配,可以根据匹配成功的词的个数和每个词的长度,设定合理的计分规则,计算出一个得分,最后取得分最高的便是相似程度较高的记录。