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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1366閲覧

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

fuji36_om

総合スコア8

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/15 02:30

前提・実現したいこと

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

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

発生している問題

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

問題の例)

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

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


希望内容の例)

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

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


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

プログラム内容

lang

1#tkinterのインポート 2import tkinter as tk 3 4from janome.tokenizer import Tokenizer # Tokenizerのインポート 5import re # 正規表現モジュール 6 7# オブジェクトTokenizeのインスタンス生成 8t = Tokenizer() 9################################################################################ 10# ウィンドウを作成 11window = tk.Tk() 12window.title("Hello, World!")# 試行タイトル1 13window.geometry("400x500") # サイズ 14 15title = tk.Label(text="コントロール画面")# 試行タイトル2 16title.pack() 17################################################################################ 18#ボタン1_入力内容を解析してアウトプット 19def btn_click(): 20 s = str(txt_1.get()) 21 22 print([txt_2.insert(0,token.surface+";") for token in t.tokenize(s) 23 if token.part_of_speech.startswith('名詞')])# ←ここの機能 24 25 print([txt_3.insert(0,token.surface+";") for token in t.tokenize(s) 26 if token.part_of_speech.startswith('接続詞')])# ←ここの機能 27 28 print([txt_4.insert(0,token.surface+";") for token in t.tokenize(s) 29 if token.part_of_speech.startswith('動詞')])# ←ここの機能 30 31#ボタンX_入力内容を初期化 32def btn_clickX(): 33 txt_1.delete(0, tk.END) 34 txt_2.delete(0, tk.END) 35 txt_3.delete(0, tk.END) 36 txt_4.delete(0, tk.END) 37################################################################################ 38# 各種ボタン設定 39 40button1 = tk.Button(window,text = '要素解析',command = btn_click).place(x=175,y=30) 41buttonX = tk.Button(window,text = 'リセットボタン', command = btn_clickX).place(x=175,y=350) 42 43# テキスト注釈を表示 44lbl_1 = tk.Label(text='文字入力') 45lbl_1.place(x=30, y=150) 46 47lbl_2 = tk.Label(text='名詞') 48lbl_2.place(x=30, y=200) 49 50lbl_3 = tk.Label(text='接続詞') 51lbl_3.place(x=30, y=250) 52 53lbl_4 = tk.Label(text='動詞') 54lbl_4.place(x=30, y=300) 55 56# テキストボックス 57txt_1 = tk.Entry(width=45) 58txt_1.place(x=90, y=150) 59 60txt_2 = tk.Entry(width=45) 61txt_2.place(x=90, y=200) 62 63txt_3 = tk.Entry(width=45) 64txt_3.place(x=90, y=250) 65 66txt_4 = tk.Entry(width=45) 67txt_4.place(x=90, y=300) 68 69window.mainloop() 70

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

###構文のコピペ元
Python, Janomeで日本語の形態素解析、分かち書き(単語分割)

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

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

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

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

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

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

aokikenichi

2020/07/15 03:26

Teratailの投稿ルールをお読みになりましたでしょうか 丸投げの質問はだめです 初心者であれば一から勉強なさってください。形態素解析、GUIと中程度の難度のものを2つ同時には無理だと思います
fuji36_om

2020/07/15 05:42

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

回答1

0

ベストアンサー

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

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

python

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

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

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

python

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

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

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

python

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

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

投稿2020/07/15 04:00

編集2020/07/15 04:14
yureighost

総合スコア2183

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

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

fuji36_om

2020/07/15 05:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問