文档Shingling

K-Shingle

假设有一个字符串:china,k-shingle可以将它转换成k(这里是2)长度的字符串集合:ch,hi,in,na。

我实现的2-shingle算法如下:

#!/usr/bin/env python
#coding=utf-8

edu = set([u'教育',u'高校',u'招生',u'考试',u'考生'])
it = set([u'IT',u'信息',u'技术'])

def jaccard(set1,set2):
    """
        jaccard算法,计算两个集合(set1,set2)的jaccard
         return: jaccard值
    """
    assert(isinstance(set1,set))
    assert(isinstance(set2,set))
    return (len(set1.intersection(set2))+0.0)/len(set1.union(set2))*100

def _2Shingle(words):
    """
        k-Shingle生成,k=2
        return: Shingle分解的集合
    """
    words = words.replace(' ','')

    def make():
        for i in xrange(len(words)):
            try:
                yield words[i],words[i+1]
            except:
                break
    return set([''.join(x) for x in make()])

x = _2Shingle(u'北京知道创宇信息技术有限公司')

print jaccard(x,it)

23行做了一个Jaccard运算。