Imagenet数据集
是由根据WordNet层次结构(目前只有名词)组织的图像数据库,其中层次结构的每个节点都有成百上千的图像。其总共有大约21K类,每一类节点对应一个wnid(WordNet ID of class),1500多万张图片,如下图展示了32326类的Imagetnet数据集组织形式。
常用的为ISLVRC 2012(ImageNet Large Scale Visual Recognition Challenge)比赛用的子数据集,其中:
- 训练集:1,281,167张图片+标签
- 验证集:50,000张图片+标签
- 测试集:100,000张图片,属于1000个不同的类别。
wordnet简介
传统词典一般都是按字母顺序组织词条信息的,这样的词典在解决用词和选义问题上是有价值的。然而,它们有一个共同的缺陷,就是忽略了词典中同义信息的组织问题。WordNet是由Princeton 大学的心理学家,语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典。而每个不同的语义(sense)又可能对应多个词,如topic和subject在某些情况下是同义的,
WordNet与其他标准词典最显著的不同在于:它将词汇分成五个大类:名词、动词、形容词、副词和虚词。实际上,WordNet仅包含名词、动词、形容词和副词。虚词通常是作为语言句法成分的一部分,WordNet忽略了英语中较小的虚词集。
WordNet的语料库,在nltk_data文件夹下的corpora文件夹中,corprora文件夹是下载的,下载方式是使用两行代码。
pip install nltk
python -m nltk.downloader # 选择安装wordnet
WordNet与一般字典的不同在于组织结构的不同,它是以同义词集合(Synset)作为基本的构建单位来组织的,用户可以在同义词集合中找到一个合适的词去表达一个已知的概念。而与传统词典类似的是它也给出了定义和例句。
如果说WordNet是一个数据库,那么Synset就是一条数据的主键,而每一条数据,代表的是一个词义。
from nltk.corpus import wordnet as wn
wn.synsets('dog') # 得到'dog'的所有词义
Out[1]:
[Synset('dog.n.01'),
Synset('frump.n.01'),
Synset('dog.n.03'),
Synset('cad.n.01'),
Synset('frank.n.02'),
Synset('pawl.n.01'),
Synset('andiron.n.01'),
Synset('chase.v.01')]
由上图可见,Synset由三部分组成,第一部分是词义,第二部分是词性,第三部分是编号。’dog’所有词义中词性为名词(n)的词性有7个,词性为动词(v)的有1个。这个排列顺序是根据该词义出现的次数排列的。
# 查看不同词义的定义
wn.synset('dog.n.01').definition()
Out[3]: 'a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times; occurs in many breeds'
wn.synset('dog.n.03').definition()
Out[4]: 'informal term for a man'
可以看到,同样的都是名词’dog’有着不同的定义。
# 查看例句(可能有多句,放在同一个列表中)
wn.synset('dog.n.01').examples()
Out[5]: ['the dog barked all night']
wn.synset('dog.n.03').examples()
Out[6]: ['you lucky dog']
# 查询同义词
wn.synset('dog.n.01').lemmas()
Out[7]:
[Lemma('dog.n.01.dog'),
Lemma('dog.n.01.domestic_dog'),
Lemma('dog.n.01.Canis_familiaris')]
# 查询每个同义词的写法
wn.synset('dog.n.01').lemma_names()
Out[8]: ['dog', 'domestic_dog', 'Canis_familiaris']
上面说过,wordnet中,Synset是一条数据的主键。这个主键和词性+8位offset对应。如下所示
# 查询词性
wn.synset('dog.n.01').pos()
Out[11]: 'n'
# 查询8位offset
wn.synset('dog.n.01').offset()
Out[9]: 2084071
# 由词性和8位offset得到synset
wn.synset_from_pos_and_offset('n',2084071)
Out[12]: Synset('dog.n.01')
在imagenet中,类别是词性+8位offset命名的,这被称为wnid,因此每一个类别均对应着一条Synset主键。所以知道了Synset主键之后,我们也可以得到其wnid(词性+8位offset):
def getwnid(u):
s = str(u.offset())
return 'n' + (8 - len(s)) * '0' + s # offset不显示前面的0,所以需要补0到8位。
所谓hypernym,表示某一个概念的上位词,假如A的上位词是B,简单的理解即是B是一个大的概念,A是B概念的一种情况,A更加具体。
# 例如,A概念表示狗,B概念表示家养动物,我们知道狗是家养动物的一种,则可以称家养动物是狗的一个上位词。
wn.synset('dog.n.01').hypernyms()
Out[13]: [Synset('canine.n.02'), Synset('domestic_animal.n.01')]
跟上位词对应,也有下位词概念,英文单词为hyponym,在下面的例子中,basenji、corgi等都是狗的不同品种,都是狗这个具体概念下的更加具体的概念。
wn.synset('dog.n.01').hyponyms()
Out[15]:
[Synset('basenji.n.01'),
Synset('corgi.n.01'),
Synset('cur.n.01'),
Synset('dalmatian.n.02'),
Synset('great_pyrenees.n.01'),
Synset('griffon.n.02'),
Synset('hunting_dog.n.01'),
Synset('lapdog.n.01'),
Synset('leonberg.n.01'),
Synset('mexican_hairless.n.01'),
Synset('newfoundland.n.01'),
Synset('pooch.n.01'),
Synset('poodle.n.01'),
Synset('pug.n.01'),
Synset('puppy.n.01'),
Synset('spitz.n.01'),
Synset('toy_dog.n.01'),
Synset('working_dog.n.01')]