SlideShare a Scribd company logo
1 of 26
NLTK Book Chapter 2
@torithetorick
Chapter 2の目標
NLTK内蔵のコーパスや語彙目録(lexicon)を
使って、文書の特徴にアクセスする方法をマス
ターします。
条件付き確率分布が使えたらOKです。
Python寄りの話題はあまり触れません。
メソッド定義、クラス定義など
NLTKコーパス
Gutenberg Corpus
25,000冊の書籍
Web & Chat Corpus
Brown Corpus
カテゴリ分けされた500件の素材
文体の違い
Reuters Corpus
タグ付けた10,788件のニュース素材
Inaugural Address Corpus
歴代米国大統領就任演説集
NLTK語彙目録
Word Corpus
ただの単語リスト
Pronouncing Corpus
発音情報付
Comparative wordlist (Swadesh wordlist)
多言語の比較
WordNet
就任演説の時代感
Example1/5
Brown Corpusのニュースカテゴリ内で、法助動詞(話し手の
気持ちを叙述する助動詞)の出現回数を列挙する。
>>> from nltk.corpus import brown
>>> news_text = brown.words(categories='news')
>>> fdist = nltk.FreqDist(w.lower() for w in news_text)
>>> modals = ['can', 'could', 'may', 'might', 'must', 'will']
>>> for m in modals:
... print(m + ':', fdist[m], end=' ’)
can: 94 could: 87 may: 93 might: 38 must: 53 will: 389
Practice 1/3
Brown Corpusのあるカテゴリ内で、wh-単語の出現
回数を列挙する。
>>> fiction_text = brown.words(categories='fiction')
>>> fdist = nltk.FreqDist(w.lower() for w in
news_text)
>>> wh_words = list(set([w.lower() for w in
fiction_text if w.lower().startswith('wh')]))
>>> for wh in wh_words:
... print(wh + ':', fdist[wh])
Practice 1/3
>>> wh_words = list(set([w.lower() for w in
fiction_text if w.lower().startswith('wh')]))
['wheel', 'whites', 'whisper', 'whitely', 'whatever',
'whigs', "what'd", 'whir', 'whip', 'whisked',
'wheedled', 'whirl', 'what', 'whiskey', 'whereas',
'when', 'wheels', 'wholly', 'whereabouts', 'whom',
'whinnied', 'which', 'whirled', 'white-clad',
'white', 'whispered', 'wharves', 'who', 'whose',
"what's", "who's", 'whistling', 'whisky-on-the-
rocks', "who'd", 'why', 'whirring', 'whisky',
'whether', 'where', 'whooping', 'wherever',
'whistled', 'whenever', 'while', 'wheezed',
"white's", 'wheeling', 'whole', 'whipping']
Practice 1/3
('what:', 186) ('when:', 192) ('whom:', 8) ('which:',
124) ('who:', 112) ('whose:', 11)("what's:", 6)
('why:', 42) ("who's:", 3) ('whether:', 11)
('whenever:', 8) ('whether:', 11) ('where:', 89)
条件付き確率分布
P(A|B) → BであるときのAである確率
むしろBごとにAを数え上げる、という用途が多い。
ジャンルごとに単語の分布を見る
結果をプロットしたりテーブルにしたり
Python上では、単語のリストを扱っていたところを、
条件と単語のペアのリストを扱うことになる
text = ['The', 'Fulton', 'County', 'Grand',
'Jury', 'said', ...]
FreqDist(text)
pairs = [('news', 'The'), ('news', 'Fulton'),
('news', 'County'), ...]
ConditionalFreqDist(pairs)
Example 2/5
人権宣言コーパスの複数の言語について、単語の長さの累積頻度
分布プロットを作成する。
>> from nltk.corpus import udhr
>>> languages = ['Chickasaw', 'English', 'German_Deutsch',
... 'Greenlandic_Inuktikut', 'Hungarian_Magyar', 'Ibibio_Efik']
>>> cfd = nltk.ConditionalFreqDist(
... (lang, len(word))
... for lang in languages
... for word in udhr.words(lang + '-Latin1'))
>>> cfd.plot(cumulative=True)
Example 2/5
Practice 2/3
人権宣言コーパスのある言語において、文字の出現
頻度分布プロットを作成する。
>>> from nltk.corpus import udhr
>>> raw_text = udhr.raw('Japanese_Nihongo-UTF8')
>>> nltk.FreqDist(raw_text).plot(20)
Practice 2/3
Example 3/5
米国大統領就任演説中、americaおよびcitizenとい
う単語の出現回数を、就任年度に対してプロットす
る。
>>> from nltk.corpus import inaugural
>>> cfd = nltk.ConditionalFreqDist(
... (target, fileid[:4])
... for fileid in inaugural.fileids()
... for w in inaugural.words(fileid)
... for target in ['america', 'citizen’]
... if w.lower().startswith(target))
就任演説の時代感
Practice 3/3
Brown Corpusのnewsおよびromanceカテゴリで、
どの曜日に対する言及が最も多いか調べる。
>>> cfd = nltk.ConditionalFreqDist((genre,w) for
genre in ['news','romance'] for w in
brown.words(categories=genre))
>>> days = [‘Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday', 'Saturday', 'Sunday']
Practice 3/3
>>> cfd.tabulate(samples=days)
Monday Tuesday Wednesday Thursday Friday
Saturday Sunday
news 54 43 22 20 41 33 51
romance 2 3 3 1 3 4 5
WordNet
WordNet
概念な階層構造を持った語彙目録
1985年からプリンストン大学にて開発
日本語WordNetは情報通信研究機構が2009年に
公開
最新版は2012年公開のver. 1.1
BSDライセンス(無償)
感情情報も付与したWordNet-Affectなどもある
http://wndomains.fbk.eu/wnaffect.html
WordNetの用語
同義語集合 Synset
見出し語(単語の「基本形」)Lemma
上位語 hypernym
すべてのXがYの種類の一であるならYはXの上位語である。
下位語 hyponym
すべてのYがXの種類の一であるならYはXの下位語である。
全体語 holonym
XがYの一部であるなら、YはXのholonymである。
部分語 meronym
YがXの一部であるなら、YはXのmeronymである。
Example 4/5
単語motorcarについてWordNetを参照する。
>>>from nltk.corpus import wordnet as wn
>>> wn.synsets('motorcar')
[Synset('car.n.01')]
>>> wn.synset('car.n.01').definition()
'a motor vehicle with four wheels; usually propelled
by an internal combustion engine’
>>> wn.synset('car.n.01').lemma_names()
['car', 'auto', 'automobile', 'machine', 'motorcar']
Example 4/5
>>> motorcar = wn.synset('car.n.01')
>>> types_of_motorcar = motorcar.hyponyms()
>>> types_of_motorcar[0]
Synset('ambulance.n.01’)
Example 4/5
>>> motorcar.hypernyms()
[Synset('motor_vehicle.n.01')]
>>> paths = motorcar.hypernym_paths()
>>> len(paths)
2
>>> motorcar.root_hypernyms()
[Synset('entity.n.01')]
Example 5/5
WordNetを使って単語の意味的な類似性を評価する。
>>> right = wn.synset('right_whale.n.01')
>>> orca = wn.synset('orca.n.01')
>>> tortoise = wn.synset('tortoise.n.01')
>>> novel = wn.synset('novel.n.01')
>>> right.path_similarity(minke)
0.25
>>> right.path_similarity(orca)
0.16666666666666666
>>> right.path_similarity(tortoise)
0.07692307692307693
>>> right.path_similarity(novel)
0.043478260869565216
Extra
Brown Corpus内でn回以上出現する単語を列挙する。
>>> fd = nltk.FreqDist(w.lower() for w in
brown.words())
>>> words = [vocab for vocab in fd.keys() if
fd[vocab] >= 3]
>>> len(words)
20615

More Related Content

Viewers also liked

Knowledge extraction from the Encyclopedia of Life using Python NLTK
Knowledge extraction from the Encyclopedia of Life using Python NLTKKnowledge extraction from the Encyclopedia of Life using Python NLTK
Knowledge extraction from the Encyclopedia of Life using Python NLTKAnne Thessen
 
Trend detection and analysis on Twitter
Trend detection and analysis on TwitterTrend detection and analysis on Twitter
Trend detection and analysis on TwitterLukas Masuch
 
NLTK: Natural Language Processing made easy
NLTK: Natural Language Processing made easyNLTK: Natural Language Processing made easy
NLTK: Natural Language Processing made easyoutsider2
 
NLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in PythonNLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in Pythonshanbady
 
Practical Natural Language Processing
Practical Natural Language ProcessingPractical Natural Language Processing
Practical Natural Language ProcessingJaganadh Gopinadhan
 

Viewers also liked (8)

Introduction to NLTK
Introduction to NLTKIntroduction to NLTK
Introduction to NLTK
 
Knowledge extraction from the Encyclopedia of Life using Python NLTK
Knowledge extraction from the Encyclopedia of Life using Python NLTKKnowledge extraction from the Encyclopedia of Life using Python NLTK
Knowledge extraction from the Encyclopedia of Life using Python NLTK
 
NLTK
NLTKNLTK
NLTK
 
Trend detection and analysis on Twitter
Trend detection and analysis on TwitterTrend detection and analysis on Twitter
Trend detection and analysis on Twitter
 
NLTK: Natural Language Processing made easy
NLTK: Natural Language Processing made easyNLTK: Natural Language Processing made easy
NLTK: Natural Language Processing made easy
 
NLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in PythonNLTK - Natural Language Processing in Python
NLTK - Natural Language Processing in Python
 
Practical Natural Language Processing
Practical Natural Language ProcessingPractical Natural Language Processing
Practical Natural Language Processing
 
NLTK in 20 minutes
NLTK in 20 minutesNLTK in 20 minutes
NLTK in 20 minutes
 

NLTK Book Chapter 2