Python⾃然语⾔处理第⼀章课后习题答案
前⾔:从今天开始正式学习⾃然语⾔处理,同时还有统计学习⽅法和机器学习。希望能够⼀直坚持下去。
(以下答案⾮标准答案,如有错误请积极回复。谢谢理解。)
正⽂
在开始之前⾸先引⼊nltk和nltk.book
import nltk
from nltk.book import*
1. ○尝试使⽤Python 解释器作为⼀个计算器,输⼊表达式,如12/(4+1)。
后端工程师是程序员吗12/(4+1)
output:2.4
2. ○26 个字母可以组成26 的10 次⽅或者26**10个 10字母长的字符串。也就是 1411 67095653376L(结尾处的 L 只是表⽰这
是 Python长数字格式)。100 个字母长度的 字符串可能有多少个?
26**100
output:31429306415829388301743577885016264272826699887624752563741731753989959084201040234654325990697022893309640750816 11719197835869803511992549376
3. ○Python 乘法运算可应⽤于链表。当你输⼊[‘Monty’, ‘Python’] * 20或者 3 * se nt1会发⽣什么?
print(['Monty','Python']*20)
print(3* sent1)
output:['Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python',
'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty',
'Python', 'Monty', 'Python', 'Monty', 'Python', 'Monty', 'Python']
['Call', 'me', 'Ishmael', '.', 'Call', 'me', 'Ishmael', '.', 'Call', 'me', 'Ishmael', '.']
4. ○复习 1.1节关于语⾔计算的内容。在 text2中有多少个词?有多少个不同的词?
print(len(text2),len(set(text2)))
output:141576 6833
5. ○⽐较表格 1-1 中幽默和⾔情⼩说的词汇多样性得分,哪⼀个⽂体中词汇更丰富?
6. ○制作《理智与情感》中四个主⾓:Elinor,Marianne,Edward和Willoughby 的分布图。 在这部⼩说中关于男性和⼥性所扮演的
不同⾓⾊,你能观察到什么?你能出⼀对夫妻 吗?
text2.dispersion_plot(["Elinor","Marianne","Edward","Willoughby"])
由图所知⼤概Elinor和Marianne是⼀对夫妻,另外两⼈是另⼀对夫妻。
7. ○查 text5 中的搭配。
output:['wanna chat', 'PART JOIN', 'MODE #14-19teens', 'JOIN PART', 'PART PART', 'cute.-ass MP3', 'MP3 player', 'JOIN JOIN', 'times .. .', 'ACTION watches', 'guys wanna', 'song lasts', 'last night', 'ACTION sits', '-...)...- S.M.R.', 'Lime Player', 'Player 12%', 'dont know', 'lez gurls', 'long time']
8. ○思考下⾯的 Python表达式:len(set(text4))。说明这个表达式的⽤途。描述在执⾏ 此计算中涉及的两个步骤。
len(set(text4))
output:9913
该表达式由len()和set()两个⽅法组成,其含义为text4中不同词数的数量。
9. ○复习 1.2节关于链表和字符串的内容。
a. 定义⼀个字符串,并且将它分配给⼀个变量,如:my_string = ‘My String’(在 字符串中放⼀些更有趣的东西)。⽤两种⽅法输
出这个变量的内容,⼀种是通过简 单地输⼊变量的名称,然后按回车;另⼀种是通过使⽤ print 语句。
my_string ='My String'
print(my_string)
my_string
output:My String 'My String'
b. 尝试使⽤my_string+ my_string 或者⽤它乘以⼀个数将字符串添加到它⾃⾝, 例如:my_string* 3。
请注意,连接在⼀起的字符
串之间没有空格。怎样能解决 这个问题?
print(my_string+my_string,'\n'+
my_string*3,'\n'+
对勾函数公式my_string+' '+my_string)
output:My StringMy String
My StringMy StringMy String
My String My String
10. ○使⽤的语法my_sent = [“My”, “sent”],定义⼀个词链表变量my_sent(⽤你 ⾃⼰的词或喜欢的话)。
a. 使⽤’ '.join(my_sent)将其转换成⼀个字符串。
my_sent =[My","sent"]
msent1 =''.join(my_sent)
print(msent1)
output:Mysent
b. 使⽤ split()在你指定的地⽅将字符串分割回链表。
msent2 = msent1.split("s")
print(msent2)
output:['My', 'ent']
11. ○定义⼏个包含词链表的变量,例如:phrase1,phrase2等。将它们连接在⼀起组
成不同的组合(使⽤加法运算符),最终形成完整的句⼦。len(phrase1 + phrase2)
与 len(phrase1) + len(phrase2)之间的关系是什么?
phrase1 =["123","is"]
phrase2 =["my","password"]
print(phrase1 + phrase2)
print(len(phrase1 + phrase2))
print(len(phrase1)+len(phrase2))
output:['123', 'is', 'my', 'password']
4
4
len(phrase1 + phrase2)是先连接字符串后计算字符串长度
len(phrase1)+len(phrase2)则是依次计算长度后,计算长度的和
12. ○考虑下⾯两个具有相同值的表达式。哪⼀个在NLP 中更常⽤?为什么?
a.“Monty Python”[6:12]
b.[“Monty”, “Python”][1]
print("Monty Python"[6:12])
print(["Monty","Python"][1])
Python
前者是取字符串的切⽚,后者是取列表项。明显后者在任何机器学习的领域中更常⽤。
13. ○我们已经看到如何⽤词链表表⽰⼀个句⼦,其中每个词是⼀个字符序列。sent1[2][2]代表什么意思?为什么?请⽤其他的索引值做
实验。
sent1[2][2]matlab strtok
output:'h'
sent[2]的输出是’Ishmael’,该式相当于’Ishmael’[2]即字符串的第三个字符:'h’
14. ○在变量 sent3中保存的是 text3的第⼀句话。在 sent3中 the的索引值是1,因为sent3[1]的值是“the”。sent3中“the”的其
它出现的索引值是多少?
for i in range(len(sent3)):
if sent3[i]=='the':
print(i)
output:1
5
8
15. ○复习 1.4 节讨论的条件语句。在聊天语料库(text5)中查所有以字母 b开头的词。
按字母顺序显⽰出来。
sorted([word for word in set(text5)if word.startswith('b')])
output:['b', 'b-day', 'b/c', 'b4', 'babay', 'babble', 'babblein', 'babe', 'babes', 'babi', 'babies', 'babiess', 'baby', 'babycakeses', 'bachelorette', 'back',
'backatchya', 'backfrontsidewaysandallaroundtheworld', 'backroom', 'backup', 'bacl', 'bad', 'bag', 'bagel', 'bagels', 'bahahahaa', 'bak', 'baked', 'balad',
python编程基础教程课后答案'balance', 'balck', 'ball', 'ballin', 'balls', 'ban', 'band', 'bandito', 'bandsaw', 'banjoes', 'banned', 'baord', 'bar', 'barbie', 'bare', 'barely', 'bares', 'barfights', 'barks', 'barn', 'barrel', 'base', 'bases', 'basically', 'basket', 'battery', 'bay', 'bbbbbyyyyyyyeeeeeeeee', 'bbiam', 'bbl', 'bbs', 'bc', 'be', 'beach', 'beachhhh', 'beam',
'beams', 'beanbag', 'beans', 'bear', 'bears', 'beat', 'beaten', 'beatles', 'beats', 'beattles', 'beautiful', 'because', 'beckley', 'become', 'bed', 'bedford', 'bedroom', 'beeeeehave', 'beeehave', 'been', 'beer', 'before'...(以下省略)
16. ○在 Python解释器提⽰符下输⼊表达式 range(10)。再尝试range(10, 20), range(10, 20, 2)和 range(20, 10, -2)。在后续章节
中我们将看到这个内置函数的多⽤⽤途。
print(list(range(10)),
list(range(10,20)),
list(range(10,20,2)),
list(range(20,10,-2)))
output:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [10, 12, 14, 16, 18] [20, 18, 16, 14, 12]
17. ◑使⽤ text9.index()查词 sunset 的索引值。你需要将这个词作为⼀个参数插⼊到圆括号之间。通过尝试和出错的过程中,到完
整的句⼦中包含这个词的切⽚。
startin =0
endin =len(text9)
for i in range(629,1,-1):
if text9[i]=='.'or text9[i]=='?'or text9[i]=='!':
startin = i
break;
for i in range(629, endin):
if text9[i]=='.'or text9[i]=='?'or text9[i]=='!':
endin = i
break;
print(text9[startin+1:endin+1])
output:['CHAPTER', 'I', 'THE', 'TWO', 'POETS', 'OF', 'SAFFRON', 'PARK', 'THE', 'suburb', 'of', 'Saffron', 'Park', 'lay', 'on', 'the', 'sunset', 'side', 'of',
'London', ',', 'as', 'red', 'and', 'ragged', 'as', 'a', 'cloud', 'of', 'sunset', '.']
18. ◑使⽤链表加法、set 和sorted操作,计算句⼦sent1…sent8的词汇表。
word_list =set(sent1 + sent2 + sent3 + sent4 + sent5 + sent6 + sent7 + sent8)
scratcherprint(sorted(word_list))
output:['!', ',', '-', '.', '1', '25', '29', '61', ':', 'ARTHUR', 'Call', 'Citizens', 'Dashwood', 'Fellow', 'God', 'House', 'I', 'In', 'Ishmael', 'JOIN', 'KING', 'MALE', 'Nov.', 'PMing', 'Pierre', 'Representatives', 'SCENE', 'SEXY', 'Senate', 'Sussex', 'The', 'Vinken', 'Whoa', '[', ']', 'a', 'and', 'as', 'attrac', 'been', 'beginning', 'board',
'clop', 'created', 'director', 'discreet', 'earth', 'encounters', 'family', 'for', 'had', 'have', 'heaven', 'in', 'join', 'lady', 'lol', 'long', 'me', 'nonexecutive', 'of', 'old',
'older', 'people', 'problem', 'seeks', 'settled', 'single', 'the', 'there', 'to', 'will', 'wind', 'with', 'years']
19. ◑下⾯两⾏之间的差异是什么?哪⼀个的值⽐较⼤?其他⽂本也是同样情况吗?
>>> sorted(set([w.lower() for w in text1]))
>>> sorted([w.lower() for w in set(text1)]
print(len(sorted(set([w.lower()for w in text1]))))
print(len(sorted([w.lower()for w in set(text1)])))
output:17231
19317
前者是先循环读取了text1中的所有词后更新为⼩写格式后⽤set()筛选了不同的词。
后者是先将text1中的不同词筛选完毕后,循环读取其中的词再更新为⼩写。所以后者再进⼊列表时,⼤⼩写的词是被当成两个词的。20. ◑w.isupper()和not w.islower()这两个测试之间的差异是什么?
w =']'
print(w.isupper())
print(not w.islower())
output:False
True
前者⽤来判断w是不是⼀个⼤写字母,True时可确定w是⼤写字母,False时⽆法确定w是什么。
后者则只能确定w是不是⼀个⼩写字母,True时不可确定w是什么,False时确定w是个⼩写字母免费建网站下载
21. ◑写⼀个切⽚表达式提取 text2 中最后两个词。
text2[-2::1]
output:['THE', 'END']
22. ◑出聊天语料库(text5)中所有四个字母的词。使⽤频率分布函数(FreqDist),以频率从⾼到低显⽰这些词。
FreqDist([word for word in text5 if len(word)==4])
output:FreqDist({'JOIN': 1021, 'PART': 1016, 'that': 274, 'what': 183, 'here': 181, '....': 170, 'have': 164, 'like': 156, 'with': 152, 'chat': 142, ...})
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论