
入門自然言語処理の演習問題を解くシリーズ。
【第1問】
単語のリストを含んだ変数を作成しよう。その変数に対し、加算、乗算、添字、スライス表記、ソートを試してみよう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
words = ['apple', 'orange', 'banana']
print words + ['grape']
print words * 3
print words[2]
print words[:2]
print sorted(words)
if __name__ == '__main__':
main()
【第2問】
corpusモジュールを利用して、austen-persuasion.txtを調べてみよう。単語トークンはいくつかるか。また異なり語はいくつかるか。
単語トークンは98,171。異なり語は6,132。
#!/usr/bin/env python #-*- coding: utf-8 -*- import nltk def main(): #print nltk.corpus.gutenberg.fileids() persuasion = nltk.corpus.gutenberg.words('austen-persuasion.txt') print len(persuasion) print len(set(persuasion)) if __name__ == '__main__': main()
【第3問】
NLTKのブラウンコーパスリーダーnltk.corpus.brown.words()とウェブテキストコーパスリーダーnltk.corpus.webtext.words()を利用して2つの異なるジャンルのテキストにいくつかアクセスしよう。
#!/usr/bin/env python #-*- coding: utf-8 -*- import nltk def main(): #print nltk.corpus.brown.categories() print nltk.corpus.brown.words(categories='news') #print nltk.corpus.webtext.fileids() print nltk.corpus.webtext.words(fileids='firefox.txt') if __name__ == '__main__': main()
【第4問】
state_unionコーパスリーダーを用いてState of Union addressesのテキストを読み込もう。各ドキュメントについて、men、women、peopleの出現回数を数えよう。それらの単語の使われ方について、時代とともに変化があったかどうかを調べてみよう。
各ドキュメント内のmen, women, peopleの出現回数を出力。
#!/usr/bin/env python #-*- coding: utf-8 -*- import nltk def main(): for file in nltk.corpus.state_union.fileids(): words = [w.lower() for w in nltk.corpus.state_union.words(fileids=file)] freq = nltk.FreqDist(words) print '【' + file + '】' print 'men=%s, women=%s, people=%s' % (freq['men'], freq['women'], freq['people']) if __name__ == '__main__': main()
時代とともに変化があったかどうかを調べるためにグラフにする。
#!/usr/bin/env python #-*- coding: utf-8 -*- import nltk def main(): cfd = nltk.ConditionalFreqDist( (target, file[:4]) for file in nltk.corpus.state_union.fileids() for w in nltk.corpus.state_union.words(file) for target in ['men', 'women', 'people'] if w.lower().startswith(target)) print cfd.plot() if __name__ == '__main__': main()
このようなグラフが表示される。

【第5問】
いくつかの名詞について、ホロニムとメロニムの関係について調べる。ホロニムとメロニムの関係には3種類あるので、member_meronyms()、part_meronyms()、substance_meronyms()、member_holonyms()、part_holonyms()、substance_holonyms()を使う必要がある。
humanでやってみた。
#!/usr/bin/env python #-*- coding: utf-8 -*- from nltk.corpus import wordnet as wn def main(): for synset in wn.synsets('human', wn.NOUN): print synset.name + ':', synset.definition print wn.synset('human.n.01').member_meronyms() print wn.synset('human.n.01').part_meronyms() print wn.synset('human.n.01').substance_meronyms() print wn.synset('human.n.01').member_holonyms() print wn.synset('human.n.01').part_holonyms() print wn.synset('human.n.01').substance_holonyms() if __name__ == '__main__': main()