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)
scratcher
print(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小时内删除。