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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

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

Q&A

解決済

2回答

2786閲覧

Python3_CGIのフォームからMeCabを動かし形態素解析

TAMANEKO

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

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

0グッド

0クリップ

投稿2018/06/19 13:04

編集2018/06/19 13:42

Python3_CGIのフォームの入力をMeCabで形態素解析

現在,Python3_CGIでwebアプリの実装をしております.フォームに入力されたテキストを受け取り,それをMeCabで形態素解析し,名詞だけを取り出そうとしています.
値の受け渡しはできているのですが,形態素解析のプログラムがうまく動かずRuntimeErrorが発生しているという状況です.エラーはPythonのcgitbモジュールで表示しています.

発生している問題・エラーメッセージ

Traceback (most recent call last): File "nlp.py", line 32, in <module> print(morpho.morpho(input)) File "/home/ken/public_html/cgi-bin/sample/morpho.py", line 8, in morpho tagger = MeCab.Tagger() # MeCabのインスタンス File "/usr/lib64/python3.6/site-packages/MeCab.py", line 307, in __init__ this = _MeCab.new_Tagger(*args) RuntimeError

イメージ説明

形態素解析のプログラムはcgi,フォームを介さずに実行すると期待通りの出力をしてくれます.

該当のソースコード3つ

フォームを記述したHTML

lang

1<!--form.html--> 2<!DOCTYPE HTML> 3<!--Credibility実験用 Prototype--> 4<html> 5<head> 6<meta charset='utf-8'> 7</head> 8<body> 9<header> 10<h3>形態素解析</h3><hr><br> 11</header> 12<!--入力フォーム><--> 13<form action="./nlp.py" method="post"> 14<input type="text" name="text" value=" "><br> 15<input type="reset" value="Clear"> 16<input type="submit" value="Input"> 17</form></div> 18</body> 19</html>

フォームを受け取り,Mecabのスクリプトを関数として実行し,ブラウザに表示するcgiスクリプト

lang

1#nlp.py 2#!/usr/local/bin/python3 3#_*_coding:utf-8_*_ 4import sys, io, os, re, cgi, cgitb, unicodedata 5import MeCab 6import morpho 7 8# cgi設定------------------------------------------------------------------------ 9sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # python cgiで日本語が文字化けするのを防ぐ 10cgitb.enable() # エラーがあった場合に出力 11print("Content-Type: text/html") # HTML is following 12print() # blank line, end of headers 13 14# formの受け取り-------------------------------------------------------- 15form = cgi.FieldStorage() 16text = form.getvalue("text") # Target Information 17input = str(input) # fromで受け取った値が NoneType 型になっていたので変換 18 19# html上部----------------------------- 20html_head = """ 21<!DOCTYPE html> 22<html> 23<head> 24<meta charset='utf-8'> 25<title>test</title> 26</head> 27<body> 28<h2>Result</h2><hr> 29""" 30print(html_head) # htmlの上部の出力 31 32# pythonによるデータ処理--------------- 33print(morpho.morpho(input)) # 形態素解析のスクリプトを実行 34 35# html下部----------------------------- 36print("<br><br><br><hr>") 37html_bottom = """ 38</body></html> 39""" 40print(html_bottom)

形態素解析で名詞の抽出を行うスクリプト(cgiからではなくターミナルからだと問題なく動く)

lang

1#morpho.py 2#!/usr/local/bin/python3 3#_*_coding:utf-8_*_ 4# nlp.pyから渡された入力(日本語)に対して形態素解析を行う 5import re 6import MeCab 7# Morphological Analysis (日本語文章の名詞を抽出)----------------------------------- 8def morpho(input): 9 tagger = MeCab.Tagger() # MeCabのインスタンス 10 tagger.parse('') # 一度空の文字列をparseしないとエラー 11 text_node = tagger.parseToNode(input) # 解析 12 words = [] # 単語を格納するリスト.ここにtextの名詞が格納される. 13 while text_node: 14 word = text_node.surface.split(",")[0] # surfaceは単語を取得 15 pos = text_node.feature.split(",")[0] # featureは品詞(PartsOfSpeech)を取得 16 if pos == "名詞": # 文章に名詞が含まれたら,その単語を取り出す 17 words.append(word) 18 text_node = text_node.next # nextで全形態素に順次アクセス""" 19 result = " ".join(words) # 抜き出したキーワードを文字列に変換し,空白で繋げて格納 20 return result

