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

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

ただいまの
回答率

90.46%

  • Python 3.x

    7002questions

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

  • Mecab

    182questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 317

Hebizi

score 1

 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

<!--form.html-->
<!DOCTYPE HTML>
<!--Credibility実験用 Prototype-->
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<header>
<h3>形態素解析</h3><hr><br>
</header>
<!--入力フォーム><-->
<form action="./nlp.py" method="post">
<input type="text" name="text" value=" "><br>
<input type="reset" value="Clear">
<input type="submit" value="Input">
</form></div>
</body>
</html>

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

#nlp.py
#!/usr/local/bin/python3
#_*_coding:utf-8_*_
import sys, io, os, re, cgi, cgitb, unicodedata
import MeCab
import morpho

# cgi設定------------------------------------------------------------------------
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')  # python cgiで日本語が文字化けするのを防ぐ
cgitb.enable()  # エラーがあった場合に出力
print("Content-Type: text/html")  # HTML is following
print()  # blank line, end of headers

# formの受け取り--------------------------------------------------------
form = cgi.FieldStorage()
text = form.getvalue("text")  # Target Information
input = str(input)  # fromで受け取った値が NoneType 型になっていたので変換

# html上部-----------------------------
html_head = """
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>test</title>
</head>
<body>
<h2>Result</h2><hr>
"""
print(html_head)  # htmlの上部の出力

# pythonによるデータ処理---------------
print(morpho.morpho(input)) # 形態素解析のスクリプトを実行

# html下部-----------------------------
print("<br><br><br><hr>")
html_bottom = """
</body></html>
"""
print(html_bottom)

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

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

 試したこと

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

 開発環境

Python(3.6.3)
OS : CentOS(7.4.1708)

 よろしくお願いします!

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/19 22:30

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

    キャンセル

  • 2018/06/19 22:34

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

    キャンセル

  • 2018/06/19 23:00

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

    キャンセル

  • 2018/06/20 18:31

    mecab本体と辞書の権限の変更を試してみましたが何も変わらず同じエラーのままでした。また、パスの問題かとも思い、同じように環境変数の設定も一通りいじってみましたが変わりませんでした。
    と言っても、この辺のやり方が間違っているor不十分という可能性もありますが・・・

    形態素解析のプログラムをモジュールにせずにnlp.pyの中に書いて実行しても同じ結果になります。

    そしてやはりターミナルからだと何の問題もなく、モジュールにしようがnlp.py中に書こうが上手くいきます。

    cgiでの実行の時のみエラーが発生すると言う状況なので、引き続き権限やパス周りで頑張ってみます。
    進展があればまた報告します!

    キャンセル

  • 2018/06/20 19:42

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

    キャンセル

  • 2018/06/23 07:28

    数日いじってみた結果1つ分かったことがあります。やはり権限の問題のようです。apacheがcgiを実行するので、SuExecを使ってcgiを使うときだけapacheがユーザーにスイッチ出来るようにすればいいようです。

    このSuExecがまた曲者で詰まってしまってますが、この質問とはまた別の問題になりそうなので、理由が分かったところで表題の問題は解決とさせていただきます。

    はじめの回答がなければここまでたどり着けませんでした、本当にありがとうございました!

    キャンセル

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    7002questions

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

  • Mecab

    182questions

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