《用Python進(jìn)行自然語言處理》 第一章練習(xí)題答案

  1. 嘗試使用Python解釋器作為一個(gè)計(jì)算器魂奥,輸入表達(dá)式易猫,如12/(4+1)准颓。
>>> 12 / (4 + 1)
2.4
  1. 26 個(gè)字母可以組成 26 的 10 次方或者 26**10個(gè) 10 字母長(zhǎng)的字符串。 也就是 141167095653376L(結(jié)尾處的 L 只是表示這是 Python 長(zhǎng)數(shù)字格式)炮赦。100 個(gè)字母長(zhǎng)度的字符串可能有多少個(gè)?
>>> 26 ** 100
31429306415829388301743577885016264272826699887624752563741731753989959084
201040234654325990697022893309640750816117197835869803511992549376
  1. Python乘法運(yùn)算可應(yīng)用于鏈表吠勘。當(dāng)你輸入['Monty', 'Python'] * 20 或者 3 * sent1會(huì)發(fā)生什么性芬?
>>> ['Monty', 'Python'] * 20
['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']
  1. 復(fù)習(xí)1.1節(jié)關(guān)于語言計(jì)算的內(nèi)容植锉。在text2中有多少個(gè)詞俊庇?有多少個(gè)不同的詞?
>>> len(text2)
141576
>>> len(set(text2))
6833
  1. 比較表格1-1中幽默和言情小說的詞匯多樣性得分辉饱,哪一個(gè)文體中詞匯更豐富彭沼?
言情小說
  1. 制作《理智與情感》中四個(gè)主角:Elinor瞎惫、Marianne、Edward 和 Willoughby 的分布圖瓜喇。在這部小說中關(guān)于男性和女性所扮演的不同角色,你能觀察到什么望众?你能找出一對(duì)夫妻嗎伞辛?
>>> text2.dispersion_plot(['Elinor', 'Edward', 'Willoughby', 'Marianne'])
Elinor和Edward是夫妻,原因不明甘耿。佳恬。于游。
題6圖
  1. 查找text5中的搭配
>>> text5.collocations()
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
  1. 思考下面的Python表達(dá)式:len(set(text4))贰剥。說明這個(gè)表達(dá)式的用途,并且描述在執(zhí)行此計(jì)算中設(shè)計(jì)的兩個(gè)步驟前痘。
1.text4中不重復(fù)單詞的數(shù)量。
2.步驟一:將text4中的所有單詞加入set中去重
 步驟二:求該set的大小
  1. 復(fù)習(xí)1-2節(jié)關(guān)于鏈表和字符串的內(nèi)容际度。
    • 定義一個(gè)字符串,并且將它分配給一個(gè)變量坡锡,如:my_string = 'My String' (在字符串中放一些更有趣的東西)鹉勒。用兩種方法輸出這個(gè)變量的內(nèi)容吵取,一種是通過簡(jiǎn)單地輸入變量的名稱,然后按回車脯倒;另一種是通過使用print語句捺氢。
    >>> my_string = 'Hello NLP'
    >>> my_string
    'Hello NLP'
    >>> print(my_string)
    Hello NLP
    
    • 嘗試使用 my_string + my_string 或者用它乘以一個(gè)數(shù)將字符串添加到它自身摄乒,例如: my_string*3。請(qǐng)注意斋否,連接在一起的字符串之間沒有空格拭荤。怎樣才能解決這個(gè)問題?
    >>> my_string * 3
    'Hello NLPHello NLPHello NLP'
    >>> (my_string + ' ') * 3
    'Hello NLP Hello NLP Hello NLP '
    
  2. 使用語法 my_sent = ["My", "sent"]笼恰,定義一個(gè)詞鏈表變量 my_sent(用自己喜歡的詞或喜歡的話)歇终。
    • 使用''.join(my_sent)將其轉(zhuǎn)換成一個(gè)字符串评凝。
    >>> my_sent = ['July', 'Treee']
    >>> ' '.join(my_sent)
    'July Treee'
    
    • 使用split()在你指定的地方將字符串分割回鏈表腺律。
    >>> 'July Treee'.split(' ')
    ['July', 'Treee']
    
  3. 定義幾個(gè)包含詞鏈表的變量宜肉,例如:phrase1翎碑、phrase2 等。將它們連接在一起組成不同的組合(使用加法運(yùn)算符)日杈,最終形成完整的句子。len(phrase1 + phrase2) 與 len(phrase1) + len(phrase2)之間的關(guān)系是什么酿炸?
