《Python自然语言处理》第二章 习题解答 练习6

问题描述:在比较词表的讨论中,创建一个对象叫做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))

 

posted on 2017-04-15 11:42  冰霁  阅读(1004)  评论(0编辑  收藏  举报

导航