LoginSignup
0
2

More than 5 years have passed since last update.

NLTK 平文コーパスとタグ付きコーパスの比較

Last updated at Posted at 2017-02-16

平文コーパスとChaSen形式のタグ付きコーパスの違いを確認した結果です。

MeCabのインストール

OSは、Ubuntu 14.04 を利用して パッケージマネージャーで導入できるものだけでインストールしました。

sudo apt-get install libmecab2 libmecab-dev mecab mecab-ipadic mecab-ipadic-utf8 mecab-utils

テキストデータの準備

テキストデータは、現代日本語であれば良いので、ウィッキペディア 3月のライオン の一部を引用しました。

ubuntu@ubuntu-xenial:~/nltk$ head -n 1 sometext.txt 
少年・桐山零は、幼いころに交通事故で家族を失い、父の友人である棋士、幸田に内弟子として引き取られ、15歳で将棋のプロ棋士になった。幸田の実子との軋轢もあり、六月町にて1人暮らしを始めた零は、1年遅れで高校に編入するが、周囲に溶け込めず校内で孤立し、将棋の対局においても不調が続いていた。

形態素解析済みコーパスの作成

NLTKの解説記事 Python による日本語自然言語処理 では、ChaSen形式の形態素解析済みのデータを利用していますから、MeCabを利用して、ChaSen形式の形態素解析データの作成することにしました。

ubuntu@ubuntu-xenial:~/nltk$ mecab -Ochasen sometext.txt > sometext.chasen
少年  ショウネン 少年  名詞-一般       
・ ・ ・ 記号-一般       
桐山  キリヤマ    桐山  名詞-固有名詞-人名-姓      
零 レイ  零 名詞-固有名詞-人名-名      
は ハ は 助詞-係助詞        
、 、 、 記号-読点       
幼い  オサナイ    幼い  形容詞-自立    形容詞・アウオ段    基本形
ころ  コロ  ころ  名詞-非自立-副詞可能       
に ニ に 助詞-格助詞-一般     
交通  コウツウ    交通  名詞-一般       
事故  ジコ  事故  名詞-一般       
で デ で 助詞-格助詞-一般     
家族  カゾク   家族  名詞-一般       
を ヲ を 助詞-格助詞-一般     
失い  ウシナイ    失う  動詞-自立   五段・ワ行促音便    連用形
、 、 、 記号-読点       
父 チチ  父 名詞-一般       
の ノ の 助詞-連体化        
友人  ユウジン    友人  名詞-一般       
で デ だ 助動詞   特殊・ダ    連用形
ある  アル  ある  助動詞   五段・ラ行アル   基本形
棋士  キシ  棋士  名詞-一般       
、 、 、 記号-読点       
幸田  コウダ   幸田  名詞-固有名詞-人名-姓      
に ニ に 助詞-格助詞-一般     
内弟子   ウチデシ    内弟子   名詞-一般       
として   トシテ   として   助詞-格助詞-連語 

NLTK タグ付きコーパス

ChaSen形式にした コーパスデータを読み込んで表示するコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import nltk
from nltk.corpus.reader.chasen import *
data = ChasenCorpusReader('./', 'sometext.chasen', encoding='utf-8')
print '/'.join( data.words()[0:100] )

上記コードの実行結果です。 平文コーパスに比べると「ひらがな」混じり単語の処理が改善されていることが解ります。

ubuntu@ubuntu-xenial:~/nltk$ ./chasenCorpusReader.py 
少年/・/桐山/零/は/、/幼い/ころ/に/交通/事故/で/家族/を/失い/、/父/の/友人/で/ある/棋士/、/幸田/に/内弟子/として/引き取ら/れ/、/15/歳/で/将棋/の/プロ/棋士/に/なっ/た/。/幸田/の/実子/と/の/軋轢/も/あり/、/六月/町/にて/1/人/暮らし/を/始め/た/零/は/、/1/年/遅れ/で/高校/に/編入/する/が/、/周囲/に/溶け/込め/ず/校内/で/孤立/し/、/将棋/の/対局/において/も/不調/が/続い/て/い/た/。/自ら/の/境遇/を/停滞/し

比較参考 平文コーパス

以下がNLTK の PlainTextCorpus リーダーで処理した結果です。

ubuntu@ubuntu-xenial:~/nltk$ ./plainTextCorpus.py 
少年/・/桐山零/は/、/幼/いころに/交通事故/で/家族/を/失/い/、/父/の/友人/である/棋士/、/幸田/に/内弟子/として/引/き/取/られ/、15/歳/で/将棋/の/プロ/棋士/になった/。/幸田/の/実子/との/軋轢/もあり/、/六月町/にて/1/人暮/らしを/始/めた/零/は/、1/年遅/れで/高校/に/編入/するが/、/周囲/に/溶/け/込/めず/校内/で/孤立/し/、/将棋/の/対局/においても/不調/が/続/いていた/。

上記のテキストの生成コード

#!/usr/bin/env python                                                                                                          
# -*- coding: utf-8 -*-

import nltk
from nltk.corpus.reader import *
from nltk.corpus.reader.util import *

jp_sent_tokenizer = nltk.RegexpTokenizer(u'[^ 「」!?。]*[!?。]')
jp_chartype_tokenizer = nltk.RegexpTokenizer(u'([ぁ-んー]+|[ァ-ンー]+|[\u4e00-\u9FFF]+|[^ぁ-んァ-ンー\u4e00-\u9FFF]+)')

data = PlaintextCorpusReader("./",
                              r'sometext.txt',
                              encoding='utf-8',
                              para_block_reader=read_line_block,
                              sent_tokenizer=jp_sent_tokenizer,
                              word_tokenizer=jp_chartype_tokenizer)

print '/'.join( data.words()[0:100] )
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2