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

时间:2023-03-09 09:13:54
《Python自然语言处理》第二章-习题解答-练习6

问题描述:在比较词表的讨论中,创建一个对象叫做translate,通过它你可以使用德语和意大利语词汇查找对应的英语词汇。这种方法可能会出现什么问题,你能提出一个办法来避免这个问题吗?

书上的做法是通过entries()方法来指定一个语言链表来访问多语言中的同源词,再把它转换成一个简单的词典。代码如下:

 from nltk.corpus import swadesh
swadesh.fileids()
it2en = swadesh.entries(['it', 'en'])
de2en = swadesh.entries(['de', 'en'])
translate = dict(it2en)
translate.update(dict(de2en))
translate['Hund']

然而这个方法有个问题,原语言链表中有多对多关系的词,如it2en中的:

 (u'tu, Lei', u'you (singular), thou')
(u'lui, egli', u'he')
(u'loro, essi', u'they')
(u'qui, qua', u'here')
(u'udire, sentire', u'hear')
(u'odorare, annusare', u'smell')
(u'dividere, separare', u'split')
(u'aguzzo, affilato', u'sharp')
(u'asciutto, secco', u'dry')

当输入translate['tu']时并不会正确显示you (singular), thou,而是会报错KeyError: 'tu':

 >>> translate['tu']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'tu'

解决思路:

遍历语言链表,当检测到有多对多关系时,将该元素进行处理后再加入原语言链表。

代码:

 from nltk.corpus import swadesh
swadesh.fileids()
it2en = swadesh.entries(['it', 'en'])
de2en = swadesh.entries(['de', 'en']) # list[tuple(str, str), ...]
for it, en in it2en:
if ',' in it:
words = it.split(', ')
for eachWord in words:
newWord = (eachWord, en)
it2en.append(newWord) for de, en in it2en:
if ',' in de:
words = de.split(', ')
for eachWord in words:
newWord = (eachWord, en)
de2en.append(newWord) translate = dict(it2en)
translate.update(dict(de2en))