system: [SYSTEM]

user: 2. 研究内容 2.1. Jaccard相似度 两个集合M和N的Jaccard相似度是 | M ∩ N | / | M ∪ N | ，即两个集合交集的数目与两个集合并集数目的比例(Rajaraman and Ullman， 2011) [ 12 ]。 J S i m ( M ， N ) = | M ∩ N | | M ∪ N | Jaccard相似度具有如下性质：当且仅当两个集合相等时 M = N ， J S i m ( M ， N ) = 1 ；当且仅当 M ≠ N ， J S i m ( M ， N ) = 0 ； J S i m 是对称的。基于Jaccard相似度的文档相似度在很多方面均有应用，如：文档抄袭、镜像页面、同源新闻稿等。如下面两个集合的相似度为 J S i m ( M ， N ) = 1 。 若有两个集合 A = { a ， b ， c ， d ， e } ， B = { c ， d ， e ， f ， g ， h } ， 则 J S i m ( A ， B ) = 3 / 8 。 2.2. 中文分词 在中文中，词语之间没有分隔，且边界模糊。因此进行中文自然语言处理通常是先将汉语文本中的字符串切分成合理的词语序列，然后再在此基础上进行其它分析处理。中文分词是中文信息处理的一个基础环节，已被广泛应用于中文文本处理、信息提取、文本挖掘等应用中。例如：T1 = {“关系数据库理论包括函数依赖和_____”}，经过分词之后为Ts1 = {“关系”，“数据库”，“理论”，“包括”，“函数”，“依赖”，“和”}。 2.3. 文档的K-shingles 为了识别字面上相似的文档，将文档表示成集合的最有效的方法是构建文档中的短字符串集合(即shingle)。如果文档采用这样的集合表示，那么有相同句子甚至短语的文档之间将会拥有很多公共的shingle。其中K表示子串的长度。为了通过K-shingle表示一个文档，需要提前对文档进行处理。如删除首尾空格、删除停用词等。然后再把文本拆分成分词。例如经过分词之后的T1 = {“关系”，“数据库”，“理论”，“包括”，“函数”，“依赖”}，如果K = 2，则通过K-shingle，Ts1 = {“关系数据库”，“数据库理论”，“理论包括”，“包括函数”，“函数依赖”}，如果还具有下列两个文本T2 = {“数据库的理论包括函数依赖和______”}、T3 = {“关系数据库理论包括______和规范化”}，则3个文本的shingle元素矩阵如表1所示。 Table 1 Shingle element matrix of tex shingles T1 T2 T3 关系数据库 1 0 1 数据库理论 1 1 1 理论包括 1 1 1 包括函数 1 1 0 函数依赖 1 1 0 包括规范化 0 0 1 表1. 文本的shingle元素矩阵 表1中的文本对相似度如下： J S i m ( T 1 ， T 2 ) = 4 / 5 ， J S i m ( T 1 ， T 3 ) = 3 / 6 ， J S i m ( T 2 ， T 3 ) = 2 / 6 。 2.4. Shingle的哈希 由于所有shingle集合的存储需要占用大量的空间。可以哈希shingle进行散列，使用散列之后的桶号来代替shingle串。我们使用以下形式的散列函数 [ 13 ]： h ( x ) = ( a x + b ) m o d p 其中： x 为原始矩阵中的shingle串，a和b是从(0， Shingle全集大小)之间的一个随机数，p是比Shingle全集稍大的数。 假定表1中的shingle串被哈希到0~5的桶中，见表2。 Table 2 Characteristic matrix shingles T1 T2 T3 0 1 0 1 1 1 1 1 2 1 1 1 3 1 1 0 4 1 1 0 5 0 0 1 表2. 特征矩阵M 表2中的矩阵也称为特征矩阵M，该矩阵的行对应shingle，列对应文本集合。由于特征往往非常稀疏，在处理大量文本对的相似度计算时非常不方便。 2.5. 最小哈希签名(MinHash) 通过最小哈希可以把特征矩阵转变为签名矩阵，该签名矩阵的行对应最小哈希函数，列对应文本集合。通常情况下签名矩阵所需的存储空间比特征矩阵M的存储空间要小很多。最小哈希签名的计算过程如算法1所示： 算法1：最小哈希签名 输入：特征矩阵M，哈希函数 h 1 ， h 2 ， ⋯ ， h n 输出：签名矩阵S 对于所有的每个哈希函数(i)，每一列(c)，签名矩阵中S的 S ( i ， c ) 表示第i个哈希函数及第c列对应的最小哈希值。 Step1循环对特征矩阵中的每一行进行处理，计算当前行r的哈希值， h 1 ( r ) ， h 2 ( r ) ， ⋯ ， h n (r) Step2对每列c进行如下操作 (a) 若特征矩阵中 M ( i ， c ) = 0 ，则什么都不做； (b) 若 M ( i ， c ) = 1 ，那么对于每个 i = 1 ， 2 ， ⋯ ， n ，将 S ( i ， c ) 设为原来 S ( i ， c ) 和 h i ( r ) 之中的最小值。 若 h 1 = ( x + 1 ) mod 7 ， h 2 = ( 3 x + 1 ) mod 7 ，则经过两个哈希函数变换之后的特征矩阵M见表3，签名矩阵计算结果见表4，最后通过签名矩阵计算得到的Jaccard相似度见表5。 Table 3 Characteristic matrix M after two hash function transformation shingles T1 T2 T3 h 1 = ( x + 1 ) mod 7 h 2 = ( 3 x + 3 ) mod 7 0 1 0 1 1 3 1 1 1 1 2 6 2 1 1 1 3 2 3 1 1 0 4 5 4 1 1 0 5 1 5 0 0 1 6 4 表3. 经过两个哈希函数变换之后的特征矩阵M Table 4 Signature Matrix Hash函数 T1 T2 T3 h 1 1 2 1 h 2 1 1 2 表4. 签名矩阵S Table 5 Jaccard similarity of text pair J S i m ( T 1 ， T 2 ) J S i m ( T 1 ， T 3 ) J S i m ( T 2 ， T 3 ) 真实Jaccard相似度 4/5 3/6 2/6 通过签名估计的Jaccard相似度 1/2 1/2 0 表5. 文本对的Jaccard相似度 2.6. LSH 若有 N 个文本，进行两两相似度将需要比较 N 2 / 2 次。这将极大增加计算量。LSH仅仅关注散列到同一个桶中的候选对，只检查这些候选对之间的相似度，它的基本思想就是将签名矩阵划分成b个行条，每个行条由r行组成。其中n = br，n为哈希函数的个数，即签名矩阵的行数。行条化策略能够使得相似列比不相似列更有可能成为候选对，从而大大减少文本对之间的比较次数。 2.7. 基于LSH技术的试题相似度检测算法 本文具体处理的过程见算法2。 算法2：基于LSH技术的试题相似度检测算法 输入：试题文本集合 T 1 ， T 2 ， ⋯ ， T N ，Jaccard相似度阈值T * 输出：相似试题文本对及相应的Jaccard估计相似度 Step1对所有试题文本进行中文分词，同时去除停用词，删除首尾空格 Step2把上一步中的结果转换成K-shingle集，得到特征矩阵M Step3随机生成n_hashes个哈希函数 h 1 ， h 2 ， ⋯ ， h n _ h a s h e s ，根据算法1计算出签名矩阵S Step4通过LSH得到所有的候选相似对，具体是将签名矩阵划分成n_bands个行条，每个行条由 r = N / n _ b a n d s 行组成，每个行条采用一个哈希函数对r个整数构成的列向量进行散列。若两向量相同，则会散列到同一个桶中，从而得到候选相似对。 Step5计算所有候选相似对的Jaccard相似度，若大于相似度阈值T * ，则两试题文本相似。