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

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

ただいまの
回答率

88.91%

pythonです、形態素解析でなぜアウトプットできているのかわからない。修正できない。

解決済

回答 1

投稿

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

fuji36_om

score 8

前提・実現したいこと

プログラミング初心者です。pythonを用いた形態素解析とGUIの勉強のため、
tkinter と janome.tokenizer を用いてプログラムを書きました。
インプットした文章から名詞、接続詞、動詞を抜き出し、ボタンを押せばアウトプットするプログラムを
書きましたが、ほぼコピペでなぜ動いているのかわからず、修正の仕方がわかりません。
力を貸していただければ幸いです。

要望としては
わかりやすい文で、解析、アウトプットする方法を教えてほしい。
入力した文章と逆になってアウトプットされているので、文章と同じ順番で出力する方法を教えてほしい。

発生している問題

1.入力した文章と逆になってアウトプットされているので文章と同じ順番で出力したい。

問題の例)

入力した文章   本日は晴天なり、そして私は買い物に出る。

出力した名詞   買い物;私;晴天;本日;
出力した接続詞  そして;
出力した動詞   出る;なり;


希望内容の例)

入力した文章   本日は晴天なり、そして私は買い物に出る。

出力した名詞   本日;晴天;私;買い物;
出力した接続詞  そして;
出力した動詞   なり;出る;


2.アウトプットするプログラムをほぼコピペでやっているので機能がわからない。他の書き方が知りたい。

プログラム内容

#tkinterのインポート
import tkinter as tk

from janome.tokenizer import Tokenizer  # Tokenizerのインポート
import re   # 正規表現モジュール

# オブジェクトTokenizeのインスタンス生成
t = Tokenizer()
################################################################################
# ウィンドウを作成
window = tk.Tk()
window.title("Hello, World!")# 試行タイトル1
window.geometry("400x500") # サイズ

title = tk.Label(text="コントロール画面")# 試行タイトル2
title.pack()
################################################################################
#ボタン1_入力内容を解析してアウトプット
def btn_click():
    s = str(txt_1.get())

    print([txt_2.insert(0,token.surface+";") for token in t.tokenize(s) 
           if token.part_of_speech.startswith('名詞')])# ←ここの機能

    print([txt_3.insert(0,token.surface+";") for token in t.tokenize(s) 
           if token.part_of_speech.startswith('接続詞')])# ←ここの機能

    print([txt_4.insert(0,token.surface+";") for token in t.tokenize(s) 
           if token.part_of_speech.startswith('動詞')])# ←ここの機能

#ボタンX_入力内容を初期化
def btn_clickX():
    txt_1.delete(0, tk.END)
    txt_2.delete(0, tk.END)
    txt_3.delete(0, tk.END)
    txt_4.delete(0, tk.END)        
################################################################################
# 各種ボタン設定

button1 = tk.Button(window,text = '要素解析',command = btn_click).place(x=175,y=30)
buttonX = tk.Button(window,text = 'リセットボタン', command = btn_clickX).place(x=175,y=350)

# テキスト注釈を表示
lbl_1 = tk.Label(text='文字入力')
lbl_1.place(x=30, y=150)

lbl_2 = tk.Label(text='名詞')
lbl_2.place(x=30, y=200)

lbl_3 = tk.Label(text='接続詞')
lbl_3.place(x=30, y=250)

lbl_4 = tk.Label(text='動詞')
lbl_4.place(x=30, y=300)

# テキストボックス
txt_1 = tk.Entry(width=45)
txt_1.place(x=90, y=150)

txt_2 = tk.Entry(width=45)
txt_2.place(x=90, y=200)

txt_3 = tk.Entry(width=45)
txt_3.place(x=90, y=250)

txt_4 = tk.Entry(width=45)
txt_4.place(x=90, y=300)

window.mainloop()

使用方法

1.文字入力と書いているテキストボックスに文章を入れる。
2.上にある要素解析ボタンを押す。
3.下にあるリセットボタンでテキストボックス内を消去する。

構文のコピペ元

Python, Janomeで日本語の形態素解析、分かち書き(単語分割)

 

初投稿、お見苦しい点ご了承ください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • aokikenichi

    2020/07/15 12:26

    Teratailの投稿ルールをお読みになりましたでしょうか
    丸投げの質問はだめです

    初心者であれば一から勉強なさってください。形態素解析、GUIと中程度の難度のものを2つ同時には無理だと思います

    キャンセル

  • fuji36_om

    2020/07/15 14:42

    適切な質問方法についての吟味が足りず、解決を急いてしまった点はおっしゃる通りです。
    しかし、他の方より望んでいた回答をいただいてしまった以上、不用意に修正するつもりはございません。
    以後、ルールに逸脱せぬよう努めます、ご容赦ください。

    キャンセル

回答 1

checkベストアンサー

+1

とりあえずどこまでわかってるのかよくわかりませんのでいちいち書きますが、
形態素解析の実際の出力処理をやっているのは
btn_click関数内で他の部分はGUIの書き出しや制御。
btn_clickX関数はテキストフィールドの値をリセットする処理をやっています。

なのでbtn_click関数部分のみに言及させていただきます。
形態素解析の結果をリストで返してくれるt.tokenize(s)処理をfor文で出力してみるとわかりますが、

for token in t.tokenize(s):
    print(token.surface)
本日
は
晴天
なり
、
そして
私
は
買い物
に
出る
。


このように入力順で返してくれていることがわかります。

入力順と逆になってしまうのは

print([txt_2.insert(0,token.surface+";") for token in t.tokenize(s) 
    if token.part_of_speech.startswith('名詞')])# ←ここの機能


この処理のtxt_2.insert関数の一つ目の引数に0を設定しており、
文字を追加していくたび先頭に追加されてしまうためです。

入力順で表示させたいのなら

print([txt_2.insert(tk.END,token.surface+";") for token in t.tokenize(s) 
    if token.part_of_speech.startswith('名詞')])# ←ここの機能


txt_2.insert関数の一つ目の引数にtk.ENDを設定すれば、
文字の最後に追加してくれるようになります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/15 14:13

    ご助言の程、誠にありがとうございました。
    下手な考え休むに似たりという諺をこれほど痛感したことはございません。
    独学で自身の進捗具合がわからず、できたプログラムに一喜一憂して
    思い上がっていた部分もあることを実感しました。
    改めて、基礎を固める必要性を感じました。

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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