2: 2016-11-11 (金) 18:08:41 njf[6] [7] [8] | 現: 2016-11-27 (日) 21:05:42 njf[6] [9] [10] | ||
---|---|---|---|
Line 15: | Line 15: | ||
EOS | EOS | ||
- | とツリー出力される。これはわかりやすいようでそうでもない表現なので、より厳密な表示をさせるため「-f1」オプションをつけて実行しなおすと以下のようになります。 | + | とツリー出力されます。これはわかりやすいようで曖昧な感じの表現です。より厳密な表示をさせるため「-f1」オプションをつけて実行しなおすと以下のようになります。 |
echo "これは私のもっている赤いペンです"|cabocha -f1 | echo "これは私のもっている赤いペンです"|cabocha -f1 | ||
Line 42: | Line 42: | ||
-最初の0は文節の通番。文頭なので0 | -最初の0は文節の通番。文頭なので0 | ||
- | -3Dは数字の部分がその文節がかかっている通番。ここでは通番3の「赤いペンです」にかかっている。かかり先がなければ-1。よって文末は常に-1 | + | -3Dは数字の部分がその文節がかかっている通番。ここでは通番3の「赤いペンです」にかかっている。かかり先がなければ-1。よって文末は常に-1。Dの意味は資料がなく不明 |
-0/1の主辞(文節の中心となる単語)と機能語(助詞など)の位置を示している。この例では「私」が主辞で「の」が機能語 | -0/1の主辞(文節の中心となる単語)と機能語(助詞など)の位置を示している。この例では「私」が主辞で「の」が機能語 | ||
-次の小数値はかかりやすさの度合い | -次の小数値はかかりやすさの度合い | ||
+ | |||
+ | CaboChaは文を文節、つまり形態素の集まりに分解し解析するので、CaboChaのそれぞれの結果には複数の形態素が含まれます。アスタリスクから始まる行の続きの行がその形態素です。つまりこの通番0の結果には「これ」「は」の二つの形態素が含まれます。 | ||
実際によく使うのは最初の通番と二番目のかかり先です。主辞/機能語は公式ページによると廃止も検討されています。かかりやすさの度合いは実際にどの程度精度に関わっているかは調査中だそうです。 | 実際によく使うのは最初の通番と二番目のかかり先です。主辞/機能語は公式ページによると廃止も検討されています。かかりやすさの度合いは実際にどの程度精度に関わっているかは調査中だそうです。 | ||
Line 138: | Line 140: | ||
|chunk_size|なし|文節の個数を取得する| | |chunk_size|なし|文節の個数を取得する| | ||
- | まず形態素解析のデータに関しては | + | 一方、形態素解析のデータに関しては |
|メソッド名|引数|概要| | |メソッド名|引数|概要| | ||
Line 157: | Line 159: | ||
|link|文節がかかっている通番| | |link|文節がかかっている通番| | ||
|token_size|含まれる形態素の数| | |token_size|含まれる形態素の数| | ||
- | |token_pos|含まれる形態素の銭湯の場所| | + | |token_pos|含まれる形態素の先頭の場所| |
|head_pos|主辞の場所| | |head_pos|主辞の場所| | ||
|func_pos|機能語の場所| | |func_pos|機能語の場所| | ||
Line 163: | Line 165: | ||
ほとんどのプロパティは前節のコマンドラインで実行した例で解説しているので、分からないところは戻って確認してください。token_posは例えば | ほとんどのプロパティは前節のコマンドラインで実行した例で解説しているので、分からないところは戻って確認してください。token_posは例えば | ||
- | first_token = parsed.token(chunk.token_pos) | + | first_token = parsed.token(chunk.token_pos) |
とするとその文節の最初の形態素が取得できます。 | とするとその文節の最初の形態素が取得できます。 | ||
- | 一方、tokenつまり形態素解析の結果についてはMecabのpythonバインディングと全く同じ格納のされかたをされています。例えば | + | 一方、tokenつまり形態素解析の結果についてはMecabのpythonバインディングと全く同じ格納のされかたをされています。詳細は[[自然言語解析/MeCabをpythonで使う]]を参照してください。 |
+ | |||
+ | 例えば | ||
print token.surface | print token.surface | ||
とすれば元の単語が表示されます。 | とすれば元の単語が表示されます。 | ||
- | 詳細は[[自然言語解析/MeCabをpythonで使う]]を参照してください。 | + | よって |
+ | |||
+ | 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の形態素解析の結果を保持するクラスです。 | ||
+ | |||
+ | *実際の利用例 [#he8d5f70] | ||
+ | |||
+ | 実際には例えば飲食店の口コミの解析で使ってみました。 | ||
+ | |||
+ | まず形態素の頻度解析を行い、その上位の名詞について係り受け解析を行い、かかっている語の中から形容詞を抜き出してみました。 | ||
+ | |||
+ | あるラーメン店でそれを行ってみた結果が以下の通りです。 | ||
+ | |||
+ | ラーメン :やさしい :良い :なく :分厚い :無かっ :嬉しい :安い :硬い :おいしい :優しい :うまい :潔い :旨い | ||
+ | スープ :熱い :おいしい :いい :茶色い :こい :薄い :高い :良い :うまい :柔かい :甘い | ||
+ | 麺 :柔い :固い :面白い :淡い :おいしい :硬い :柔かい :堅い | ||
+ | 卵 :無し :硬い :潔い :なく :良い | ||
+ | テーブル :多い | ||
+ | 豚骨 :薄い :おいしい :いい | ||
+ | |||
+ | 上の結果から、とんこつで茶色いスープ、固めの麺でトッピングは玉子、値段は安めで優しい味、テーブル席が多めの店かなと予想できます。 | ||
+ | |||
+ | 実際の口コミを読むと、麺は「固くなく」という表現が多く、実は柔らかいことがわかりました。上の結果でも「柔らかい」もあり微妙なところです。他の部分はあっていました。 | ||
+ | 否定語などの扱いをどうするかをちゃんとすれば、ある程度印象のようなものが解析できそうです。 | ||
+ | また料理は形容詞以外、例えば名詞(例:ボリュームがある)や副詞(例:こってり)、比喩表現などで説明することも多く、そういったものも解析できれば精度が上げられるかもしれません。 | ||
+ | 他の問題点として同じラーメンでも複数の主力メニューがあるとその印象が混じってしまう可能性があります。 | ||
+ | 対象となるのが何かを判断するには、各々の文がどういう構造かではなく、全体の文脈が必要となるので、この方法ではこの問題を解決するのは難しそうです。 | ||
- | &font(Red){編集中}; | + | 係り受けや頻度解析からさらに精度を上げるには、プログラムに何らかの形で「意味」を理解させたりすることが必要かも知れません。 |
(This host) = https://njf.jp