「python自然言語処理」ノート---chap 2テキスト語彙リソースを取得

7992 ワード

2.1テキストコーパスの取得
古騰堡語料庫
import nltk
nltk.corpus.gutenberg.fileids()
[u'austen-emma.txt', u'austen-persuasion.txt', u'austen-sense.txt', u'bible-kjv.txt', u'blake-poems.txt', u'bryant-stories.txt', u'burgess-busterbrown.txt', u'carroll-alice.txt', u'chesterton-ball.txt', u'chesterton-brown.txt', u'chesterton-thursday.txt', u'edgeworth-parents.txt', u'melville-moby_dick.txt', u'milton-paradise.txt', u'shakespeare-caesar.txt', u'shakespeare-hamlet.txt', u'shakespeare-macbeth.txt', u'whitman-leaves.txt']
emma = nltk.corpus.gutenberg.words(u'austen-emma.txt')
len(emma)
192427

raw()関数:言語学的に処理されていないファイルの内容を与えます.したがって、例えば、len(gutenberg.raw('blake-poems.txt')は、語間のスペースを含むテキストに現れる語彙の個数を教えてくれます.
sents()関数:テキストを文に分割し、各文は語チェーンテーブルです.
macbeth_sentences = gutenberg.sents('shakespeare-macbeth.txt')   # 
macbeth_sentences[1037]
['Double', ',', 'double', ',', 'toile', 'and', 'trouble', ';',
'Fire', 'burne', ',', 'and', 'Cauldron', 'bubble']
longest_len = max([len(s) for s in macbeth_sentences])   # 
[s for s in macbeth_sentences if len(s) == longest_len]

ネットとチャットテキスト
NLTKのネットテキスト小集合の内容はFirefox交流フォーラム、ニューヨークで何気なく聞いた会話、「カリブ海賊」の映画脚本、個人広告、ワインの評論を含む.
from nltk.corpus import webtext
for fileid in webtext.fileids():
    print fileid,webtext.raw(fileid)[:60],'...'

10000以上の投稿を含むインスタントメッセージングチャットの返信コーパス.15個のファイルに分けられ、各ファイルには数百個の特定の日付と特定の年齢のチャットルームが含まれている.ファイル名には、日付、チャットルーム、投稿数が含まれます.
from nltk.corpus import nps_chat
chatroom=nps_chat.posts('10-19-20s_706posts.xml')
chatroom[123]

ブラウンコーパス
ブラウンコーパスには500の異なるソースのテキストが含まれており、ニュース、社説などのテキストによって分類されています.
ブラウンコーパスの各セクションのサンプルドキュメント
ID
ファイル
文体
説明
A16
ca16
ニュースニュース
Chicago Tribune: Society Reportage
B02
cb02
社説editorial
Christian Science Monitor: Editorials
C17
cc17
レビューレビュー
Time Magazine: Reviews
D12
cd12
宗教religion
Underwood: Probing the Ethics of Realtors
E36
ce36
趣味hobbies
Norling: Renting a Car in Europe
F25
cf25
伝説lore
Boroff: Jewish Teenage Culture
G22
cg22
純文学belles_lettres
Reiner: Coping with Runaway Technology
H15
ch15
政府government
US Office of Civil and Defence Mobilization: The Family Fallout Shelter
J17
cj19
博覧会learned
Mosteller: Probability with Statistical Applications
K04
ck04
小説フィクション
W.E.B. Du Bois: Worlds of Color
L13
cl13
ミステリーミステリー
Hitchens: Footsteps in the Night
M01
cm01
SFサイエンスfiction
Heinlein: Stranger in a Strange Land
N14
cn15
アドベンチャー
Field: Rattlesnake Ridge
P12
cp12
ロマンス
Callaghan: A Passion in Rome
R06
cr06
ユーモア
Thurber: The Future, If Any, of Comedy
 
from nltk.corpus import brown
brown.categories()            # 
brown.words(categories='news')# 
brown.words(fileids=['cg22'])
brown.sents(categories=['news', 'editorial', 'reviews'])

ブラウンコーパスは文体間の系統的な違いを研究する文体学という言語学研究である.
異なる文体における情態動詞の使い方を比較する.
ステップ1:特定の文体のカウントを生成します.
from nltk.corpus import brown
news_text=brown.words(categories='news')# s
fdist=FreqDist([w.lower() for w in news_text])# , 
modals=['can','could','may','might','must','will']
for m in modals:
    print m+':',fdist[m],
from nltk.corpus import brown
import nltk
cfd = nltk.ConditionalFreqDist((genre, word)
                          for genre in brown.categories()
                          for word in brown.words(categories=genre))
genres = ['news', 'religion', 'hobbies', 'science_fiction', 'romance', 'humor']
modals = ['can', 'could', 'may', 'might', 'must', 'will']
cfd.tabulate(conditions=genres, samples=modals)

#cfdで作成されたスペースに注意し、1行に置かないで、2つのforループの配置位置に注意してください.実行結果は次のとおりです.
                 can could  may might must will 
           news   93   86   66   38   50  389 
       religion   82   59   78   12   54   71 
        hobbies  268   58  131   22   83  264 
science_fiction   16   49    4   12    8   16 
        romance   74  193   11   51   45   43 
          humor   16   30    8    8    9   13 

分析の結果、ニュース文体の中で最もよく見られる情態動詞はwillであり、言語文体の中で最もよく見られる情態動詞はcouldである.
ロイターコーパス
ロイター通信コーパスには10788のニュースドキュメントが含まれており、計130万字が含まれています.90のテーマに分かれ、「トレーニング」と「テスト」によって2つのグループに分けられます.
from nltk.corpus import reuters
reuters.fileids()       # 
reuters.categories()    # 


# , 。 fileid fileids 
reuters.categories('traing/9865')
reuters.categories(['traing/9865','traing/9880'])

reuters.fileids('barley')
reuters.fileids(['barley','corn'])
# 
reuters.words('traing/9865')[:14]
reuters.words(['traing/9865','traing/9880'])

reuters.words(categories='barley')
reuters.words(categories=['barley','corn'])

就任演説コーパスでamericaとcitizenの使用状況を観察します.
from nltk.corpus import inaugural
import nltk
#inaugural.fileids()     
#[fileid[:4] for fileid in inaugural.fileids()]
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))
cfd.plot()