試したこと

・形態素解析のスクリプトは単体ではエラーなしできちんと動く.cgiから関数として実行するとエラー
・formから受け取った値が NoneTypeになっていたのでstrに変換

開発環境

Python(3.6.3)
OS : CentOS(7.4.1708)

よろしくお願いします!

検索は大体網羅していると思います.一日中作業しても解決しなかったので,とっさにアカウントを作って質問させていただきました.初心者で言葉足らずな部分もあると思いますがよろしくお願いいたします!

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

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

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

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

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

guest

回答2

0

ベストアンサー

・形態素解析のスクリプトは単体ではエラーなしできちんと動く.cgiから関数として実行するとエラー

すぐ思いつくのは権限周りの何かです。mecabの本体、dll、辞書あたりに片っ端からCGIから叩ける権限(755とか)を貼っていくと動くようになるかもしれません。

投稿2018/06/19 13:09

hayataka2049

総合スコア30933

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

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

TAMANEKO

2018/06/19 13:30

早速の回答ありがとうございます! 本体,辞書などの権限はいじってなかったので試してみたいと思います.ありがとうございます!
hayataka2049

2018/06/19 13:34

_MeCab.cpython-36m(以下略)がちゃんと読めていないか、これの中でエラーになっているようなので、まずはそこから
TAMANEKO

2018/06/19 14:00

わかりました,まずはそこから試してみたいと思います.結果がわかったらまた更新します.
TAMANEKO

2018/06/20 09:31

mecab本体と辞書の権限の変更を試してみましたが何も変わらず同じエラーのままでした。また、パスの問題かとも思い、同じように環境変数の設定も一通りいじってみましたが変わりませんでした。 と言っても、この辺のやり方が間違っているor不十分という可能性もありますが・・・ 形態素解析のプログラムをモジュールにせずにnlp.pyの中に書いて実行しても同じ結果になります。 そしてやはりターミナルからだと何の問題もなく、モジュールにしようがnlp.py中に書こうが上手くいきます。 cgiでの実行の時のみエラーが発生すると言う状況なので、引き続き権限やパス周りで頑張ってみます。 進展があればまた報告します!
hayataka2049

2018/06/20 10:42

そうですか。ちょっとこっちでも考えてみます
TAMANEKO

2018/06/22 22:28

数日いじってみた結果1つ分かったことがあります。やはり権限の問題のようです。apacheがcgiを実行するので、SuExecを使ってcgiを使うときだけapacheがユーザーにスイッチ出来るようにすればいいようです。 このSuExecがまた曲者で詰まってしまってますが、この質問とはまた別の問題になりそうなので、理由が分かったところで表題の問題は解決とさせていただきます。 はじめの回答がなければここまでたどり着けませんでした、本当にありがとうございました!
guest

0

「ただし、環境変数MECABRCがないと、pythonコマンドからMeCabを使用したスクリプトを実行すると、

Traceback (most recent call last):
File "a.py", line 3, in <module>
mecab = MeCab.Tagger("-Owakati")
File "h:\src\mecab-python3\MeCab.py", line 307, in init
this = _MeCab.new_Tagger(*args)
RuntimeError
というエラーが出力される。

その場合、環境変数MECABRCに、

<インストールパス>\etc\mecabrc
を設定すればよい。

また、環境変数PATHに<インストールパス>\binを追加する。」
http://tadaoyamaoka.hatenablog.com/entry/2017/04/24/205509

投稿2018/08/30 08:46

hafnium

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問