質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

解決済

1回答

3421閲覧

形態素解析の結果の一部だけを取得したい

postres

総合スコア15

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

1クリップ

投稿2014/10/16 09:14

windows環境で、PHPでMeCabを使って形態素解析をしています。

その結果の中から、品詞(動詞、名詞など)と原形だけを取得したいのですが、どうすればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

preg_match()を用いるといいでしょう。

preg_match()は正規表現によるマッチングを行います。
preg_match() : http://www.php.net/manual/ja/function.preg-match.php
正規表現 : http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE

MeCabによる形態素解析の結果の出力は、
表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
となります。

これにpreg_matchを使用して品詞と原形を取得する場合の正規表現は、

/^.+\t(.+),.+,.+,.+,.+,.+,(.+),.+,.+/

とすればいいでしょう。

ただし例外として、未知語の場合についてはこの限りではありません。
unk.defファイルを見るとわかりますが、特に手を加えていなければ普通の単語と出力が異なるので、
正規表現が上記のものと一致しません。
例)MeCab 名詞,一般,,,,,*

この場合は原形がないので、質問者様の意図にもよりますが、
取得するのであれば表層形になるでしょうか。

その場合の正規表現は

/^(.+)\t(.+),.+,.,.,.,.,./

でいいかと思います。

以下にサンプルコードを示します。

//サンプルコード

lang

1<?php 2 3$path = '"C:\Program Files\MeCab\bin\mecab.exe"'; 4 5$input = "MeCabを使う";//形態素解析をする文字列 6 7 8//形態素解析 9$descriptorspec = array( 100 => array("pipe","r"), 111 => array("pipe","w") 12); 13$process = proc_open($path, $descriptorspec, $pipes); 14if(is_resource($process)) { 15 fwrite($pipes[0], $input); 16 fclose($pipes[0]); 17 while(!feof($pipes[1])){ 18 $output[] = fgets($pipes[1]);//形態素解析の結果を$outputに代入 19 } 20 fclose($pipes[1]); 21 proc_close($process); 22} 23 24 25//正規表現 26 27$pattern1 = '/^.+\t(.+),.+,.+,.+,.+,.+,(.+),.+,.+/u'; 28$pattern2 = '/^(.+)\t(.+),.+,.,.,.,.,./u';//未知語の場合 29 30foreach($output as $key => $value){ 31 //$matchesに結果が代入される 32//$matches[0]にはパターン全体にマッチしたテキストが代入される 33preg_match($pattern1, $value, $matches); 34if (count($matches) != 0){ 35 echo "<pre>"; 36 print_r($matches); 37 echo "</pre>"; 38 }else{ 39 //未知語の場合 40 preg_match($pattern2, $value, $matches); 41 if (count($matches) != 0){ 42 echo "<pre>"; 43 print_r($matches); 44 echo "</pre>"; 45 } 46} 47} 48 49?> 50 51//出力 52 53Array 54( 55[0] => MeCab 名詞,一般,*,*,*,*,* 56[1] => MeCab 57[2] => 名詞 58) 59Array 60( 61[0] => を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 62[1] => 助詞 63[2] => を 64) 65Array 66( 67[0] => 使う 動詞,自立,*,*,五段・ワ行促音便,基本形,使う,ツカウ,ツカウ 68 [1] => 動詞 69 [2] => 使う 70 )

投稿2014/10/17 02:30

savior

総合スコア195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問