実行結果は上図のようで、cfdのフォーマットに注意して、3つのforループとifの位置合わせ、matplotlibパッケージを詰めて、つまり図を描くことができて、たとえパッケージを呼び出さなくても
テキストコーパスの注釈
多くのテキスト・コーパスには、言語学的寸法、語学的寸法、ネーミング・エンティティ、構文構造、意味ロールなどの他の言語のコーパスが含まれています.
テキストコーパスの構造
テキストコーパスの一般的な構造:
最も簡単なコーパスは、孤立した特別な組織のないテキストの集合です.一部のコーパスは、例えば文体(ブラウンコーパス)などの分類によって組織されている.テーマカテゴリ(ロイターコーパス)など、いくつかの分類が重複します.他のコーパスでは、時間の経過に伴う言語の使い方の変化(就任演説コーパス)を表すことができます.

説明
fileids()
コーパス内のファイル
fileids([categories])
これらの分類に対応するコーパス内のファイル
categories()
コーパス内の分類
categories([fileids])
これらのファイルに対応するコーパスの分類
raw()
コーパスの元の内容
raw(fileids=[f1,f2,f3])
ファイルの元の内容を指定
raw(categories=[c1,c2])
分類の元の内容の指定
words()
コーパス全体の語彙
words(fileids=[f1,f2,f3])
ファイル内の語彙の指定
words(categories=[c1,c2])
分類内の語彙の指定
sents()
分類文の指定
sents(fileids=[f1,f2,f3])
ファイル内の文の指定
sents(categories=[c1,c2])
分類文の指定
abspath(fileid)
ディスク上のファイルの場所の指定
encoding(fileid)
ファイルのエンコード(知っていれば)
open(fileid)
指定したコーパスファイルを開くファイルフロー
root()
ローカルにインストールされているコーパスルートディレクトリへのパス
コーパスのアクセス方法の違い:
raw=gutenberg.raw('burgess-busterbrown.txt')# 
raw[1:20]
words=gutenberg.words('burgess-busterbrown.txt')# 
words[1:20]
sents=gutenberg.sents('burgess-busterbrown.txt')# 
sents[1:20]

自分のコーパスに載せる
ファイルシステム内のファイルの位置を確認します.次の例では、あなたのファイルが/usr/share/dictディレクトリの下にあると仮定します.どの位置でも変数corpus_をrootの値はこのディレクトリに設定されます.PlaintextCorpusReader初期化関数