3: 2016-11-11 (金) 18:34:06 njf |
4: 2016-11-27 (日) 07:05:12 njf |
| EOS | | EOS |
| | | |
- | とツリー出力される。これはわかりやすいようでそうでもない表現なので、より厳密な表示をさせるため「-f1」オプションをつけて実行しなおすと以下のようになります。 | + | とツリー出力されます。これはわかりやすいようで曖昧な感じの表現です。より厳密な表示をさせるため「-f1」オプションをつけて実行しなおすと以下のようになります。 |
| | | |
| echo "これは私のもっている赤いペンです"|cabocha -f1 | | echo "これは私のもっている赤いペンです"|cabocha -f1 |
| -0/1の主辞(文節の中心となる単語)と機能語(助詞など)の位置を示している。この例では「私」が主辞で「の」が機能語 | | -0/1の主辞(文節の中心となる単語)と機能語(助詞など)の位置を示している。この例では「私」が主辞で「の」が機能語 |
| -次の小数値はかかりやすさの度合い | | -次の小数値はかかりやすさの度合い |
| + | |
| + | CaboChaは文を文節、つまり形態素の集まりに分解し解析するので、CaboChaのそれぞれの結果には複数の形態素が含まれます。アスタリスクから始まる行の続きの行がその形態素です。つまりこの通番0の結果には「これ」「は」の二つの形態素が含まれます。 |
| | | |
| 実際によく使うのは最初の通番と二番目のかかり先です。主辞/機能語は公式ページによると廃止も検討されています。かかりやすさの度合いは実際にどの程度精度に関わっているかは調査中だそうです。 | | 実際によく使うのは最初の通番と二番目のかかり先です。主辞/機能語は公式ページによると廃止も検討されています。かかりやすさの度合いは実際にどの程度精度に関わっているかは調査中だそうです。 |
| とすると、元の文章が空白区切りで出力されます | | とすると、元の文章が空白区切りで出力されます |
| | | |
| + | これらのことから、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){編集中}; | + | 係り受けや頻度解析からさらに精度を上げるには、プログラムに何らかの形で「意味」を理解させたりすることが必要かも知れません。 |