首页 > 代码库 > 《Python自然语言处理》第二章 习题解答 练习6

《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 (utu, Lei, uyou (singular), thou)
2 (ului, egli, uhe)
3 (uloro, essi, uthey)
4 (uqui, qua, uhere)
5 (uudire, sentire, uhear)
6 (uodorare, annusare, usmell)
7 (udividere, separare, usplit)
8 (uaguzzo, affilato, usharp)
9 (uasciutto, secco, udry)

当输入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))

 

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