前几日参加了一个比赛,比赛的结果还算不错,但是有一个问题一直没有解决,赛题希望开发一款调动志愿者进行深度学习训练样本标注的APP,由于我们的解决方案开放自定义输入,例如“金毛犬”和“狗”这样的标签,同一张图片在不同的深度学习任务中应该有不同的标签(例如2017年百度西交大数据比赛的狗分类和简单的猫狗分类),这两者标签都应该保留,但是如何让机器挖掘出这两个标签的上位词关系(比赛之前我一直不知道这叫上位词关系,一直以为这叫名词从属关系)。当时的解决方案是用Word2Vec,但是由于语料较少再加上本身Word2Vec的算法特性对于上位词并不友好,所以效果很差。这几天看了看ImageNet比赛的起源,看到了一个叫WordNet的词典,联想到了比赛的问题并解决之。WordNet不做介绍,网上可以直接搜索到。考虑到数据问题,我选择用ImageNet1K映射到Pascal VOC2007,即从ImageNet中寻找在Pascal VOC中的上位词。算法本身并不复杂,主要包括广度优先搜索,由于Python队列不能判断重复元素,构建链表模并重写了相关的方法。
链表的代码如下:
class Node():
__slots__ = ['_item','_next']
def __init__(self, item):
self._item = item
self._next = None
def getItem(self):
return self._item
def getNext(self):
return self._next
def setNext(self, newnext):
self._next = newnext
class list():
def __init__(self):
self._head = None
self._size = 0
def is_Empty(self):
return self._size == 0
def append(self, item):
temp = Node(item)
if self.is_Empty():
self._head = temp
else:
current = self._head
if current.getItem() == item:
return
while current.getNext()!=None:
current = current.getNext()
if current.getI