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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Mecab

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

Q&A

解決済

2回答

1341閲覧

配列にある各要素に対しての形態素解析を行いたい

agep31

総合スコア29

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Mecab

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

0グッド

0クリップ

投稿2018/06/27 06:27

前提・実現したいこと

配列に格納されている各要素に対してmecabを使って形態素解析を行いたいのですが、出力をひとつの配列にするのではなく、要素ごとに配列に格納したいです。

形態素解析を行っている部分がまだいまいち理解できていなく、出力結果がwhile文の中のoutputという配列に入っているのはわかるのですが、各要素ごとに配列を作りその配列に形態素解析の結果を格納する場合、どのように変更すればよいのかわかりません。

現時点では以下のように出力されています。

foo Array ( [0] => foo 名詞,固有名詞,組織,*,*,*,* [1] => EOS [2] => ) bar Array ( [0] => foo 名詞,固有名詞,組織,*,*,*,* [1] => EOS [2] => [3] => bar 名詞,固有名詞,組織,*,*,*,* [4] => EOS [5] => ) hello Array ( [0] => foo 名詞,固有名詞,組織,*,*,*,* [1] => EOS [2] => [3] => bar 名詞,固有名詞,組織,*,*,*,* [4] => EOS [5] => [6] => hello 名詞,固有名詞,組織,*,*,*,* [7] => EOS [8] => ) world Array ( [0] => foo 名詞,固有名詞,組織,*,*,*,* [1] => EOS [2] => [3] => bar 名詞,固有名詞,組織,*,*,*,* [4] => EOS [5] => [6] => hello 名詞,固有名詞,組織,*,*,*,* [7] => EOS [8] => [9] => world 名詞,固有名詞,組織,*,*,*,* [10] => EOS [11] => )

該当のソースコード

<?php $array = array("foo", "bar", "hello", "world"); $path = '"C:\Program Files\MeCab\bin\mecab.exe"'; $i = 0; $count = count($array); while($i<$count){ $input = $array[$i]; echo $input; $descriptorspec = array( 0 => array("pipe","r"), 1 => array("pipe","w") ); $process = proc_open($path, $descriptorspec, $pipes); if(is_resource($process)) { fwrite($pipes[0], $input); fclose($pipes[0]); while(!feof($pipes[1])){ $output[] = fgets($pipes[1]); } fclose($pipes[1]); proc_close($process); } echo "<pre>"; print_r($output); //形態素解析の結果の出力 echo "</pre>"; $i++; } ?>

補足情報(FW/ツールのバージョンなど)

php5.6.37 eclipseOxygen

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

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

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

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

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

guest

回答2

0

$output[] = fgets($pipes[1]); $output[$input][] = fgets($pipes[1]);
とすれば
["foo" => ["foo 名詞,固有名詞,組織,*,*,*,*","EOS", "",], "bar" => ["bar 名詞,固有名詞,組織,*,*,*,*", "EOS", ""], "world"=>[…],]みたいになると思います。

というか、形態素ではなく、PHPの話ですし、なぜわざわざPHPでやるのか分かりませんが、もっと使いなれた言語でやったほうがいいんじゃないでしょうか?

投稿2018/06/27 08:02

papinianus

総合スコア12705

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

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

0

ベストアンサー

こんにちは。
当方の環境がCentOSのmecab辞書なので、書き方やロジックが異なると思いますが、結果としては、こんな感じになればよいですか?

プログラム

<?php $str = 'foo bar hello world'; $options = array('-d', '/usr/local/lib/mecab/dic/mecab-ipadic-neologd'); $mecab = new MeCab_Tagger($options); $nodes = $mecab->parseToNode($str); $temps = array(); foreach ($nodes as $n) { // 文字取得 $val = $n->getSurface(); // その文字を配列のキーとして保存 if ($val) { $temps[$val] = $n->getFeature(); } } var_dump($temps);

var_dump結果

array(3) { ["foo"]=> string(55) "名詞,固有名詞,人名,一般,*,*,FOO,フウ,フー" ["bar"]=> string(34) "名詞,固有名詞,組織,*,*,*,*" ["hello world"]=> string(88) "名詞,固有名詞,一般,*,*,*,Hello world,ハローワールド,ハローワールド" }

*私の辞書では、「hello world」は、一文として捉えるようです。

たぶん、ですが、

$output[] = fgets($pipes[1]);

の「$output[]」部分を、うまいこと該当文字を拾って$valのような変数に格納し、「$output[$val]」としてあげれば出来そうな気がします。環境が違うので検証出来ず、拾い方まではごめんなさい。。

参考になれば幸いです。

投稿2018/06/27 07:49

SaintKnowledge

総合スコア368

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

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

agep31

2018/07/02 07:10

ご回答ありがとうございます。こちら側の環境を変更し、php-mecabから実行できるようにしました。ご提示されたソースコードを実行してみました。入力が文字列の場合は理想の形になったのですが、元の文字列が配列に格納されている場合、どのようにすればよいのでしょうか?
SaintKnowledge

2018/07/02 07:24

仕組み上可能なら、最初に配列を文字列に変換すればよいと思います。 ``` $array = array("foo", "bar", "hello", "world"); $str = implode(" ", $array); echo $str; ``` foo bar hello world 元のロジックで、下の方の回答でもイケると思いますよ。
agep31

2018/07/02 07:38

ご回答ありがとうございます。聞きたいことが変わってきてしまったので、違う質問をさせて頂きたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問