问题描述:在比较词表的讨论中,创建一个对象叫做translate,通过它你可以使用德语和意大利语词汇查找对应的英语词汇。这种方法可能会出现什么问题,你能提出一个办法来避免这个问题吗?
书上的做法是通过entries()方法来指定一个语言链表来访问多语言中的同源词,再把它转换成一个简单的词典。代码如下:
1 from nltk.corpus import swadesh 2 swadesh.fileids() 3 it2en = swadesh.entries(['it', 'en']) 4 de2en = swadesh.entries(['de', 'en']) 5 translate = dict(it2en) 6 translate.update(dict(de2en)) 7 translate['Hund']
然而这个方法有个问题,原语言链表中有多对多关系的词,如it2en中的:
1 (u'tu, Lei', u'you (singular), thou') 2 (u'lui, egli', u'he') 3 (u'loro, essi', u'they') 4 (u'qui, qua', u'here') 5 (u'udire, sentire', u'hear') 6 (u'odorare, annusare', u'smell') 7 (u'dividere, separare', u'split') 8 (u'aguzzo, affilato', u'sharp') 9 (u'asciutto, secco', u'dry')
当输入translate['tu']时并不会正确显示you (singular), thou,而是会报错KeyError: 'tu':
1 >>> translate['tu'] 2 Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4 KeyError: 'tu'
解决思路:
遍历语言链表,当检测到有多对多关系时,将该元素进行处理后再加入原语言链表。
代码:
1 from nltk.corpus import swadesh 2 swadesh.fileids() 3 it2en = swadesh.entries(['it', 'en']) 4 de2en = swadesh.entries(['de', 'en']) 5 6 # list[tuple(str, str), ...] 7 for it, en in it2en: 8 if ',' in it: 9 words = it.split(', ') 10 for eachWord in words: 11 newWord = (eachWord, en) 12 it2en.append(newWord) 13 14 for de, en in it2en: 15 if ',' in de: 16 words = de.split(', ') 17 for eachWord in words: 18 newWord = (eachWord, en) 19 de2en.append(newWord) 20 21 translate = dict(it2en) 22 translate.update(dict(de2en))