>>> phrase1 = ['Good', 'morning']
>>> phrase2 = ['July', 'Treee']
>>> phrase1 + phrase2
['Good', 'morning', 'July', 'Treee']
>>> len(phrase1 + phrase2)
4>>> sorted(set(sent1 + sent2 + sent3 + sent4 + sent5 + sent6 + sent7 + sent8))
['!', ',', '-', '.', '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']
>>> len(phrase1) + len(phrase2)
4
# len(phrase1 + phrase2) equals to len(phrase1) + len(phrase2)
  1. 考慮下面兩個(gè)具有相同值的表達(dá)式填硕。哪一個(gè)在NLP中更常用?為什么鹿鳖?

    • "Monty Python"[6:12]
    • ["Monty", "Python"][1]
    第二種扁眯,因?yàn)镹LP的操作是基于詞匯的。
    
  2. 我們已經(jīng)學(xué)習(xí)啦如何用詞鏈表表示一個(gè)句子翅帜,其中每個(gè)詞是一個(gè)字符序列姻檀。sent1[2][2]代表什么意思?為什么藕甩?并嘗試其他的索引值施敢。

sent1中的第三個(gè)單詞的第三個(gè)字母。
  1. 在變量sent3中保存的是text3的第一句話狭莱。在sent3中the的索引值是1,因?yàn)閟ent3[1]的值是“the”僵娃。sent3中“the”的其他兩種出現(xiàn)的索引值是多少默怨?
>>> for i in range(len(sent3)):
...     if sent3[i] == 'the':
...         print(i)
... 
1
5
8
  1. 復(fù)習(xí)1.4節(jié)討論的條件語句匙睹。在聊天語料庫(text5)中查找所有以字母b開頭的詞痕檬。按字母順序顯示出來梦谜。
>>> sorted([w for w in set(text5) if w.startswith('b')])
['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', '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', 'beg', 'begin', 'behave', 'behind', 'bein', 'being', 'beleive', 'believe', 'belive', 'bell', 'belly', 'belong', 'belongings', 'ben', 'bend', 'benz', 'bes', 'beside', 'besides', 'best', 'bet', 'betrayal', 'betta', 'better', 'between', 'beuty', 'bf', 'bi', 'biatch', 'bible', 'biebsa', 'bied', 'big', 'bigest', 'biggest', 'biiiatch', 'bike', 'bikes', 'bikini', 'bio', 'bird', 'birfday', 'birthday', 'bisexual', 'bishes', 'bit', 'bitch', 'bitches', 'bitdh', 'bite', 'bites', 'biyatch', 'biz', 'bj', 'black', 'blade', 'blah', 'blank', 'blankie', 'blazed', 'bleach', 'blech', 'bless', 'blessings', 'blew', 'blind', 'blinks', 'bliss', 'blocking', 'bloe', 'blood', 'blooded', 'bloody', 'blow', 'blowing', 'blowjob', 'blowup', 'blue', 'blueberry', 'bluer', 'blues', 'blunt', 'board', 'bob', 'bodies', 'body', 'boed', 'boght', 'boi', 'boing', 'boinked', 'bois', 'bomb', 'bone', 'boned', 'bones', 'bong', 'boning', 'bonus', 'boo', 'booboo', 'boobs', 'book', 'boom', 'boooooooooooglyyyyyy', 'boost', 'boot', 'bootay', 'booted', 'boots', 'booty', 'border', 'borderline', 'bored', 'boredom', 'boring', 'born', 'born-again', 'bosom', 'boss', 'bossy', 'bot', 'both', 'bother', 'bothering', 'bottle', 'bought', 'bounced', 'bouncer', 'bouncers', 'bound', 'bout', 'bouts', 'bow', 'bowl', 'box', 'boy', 'boyfriend', 'boys', 'bra', 'brad', 'brady', 'brain', 'brakes', 'brass', 'brat', 'brb', 'brbbb', 'bread', 'break', 'breaks', 'breath', 'breathe', 'bred', 'breeding', 'bright', 'brightened', 'bring', 'brings', 'bro', 'broke', 'brooklyn', 'brother', 'brothers', 'brought', 'brown', 'brrrrrrr', 'bruises', 'brunswick', 'brwn', 'btw', 'bucks', 'buddyyyyyy', 'buff', 'buffalo', 'bug', 'bugs', 'buh', 'build', 'builds', 'built', 'bull', 'bulls', 'bum', 'bumber', 'bummer', 'bumped', 'bumper', 'bunch', 'bunny', 'burger', 'burito', 'burned', 'burns', 'burp', 'burpin', 'burps', 'burried', 'burryed', 'bus', 'buses', 'bust', 'busted', 'busy', 'but', 'butt', 'butter', 'butterscotch', 'button', 'buttons', 'buy', 'buying', 'bwahahahahahahahahahaha', 'by', 'byb', 'bye', 'byeee', 'byeeee', 'byeeeeeeee', 'byeeeeeeeeeeeee', 'byes']
  1. 在Python解釋器提示符下輸入表達(dá)式range(10)报辱。再嘗試range(10, 20)单山,range(10, 20, 2)和range(10, 20, -2)鸵赫。在后續(xù)章節(jié)中我們將看到遮蓋內(nèi)置函數(shù)的多種用途辩棒。
