前回の入門自然言語処理の解答の続きです。
第9〜14問
自然言語処理とは関係なくPythonの問題なのでパス。
第15問
print sorted([w for w in set(text5) if w.startswith('b')])
第16問
自然言語処理とは関係なくPythonの問題なのでパス。
第17問
「sunset」という単語の添字番号をtext9.index()探して、sunsetを含む完全な1文を見つけて取り出せ、という問題。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
from nltk.book import *
def main():
# sunsetの添字番号
number = text9.index('sunset')
# 文頭と末尾の変数を初期化
start = end = 0
# sunsetの番号から1つずつ前に戻っていってピリオドを探す。
i = number # 文頭の添字番号
while 1:
if text9[i] == '.':
start = i
break
i -= 1
# sunsetの番号から1つずつ後ろに進んでいってピリオドを探す。
i = number # 文末の添字番号
while 1:
if text9[i] == '.':
end = i
break
i += 1
# sunsetの含まれている1文を出力
print ' '.join(text9[start+1:end+1])
if __name__ == '__main__':
main()
ピリオドが文の区切りと考えて、sunsetを基点に1ずつ前後に移動してピリオドが見つける。これで文頭と文末の添字番号が分かるので、その部分だけをtext9から抜き出す。その結果がこれ。
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 .
「CHAPTER I」とかなってるしたぶん間違えてると思う。これは章のタイトルだから最後にピリオドが付いてないんだと思う。
CHAPTER 1 INTRODUCTION
This book is ~......
みたいな感じだと思う。この章タイトルの部分にかぶらなければこれで抜き出せたと思うけど・・・。なかなかいやらしい問題だわ。
第18問
print len(sorted(set(sent1 + sent2 + sent3 + sent4 + sent5 + sent6 + sent7 + sent8)))
第19問
以下の2つの違いは何か?どちらが大きな値を得る事ができるか?
len(sorted(set([w.lower() for w in text1])))
len(sorted([w.lower() for w in set(text1)]))
最初ぱっと見たときは同じ事をしてるだけと思ったんだけど、実際に実行してみると上が17,231で下が19,317とかなり違いが出た。
でよく考えてみると、上は全て小文字化した後でsetdで重複を取り除いているのに対して、下はsetで重複を取り除いてから小文字化している。
例えば、dog Dogという単語が入っていたとすると、上の方では先に小文字化するのでdog dogとなってsetするので1つになってしまう。
下の方は先にsetするのでその段階ではdog Dogと2つ残っており、それから小文字化するのでdog dogと2つの単語が残ったままになる。
したがって下の方が値が大きくなる。
別の言い方をすると上と下の値の差は、同じ単語が小文字と大文字の両方で記述されている数という事になるんだろう。
第20問
w.isupper()とnot w.isupper()の違いは?
前者はwが全て大文字なら真、それ以外は偽。
後者はwが全て大文字なら偽、それ以外は真。
【入門自然言語処理解答(第1章)】