ページへ戻る
− Links
印刷
自然言語解析/CaboChaをpythonで使う
の編集 ::
NJF Wiki
xpwiki
:
自然言語解析
/
CaboChaをpythonで使う
の編集
# o198f23f の編集
ページ内容:
*Pythonから使う [#o198f23f] CaboChaはpythonから使うこともできます。インストール方法などは他にもたくさんの資料があるのでそちらにゆずるとして、使い方は、まずインポートして import CaboCha 次にパーサーを取得します。このとき前節のコマンドラインオプションと同様に、辞書を指定することもできます。 c = CaboCha.Parser("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/") あとはこのパーサーでパースします。 parsed = c.parse("これは私のもっている赤いペンです") ツリー表示なども可能です。 parsed = c.parse("これは私のもっている赤いペンです") print parsed.toString(CaboCha.FORMAT_TREE) これは-----D 私の-D | もっている-D 赤いペンです EOS 注意しないといけないのは、パーサーは内部的にデータの保持はしてくれないことです。つまり parsed = c.parse("これは私のもっている赤いペンです") parsed2 = c.parse("おいしいチーズケーキをもらった") print parsed.toString(CaboCha.FORMAT_TREE) とすると結果は おいしい-D チーズケーキを-D もらった EOS となり変数parsed2に結果を格納したつもりでも、parsedの方も書きかわってしまいます。そのため、パースしたその結果を保持したければ、自分で他の変数に結果を移さなければなりません。 そのためにはパース結果からデータを取り出す必要があります。 パーサーが返す結果には次のメソッドがあります。 まず文節のデータに関しては |メソッド名|引数|概要| |chunk|整数|引数番目の文節のデータを取得する| |chunk_size|なし|文節の個数を取得する| 一方、形態素解析のデータに関しては |メソッド名|引数|概要| |token|整数|引数番目の形態素のデータを取得する| |token_size|なし|形態素の個数を取得する| というメソッドがあります。 よって文節のデータを全て取り出すには、先ほどパースした「parsed」に対して以下のようにします。 for i in range(parsed.chunk_size()): chunk = parsed.chunk(i) このとき取り出した一つ一つのデータ(上の例ではchunk)には以下のプロパティがあります。 |プロパティ名|概要| |score|かかりやすさの度合い| |link|文節がかかっている通番| |token_size|含まれる形態素の数| |token_pos|含まれる形態素の先頭の場所| |head_pos|主辞の場所| |func_pos|機能語の場所| ほとんどのプロパティは前節のコマンドラインで実行した例で解説しているので、分からないところは戻って確認してください。token_posは例えば first_token = parsed.token(chunk.token_pos) とするとその文節の最初の形態素が取得できます。 一方、tokenつまり形態素解析の結果についてはMecabのpythonバインディングと全く同じ格納のされかたをされています。詳細は[[自然言語解析/MeCabをpythonで使う]]を参照してください。 例えば print token.surface とすれば元の単語が表示されます。 よって for i in range(parsed.chunk_size()): chunk = tree.chunk(i) for j in range(chunk.token_size): token = parsed.token(chunk.token_pos + j) print token.surface, とすると、元の文章が空白区切りで出力されます これらのことから、Cabochaの結果をpythonで保持するには、次のようなクラスがあれば良いことになります。 各々の文節(chunk)について class CabochaChunk: __ATTRS = ("score","link","token_pos","token_size","head_pos","func_pos") def __init__(self,chunk): for attr in self.__ATTRS: setattr(self, attr, getattr(chunk, attr)) を定義し、 cabochaCunk = CabochaChunk(chunk) とすれば文節のデータを保持できます。 あとはこれと形態素のデータを配列で保持するクラスを作れば、CaboChaの結果が保持できます。 class CabochaResult: def __init__(self,tree): self.reSetPrm(tree) def reSetPrm(self,tree): self.chunks = [] self.tokens = [] for i in range(tree.chunk_size()): chunk = tree.chunk(i) cc = CabochaChunk(chunk) self.chunks.append(cc) for i in range(tree.token_size()): token = tree.token(i) mr = MecabResult(oken.surface,token.feature) self.tokens.append(mr) ここでMecabResultはCabochaChunkと同様にMecabの形態素解析の結果を保持するクラスです。
編集の要約:
Q & A 認証:
ページ更新時は次の質問にお答えください。(プレビュー時は必要ありません)
Q:
「大阪」の読みがな?(ひらがなで)
A:
お名前:
タイムスタンプを変更しない
テキスト整形のルールを表示する
[1]
Links list
(This host) = https://njf.jp
(This host)
/cms/modules/xpwiki/?cmd=edit&help=true&page=%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E8%A7%A3%E6%9E%90%2FCaboCha%E3%82%92python%E3%81%A7%E4%BD%BF%E3%81%86