一、样本去重的原因
在NLP的工程实践中,经常涉及到样本标注工作。例如,在实体识别中,对实体标注的原则是尽量包括更多的实体,这样才能实现“好而不同”的标注目标。因此,面临大量的无标签样本,就需要我们去重,挑选出尽量不同的样本进行标注。
二、样本去重算法simhash
simhash是样本去重的一种常用算法,本文强调实战应用,不再赘述其具体原理。下面给出一段代码。
# -*- encoding=utf-8 -*-
single_bits = {}
for x in range(32):
single_bits[x] = 1 << x
def simhash(str):
simhash_map = {}
for x in range(32):
simhash_map[x] = 0
for c in str:
h = hash(c)
for bit in single_bits:
if h & single_bits[bit] == 0:
simhash_map[bit] -= 1
else:
simhash_map[bit] += 1
result = 0
for x in range(32):
if simhash_map[x] > 0:
result |= single_bits[x]
return result
def haiming_distance(simhash1, simhash2):
dis = 0
sh = simhash1 ^ simhash2
for x in range(32):
if sh & (1 << x) > 0:
dis += 1
return dis
if __name__ == "__main__":
text1 = "生成对抗网作为一种新的生成性模型训练方法,利用判别模型来指导生成模型的训练,已经相当成功地生成实值数据"
text2 = "作为一种新的生成性模型训练方法,生成对抗网利用判别模型来指导生成模型的训练,生成实值数据已经相当成功了"
text3 = "在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性。"
sh1 = simhash(text1)
sh2 = simhash(text2)
sh3 = simhash(text3)
print("sh1=",sh1)
print("sh2=",sh2)
print("sh3=",sh3)
print("distance between text1 and text2 is:",haiming_distance(sh1, sh2))
print("distance between text1 and text3 is:",haiming_distance(sh1, sh3))
sh1= 957675297
sh2= 1024783905
sh3= 2119440038
distance between text1 and text2 is: 2
distance between text1 and text3 is: 13
可以看出,text1和text2经过simhash处理后,hanming_distance为2,值较小,表明text1和text2相似都高,二者选一;而text1和text3的hanming_distance为13,值较大,表明text1和text3相似度低,二者都选。这与实际情况也是符合的。