![]() |
山内の演習のページ/研究室演習13/Python2http://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%BB%B3%C6%E2%A4%CE%B1%E9%BD%AC%A4%CE%A5%DA%A1%BC%A5%B8%2F%B8%A6%B5%E6%BC%BC%B1%E9%BD%AC13%2FPython2 |
![]() |
山内の演習のページ
訪問者数 1552 最終更新 2015-12-01 (火) 12:54:18
前のページ ⇒ 山内の演習のページ/研究室演習13/Python
[1]
添付のファイル sample.txt を
1) 行単位で読み込んで ⇒ readlines が便利
2) それぞれの行をMeCabで解析して ⇒ 使い方は前回説明した
3) 解析の結果(parseToNodeしたあと、それのsurfaceとfeature)をprintせよ
[2]
[1]のプログラムを書き換えて([1]は取っておいて、それをコピーして書き換えよ)
1) [1]の3)の中から、名詞のみをprintするプログラムを作れ
[3]
[2]のプログラムを書き換えて([2]は取っておく)
1) 名詞ごとに、それぞれの出現回数を数えてプリントするプログラムを作れ
2) 出現回数(頻度)によってソートし、回数の多いものから順にプリントするプログラムを作れ (sortを使うと簡単にできる)
[4]
より大きなデータについて、同じ処理を試みよ。具体的には、oregano mint上の各人のホームディレクトリ上に下記のファイルを用意したので、実験してみよ
tw12110617.txt tw12110618.txt
[5]
1) 同一ツイート中に「共起」する2つの名詞のペアを取り出して、プリントするプログラムを作れ
2) 共起する名詞のペアの出現回数(頻度)を数えてプリントするプログラムを作れ
3) 2)の結果を、回数の多いものから順にプリントするプログラムを作れ
参照: ノート/テキストマイニング/共起分析 (2013-05-12追記)
ファイルは、読み書きする前に、openしておく。openの使い方は
f = open('ファイル名', 'r')
ファイル名の所に、ファイルの名前を指定する。2番目の引数は、openのモードを指定するもので、'r'は読出しのみ、'w'は書き出しのみ、'rw'は読み書き、その他はネットで調べてみよ。
戻り値fはファイル型のオブジェクトが戻る。これを指定して、ファイルの読み書き操作をする。ファイルオブジェクトに対するメソッド(操作)はマニュアルを参照せよ。
Pythonのファイルfの読出しには、いくつかのメソッドあるが、
read: ファイルのすべてを読込み、それを文字列として格納
u = f.read() は、uにファイル全体を文字列(バイト列)として返す
readline: 1行ずつ読出し(テキストファイルに限る)
u = f.readline() は、uに1行分だけ返す。ファイル全体を読むには繰り返す必要
readlines: ファイルのすべてを読込み、行ごとを要素としたリストとして格納(テキストファイルに限る)
u = f.readlines() は、uに行ごとを要素としたリストを返す
が使える。
readlinesを使う場合は
f = open('ファイル名', 'r') u = f.readlines() f.close() ← ファイルの利用はこれで終わり for l in u: print l
但し、lには行末に改行文字が含まれるので、print文で改行するのと合わせて2回改行されるだろう。それがどうしてもいやならば、print文で改行しないか、lの最後の文字を取り除くのがよかろう。
readlineを使う場合は
f = open('ファイル名', 'r') l = f.readline() ← 最初の1行はここで読み込む while l: ← lが空になるまで繰り返す print l ← 前に読んだ行をプリント l = f.readline() ← 次の行からはここで読み込む f.close
行末の改行文字については、readlinesと同じである。
MeCabのfeature部分は、コンマ区切りの文字列として返されている。(あまり便利ではない)
仕方ないので、自分でコンマで区切られたそれぞれのフィールドを取り出さなければならない。
文字列操作には、組込み型としての文字列オブジェクトに対するメソッドと、文字列ライブラリ(特に正規表現とcodecsが便利)がある。ここでは、組込み型のメソッドのうち、splitを使う。
splitは、入力文字列を、指定した文字を「区切り文字」として、分割する。テキストではp.63に説明があるので参照。 これを使って、コンマを区切りとして分割すれば、featureのそれぞれの欄を取り出すことができる。
featureの欄は、元々が設定可能なので、よくわからん。一応、C版のサンプルのページでは
表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
となっているが、このうち表層形の部分はsurface要素となっており、feature要素には含まれていない。
プログラムとしては、
m = mt.parseToNode(u'今日は良い天気です') while m: print "m.surface\t", m.surface, "\t", m.feature mm = m.feature.split(',') hinshi = mm[0] hinshi1 = mm[1] hinshi2 = mm[2] hinshi3 = mm[3]
のように取り出してゆくことになる。
なお、データが'*'になっているものについて、次のような説明が見つかった。
"品詞細分類3" "品詞細分類3"って出力されてないけど、ChaSenではどの位置に出てくるのか、わからなかったのでN-Bestオプションで出力して確認してみた $ mecab -N3 桜 桜 名詞,一般,*,*,*,*,桜,サクラ,サクラ EOS 桜 名詞,固有名詞,人名,姓,*,*,桜,サクラ,サクラ EOS 桜 名詞,固有名詞,人名,名,*,*,桜,サクラ,サクラ EOS
係り受けの解析を行うためにCaboChaを使うことが出来る。
#!/usr/bin/python # -*- coding: utf-8 -*- import CaboCha c = CaboCha.Parser() sentence = "太郎はこの本を二郎を見た女性に渡した。" #使いかたその1 〜 parseToStringで結果を文字列として受け取る print c.parseToString(sentence) #使いかたその2 〜 parseだけで留めておき、出力文字列へはtoStringで変換する tree = c.parse(sentence) print tree.toString(CaboCha.FORMAT_TREE) print tree.toString(CaboCha.FORMAT_LATTICE) print tree.toString(CaboCha.FORMAT_XML)
FORMAT_XMLを使うと、要素ごとにXMLの形式で出力(プリンタブル)する。
もちろん、treeのままで内容を見てもよいのだが、treeそのものはまだリスト形式になっていないので、使いづらい気がする。(たとえばここ や ここ を参照)
たとえばこんなことをやってみたらどうだろうか?
1) 文学作品のテキストマイニング
フリーのテキストが得られる 青空文庫 から、たとえば夏目漱石の「坊ちゃん」と「吾輩は猫である」「こころ」「それから」ぐらいを対象に、語の分布や語の対の分布、文の長さ、その他いろいろな文法的な特徴を取り出してみる。同様のことを森鴎外の幾つかの作品「舞姫」や「高瀬舟」「山椒大夫」「雁」などについて試し、ある文を与えた時にそれがどちらの文か、2人の作家の違いが判定できるか試す。(この分野は計量言語学と呼ばれていた)
2)