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

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

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

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

Mecab

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

Q&A

解決済

1回答

1349閲覧

複数のURLから名詞を抽出したい

agep31

総合スコア29

PHP

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

Mecab

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

0グッド

0クリップ

投稿2018/09/18 05:17

編集2018/09/18 05:20

前提・実現したいこと

複数のURLから名詞を抽出し、URLごとの配列に格納したいです。
URLからのhtmlの取得、mecabでの形態素解析はできているのですが、現時点では複数のURLから形態素解析した結果がURLごとに分けられておらず、一つの配列に入っている状態です。これを以下のようにしたいのですが、どのようにすればよいかわからず困っています。

<現在の形> ・$body_text(urlからbodyタグの抽出) Array ( [0]当ブログの最新記事や月別アーカ・・・ [1] スマートフォン用の表示でnewd・・・ ) ・$result(名詞の抽出) Array ( [0]無料 [1]ログイン [2]まとめ    ・    ・    ・ [849]都市 ) <理想の形> ・$body_text(urlからbodyタグの抽出) Array ( [0]当ブログの最新記事や月別アーカ・・・ [1] スマートフォン用の表示でnewd・・・ ) ・$result(名詞の抽出) Array ( [0] [0]無料 [1]ログイン [2]まとめ    ・    ・    ・ [410]言葉 [1] [0]キーボード [1]殺人 [2]町      ・      ・      ・ [849]都市 )

$result[0]には$body_text[0]の名詞の抽出結果を格納し、$result[1]には$body_text[1]の名詞の抽出結果を格納したいです.

該当のソースコード

<!DOCTYPE html> <html> <head> <title>研究</title> </head> <body> <?php $opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0rn")); $context = stream_context_create($opts); $options = array('-d', '/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd'); $mecab = new \MeCab\Tagger($options); $url = array("https://matome.naver.jp/odai/2145532060816761001", "https://www.jyunpuumanpan.com/entry/2017/06/19/210000"); foreach($url as $tmp){ $html = file_get_contents($tmp,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); $body_text[] = str_replace(array(" ", " ", " ", " ", "◆", "■", "●", "★", "\xC2\xA0", "\r\n", "\r", "\n", "\t", PHP_EOL), "", $xpath->query('//body')->item(0)->nodeValue); foreach($body_text as $tmp){ $nodes = $mecab->parseToNode($tmp); foreach($nodes as $tmp2){ if($tmp2->getPosId() == 38){ $result[] = $tmp2->getSurface(); } } } } echo "<pre>"; print_r($body_text); print_r($result); echo "<pre>";

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

ubuntu18.04
Apache/2.4.29
PHP 7.2.5

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

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

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

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

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

guest

回答1

0

自己解決

ループをforeachで回すのではなくforで回し,$result[$i][] = $tmp2->getSurface();とすることで解決できました.ありがとうございました。

投稿2018/09/20 04:41

agep31

総合スコア29

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問