>>> for i in range(10, 20, 2):
...     print(i)
... 
10
12
14
16
18
>>> for i in range(20, 10, -2):
...     print(i)
... 
20
18
16
14
12
  1. 使用text9.index()查找詞sunset的索引值一睁。你需要將這個(gè)詞作為一個(gè)參數(shù)插入到圓括號(hào)之間者吁。在嘗試和出錯(cuò)的過程中复凳,在完整的句子中找到包含這個(gè)詞的切片育八。
>>> text9.index('sunset')
629
  1. 使用鏈表加法、set和sorted操作惶洲,計(jì)算句子sent1...sent8的詞匯表签则。
>>> sorted(set(sent1 + sent2 + sent3 + sent4 + sent5 + sent6 + sent7 + sent8))
['!', ',', '-', '.', '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']
  1. 下面兩行之間的差異是什么怀愧?哪一個(gè)的值比較大芯义?其他文本也是同樣情況嗎?

    • sorted(set([w.lower() for w in text1]))
    • sorted([w.lower() for w in set(text1)])
    >>> len(sorted(set([w.lower() for w in text1])))
    17231
    >>> len(sorted([w.lower() for w in set(text1)]))
    19317
    # 第二個(gè)更大绑警,第二個(gè)的值應(yīng)大于等于第一個(gè)的值计盒,因?yàn)樵诘诙€(gè)中大小寫不同的單詞都會(huì)被保存下來北启。
    
  2. w.isupper()和 not w.islower()這兩個(gè)測(cè)試之間的差異是什么咕村?

w.isupper()返回的是w是否為全大寫的字母
not w.islower()返回的是w是否全不是小寫字母(可能包含數(shù)字等)
  1. 編寫一個(gè)切片表達(dá)式提取text2中的最后兩個(gè)詞懈涛。
>>> text2[-2:]
['THE', 'END']
  1. 找出聊天語聊庫(text5)中所有4個(gè)字母的詞批钠。使用頻率分布函數(shù)(FreqDist)埋心,以頻率從高到低顯示這些詞踩窖。
>>> FreqDist([w for w in text5 if len(w) == 4])
FreqDist({'JOIN': 1021, 'PART': 1016, 'that': 274, 'what': 183, 'here': 181, '....': 170, 'have': 164, 'like': 156, 'with': 152, 'chat': 142, ...})
  1. 復(fù)習(xí)1.4中的條件循環(huán)。使用for和if語句組合循環(huán)遍歷電影劇本《巨蟒和圣杯》(text6)中的詞啥供,輸出所有的大寫詞伙狐,每行輸出一個(gè)贷屎。
