问题描述:在比较词表的讨论中,创建一个对象叫做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 for key in it2en: 7 if ‘,‘ in key[0]: 8 words = key[0].split(‘, ‘) 9 for eachWord in words: 10 newWord = (eachWord, key[1]) 11 it2en.append(newWord) 12 13 for key in de2en: 14 if ‘,‘ in key[0]: 15 words = key[0].split(‘, ‘) 16 for eachWord in words: 17 newWord = (eachWord, key[1]) 18 de2en.append(newWord) 19 20 translate = dict(it2en) 21 translate.update(dict(de2en))
时间: 2024-12-13 22:51:28