Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

NLTK Book Chapter 2

841 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

NLTK Book Chapter 2

  1. 1. NLTK Book Chapter 2 @torithetorick
  2. 2. Chapter 2の目標 NLTK内蔵のコーパスや語彙目録(lexicon)を 使って、文書の特徴にアクセスする方法をマス ターします。 条件付き確率分布が使えたらOKです。 Python寄りの話題はあまり触れません。 メソッド定義、クラス定義など
  3. 3. NLTKコーパス Gutenberg Corpus 25,000冊の書籍 Web & Chat Corpus Brown Corpus カテゴリ分けされた500件の素材 文体の違い Reuters Corpus タグ付けた10,788件のニュース素材 Inaugural Address Corpus 歴代米国大統領就任演説集
  4. 4. NLTK語彙目録 Word Corpus ただの単語リスト Pronouncing Corpus 発音情報付 Comparative wordlist (Swadesh wordlist) 多言語の比較 WordNet
  5. 5. 就任演説の時代感
  6. 6. 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
  7. 7. 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])
  8. 8. 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']
  9. 9. 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)
  10. 10. 条件付き確率分布 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)
  11. 11. 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)
  12. 12. Example 2/5
  13. 13. Practice 2/3 人権宣言コーパスのある言語において、文字の出現 頻度分布プロットを作成する。 >>> from nltk.corpus import udhr >>> raw_text = udhr.raw('Japanese_Nihongo-UTF8') >>> nltk.FreqDist(raw_text).plot(20)
  14. 14. Practice 2/3
  15. 15. 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))
  16. 16. 就任演説の時代感
  17. 17. 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']
  18. 18. 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
  19. 19. WordNet
  20. 20. WordNet 概念な階層構造を持った語彙目録 1985年からプリンストン大学にて開発 日本語WordNetは情報通信研究機構が2009年に 公開 最新版は2012年公開のver. 1.1 BSDライセンス(無償) 感情情報も付与したWordNet-Affectなどもある http://wndomains.fbk.eu/wnaffect.html
  21. 21. 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である。
  22. 22. 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']
  23. 23. Example 4/5 >>> motorcar = wn.synset('car.n.01') >>> types_of_motorcar = motorcar.hyponyms() >>> types_of_motorcar[0] Synset('ambulance.n.01’)
  24. 24. Example 4/5 >>> motorcar.hypernyms() [Synset('motor_vehicle.n.01')] >>> paths = motorcar.hypernym_paths() >>> len(paths) 2 >>> motorcar.root_hypernyms() [Synset('entity.n.01')]
  25. 25. 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
  26. 26. 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

×