>>> for w in text6:
...     if w.isupper():
...         print(w)
... 
SCENE
KING
ARTHUR
SOLDIER
ARTHUR
...
  1. 編寫表達(dá)式并找出text6中所有符合下列條件的詞唉侄。結(jié)果應(yīng)該以詞鏈表形式表示:['word1', 'word2'...]恬叹。

    • 以ize結(jié)尾绽昼。
    >>> [w for w in text6 if w.endswith('ize')]
    []
    
    • 包含字母z硅确。
    >>> [w for w in text6 if 'z' in w]
    ['zone', 'amazes', 'Fetchez', 'Fetchez', 'zoop', 'zoo', 'zhiv', 'frozen', 'zoosh']
    
    • 包含字母序列pt疏魏。
    >>> [w for w in text6 if 'pt' in w]
    ['empty', 'aptly', 'Thpppppt', 'Thppt', 'Thppt', 'empty', 'Thppppt', 'temptress', 'temptation', 'ptoo', 'Chapter', 'excepting', 'Thpppt']
    
    • 除了首字母外是全部小寫字母的詞(即titlecase)。
    >>> [w for w in text6 if w.istitle()]
    ['Whoa', 'Halt', 'Who', 'It', 'I', 'Arthur', 'Uther', 'Pendragon', 'Camelot', 'King', 'Britons', 'Saxons', 'England', 'Pull', 'I', 'Patsy', 'We', 'Camelot', 'I', 'What', 'Ridden', 'Yes'...
    
  2. 定義sent為詞鏈表['she', 'sells', 'sea', 'shells', 'by', 'the', 'sea', 'shore']只厘。編寫代碼執(zhí)行以下任務(wù)羔味。

    • 輸出所有sh開頭的單詞钠右。
    >>> [w for w in sent if w.startswith('sh')]
    ['she', 'shells', 'shore']
    
    • 輸出所有長(zhǎng)度超過4個(gè)字符的詞
    >>> [w for w in sent if len(w) >= 4]
    ['sells', 'shells', 'shore']
    
  3. 下面的Python代碼是做什么的搁凸?sum([len(w) for w in text1])狠毯,你可以用它來算出一個(gè)文本的平均字長(zhǎng)嗎嫡良?

# 計(jì)算text1文本中所有單詞的總長(zhǎng)度
>>> sum([len(w) for w in text1]) / len(text1)
3.830411128023649
  1. 定義一個(gè)名為vocab_size(text)的函數(shù)寝受,以文本作為唯一的參數(shù)漓帅,返回文本的詞匯量。
>>> def vocab_size(text):
...     return len(text)
... 
>>> vocab_size(text1)
260819
  1. 定義一個(gè)函數(shù)percent(word, text),計(jì)算一個(gè)給定的詞在文本中出現(xiàn)的頻率浪藻,結(jié)果以百分比表示。
>>> def percent(word, text):
...     lst_len = len([w for w in text if w == word])
...     return '%.2f%%' % (lst_len / len(text))
... 
>>> percent('the', text1)
'0.05%'
>>> percent('and', text1)
'0.02%'
  1. 我們一直在使用集合存儲(chǔ)詞匯表萌丈。試試下面的Python表達(dá)式:set(sent3) < set(text1)。嘗試在set()中使用不同的參數(shù)度迂。它是做什么用的惭墓?您呢個(gè)想到一個(gè)實(shí)際的應(yīng)用嗎腊凶?
>>> set(sent3) < set(text1)
True
# sent3中的每一個(gè)元素是否都在text1中
# 可用于判斷一個(gè)集合是否為另一個(gè)集合的子集

想看更多可以到我的個(gè)人主頁http://julytreee.cn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市划煮,隨后出現(xiàn)的幾起案子弛秋,更是在濱河造成了極大的恐慌登失,老刑警劉巖揽浙,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钓猬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)澳迫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示绊,“玉大人,你說我怎么就攤上這事展哭》税” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵手蝎,是天一觀的道長(zhǎng)钉鸯。 經(jīng)常有香客問我唠雕,道長(zhǎng),這世上最難降的妖魔是什么笙僚? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任亿笤,我火速辦了婚禮汪榔,結(jié)果婚禮上痴腌,老公的妹妹穿的比我還像新娘。我一直安慰自己剥悟,他們只是感情好区岗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布种玛。 她就那樣靜靜地躺著,像睡著了一般距帅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讥电,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音纠炮,去河邊找鬼。 笑死穷躁,一個(gè)胖子當(dāng)著我的面吹牛耕肩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播问潭,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼梳虽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逗余,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎青抛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體举瑰,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耸序,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年绳匀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疾棵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡众弓,死狀恐怖谓娃,靈堂內(nèi)的尸體忽然破棺而出脚乡,到底是詐尸還是另有隱情俯艰,我是刑警寧澤竹握,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站昧甘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浇冰。R本人自食惡果不足惜坡倔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一投蝉、第九天 我趴在偏房一處隱蔽的房頂上張望瘩缆。 院中可真熱鬧,春花似錦、人聲如沸臣樱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峦甩。三九已至犬辰,卻和暖如春诫欠,著一層夾襖步出監(jiān)牢的瞬間轿偎,已是汗流浹背伊者。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狼荞,地道東北人殉挽。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓斯碌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子带族,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容