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

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

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

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

Mecab

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

Q&A

解決済

1回答

752閲覧

php-mecabの解析結果を配列で取得したい

agep31

総合スコア29

PHP

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

Mecab

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

0グッド

0クリップ

投稿2018/07/03 08:31

前提・実現したいこと

php-mecabを用いてweb上の指定したurlから<h1>タグを取り出し、取り出した要素に対して形態素解析を行っています。
形態素解析の結果を配列に入れらたのはよいのですが、以下のような形で配列に入れたいです。

<理想の出力結果>
array(31) {
[0]=>国内  名詞,一般,,,,,国内,コクナイ,コクナイ
[1]=>ツアー 名詞,一般,,,,,ツアー,ツアー,ツアー
[2]=>、  記号,読点,,,,,、,、,、
[3]=>海外ツアー 名詞,固有名詞,一般,,,*,海外ツアー,カイガイツアー,カイガイツアー


のような形で、分けられた単語をそれぞれ配列に入れたいです。今現在では、[0]の中にすべての解析結果が入ってしまっています。

該当のソースコード

<!DOCTYPE html> <html> <head> <title>研究</title> </head> <body> <?php $opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0rn")); $context = stream_context_create($opts); //対象URL $url = "https://search.mwt.co.jp/mintl/detail/CFMZ58AAH002.html?mediacd=ZTP"; $html = file_get_contents($url,false,$context); $dom = new DOMDocument; @$dom->loadHTML( mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII,JIS,UTF-8,eucJP-win,SJIS-win'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); $xpath = new DOMXPath($dom); $options = array('-d', '/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd'); $mecab = new \MeCab\Tagger($options); echo "/*------------h1----------------*/<br>"; foreach ($xpath->query('//h1') as $h1_result){ $h1_values[]=$h1_result->nodeValue; } echo "<pre>"; print_r($h1_values); echo "</pre>"; if(empty($h1_result->nodeValue)){ $mecab_h1_result = []; echo "<br>該当なし<br>"; }else{ echo "<br>h1タグの形態素解析結果"; foreach($h1_values as $n){ $mecab_h1_result[] = $mecab->parse($n); } echo "<pre>"; print_r($mecab_h1_result); echo "</pre>"; } ?>

出力結果

/*------------h1----------------*/ Array ( [0] => 国内ツアー、海外ツアー、ホテル・旅館のご予約は名鉄観光で ) h1タグの形態素解析結果 Array ( [0] => 国内 名詞,一般,*,*,*,*,国内,コクナイ,コクナイ ツアー 名詞,一般,*,*,*,*,ツアー,ツアー,ツアー 、 記号,読点,*,*,*,*,、,、,、 海外ツアー 名詞,固有名詞,一般,*,*,*,海外ツアー,カイガイツアー,カイガイツアー 、 記号,読点,*,*,*,*,、,、,、 ホテル 名詞,一般,*,*,*,*,ホテル,ホテル,ホテル ・ 記号,一般,*,*,*,*,・,・,・ 旅館 名詞,一般,*,*,*,*,旅館,リョカン,リョカン の 助詞,連体化,*,*,*,*,の,ノ,ノ ご 接頭詞,名詞接続,*,*,*,*,ご,ゴ,ゴ 予約 名詞,サ変接続,*,*,*,*,予約,ヨヤク,ヨヤク は 助詞,係助詞,*,*,*,*,は,ハ,ワ 名鉄 名詞,固有名詞,組織,*,*,*,名鉄,メイテツ,メイテツ 観光 名詞,サ変接続,*,*,*,*,観光,カンコウ,カンコー で 助詞,格助詞,一般,*,*,*,で,デ,デ EOS )

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

ubuntu18.04
Apache/2.4.29
PHP 7.2.5
辞書:mecab-ipadic-NEologd

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

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

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

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

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

guest

回答1

0

ベストアンサー

前回( https://teratail.com/questions/134033 )の回答に書きましたが、参考URLの内容をよく読めばほぼやりたいことが書いてあると思います。
$mecab->parseToNode を使ってみてはいかがでしょうか。

投稿2018/07/03 08:40

mather

総合スコア6753

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

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

agep31

2018/07/03 08:47

ご回答ありがとうございます。$mecab->parse($n)のところを$mecab->parseToNode($n)に変えるということでしょうか?
mather

2018/07/03 08:51

変えてみればわかりますが、置き換えただけではうまくいきません。 参考URLのparseToNodeの使い方をじっくり観察して、自分で答えを導き出してください。
agep31

2018/07/03 09:33

foreach文の中身を以下のように変更することで理想の形になりました。 助かりました。どうもありがとうございます。 foreach($h1_values as $a){ $nodes = $mecab->parseToNode($a); foreach($nodes as $n){ $array[] = $n->getSurface().$n->getFeature(); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問