山内の演習のページ
訪問者数 1351      最終更新 2015-12-01 (火) 12:54:18

前のページ ⇒ 山内の演習のページ/研究室演習13/Python

Pythonの演習問題その1 (2012-11-21)

[1]
 添付のファイル filesample.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追記)

readlinesの使い方

ファイルは、読み書きする前に、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部分の扱いについて

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 (係り受け解析)を使う (2012-11-17)

係り受けの解析を行うために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そのものはまだリスト形式になっていないので、使いづらい気がする。(たとえばここ や ここ を参照)

演習問題 少し本格的に分析してみよう (2012-11-21追記)

たとえばこんなことをやってみたらどうだろうか?

1) 文学作品のテキストマイニング
フリーのテキストが得られる 青空文庫 から、たとえば夏目漱石の「坊ちゃん」と「吾輩は猫である」「こころ」「それから」ぐらいを対象に、語の分布や語の対の分布、文の長さ、その他いろいろな文法的な特徴を取り出してみる。同様のことを森鴎外の幾つかの作品「舞姫」や「高瀬舟」「山椒大夫」「雁」などについて試し、ある文を与えた時にそれがどちらの文か、2人の作家の違いが判定できるか試す。(この分野は計量言語学と呼ばれていた)

2)


添付ファイル: filesample.txt 673件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-01 (火) 12:54:18 (2025d)