GUIツールで文書内にどんな人名や地名が盛り込まれているのを一発確認（２）


##１. 作ったもの

####（ GUIツールの起動方法 )

#####スクリプトファイルは、第２節に掲載してあります。

```Python3:Terminal
$ python3 tkinter_ner_radiobutton.py
```

#####（サンプル・テキスト）
・[NHK NewsWeb（配信日）2020年11月20日 19時08分「レムデシビル WHO 入院患者への投与勧められないとの指針公表」](https://www3.nhk.or.jp/news/html/20201120/k10012721961000.html?utm_int=detail_contents_news-related_003)

![スクリーンショット 2020-11-20 21.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/346d16d7-bbe1-77cd-93e1-818ebc85e441.png)

##（ 動かしたところ ）
__・ 起動直後の画面__
![スクリーンショット 2020-11-21 0.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/fb504804-3a49-2599-7407-6d1b1d71573f.png)

__・ 「人名」と書かれたラジオボタンを選択し、「単語を洗い出す」ボタンを押した後に、表示される画面__
![スクリーンショット 2020-11-21 0.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/9dca2f21-ab93-ec5c-3f06-653845fecfd6.png)

__・ 続けて、ラジオボタン「地名」を選択し、「単語を洗い出す」ボタンを押した後__
![スクリーンショット 2020-11-21 0.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/9e24d57b-5ec7-f100-73b9-fc9182c1c014.png)

__・ 続けて、ラジオボタン「組織名」を選択し、「単語を洗い出す」ボタンを押した後__
![スクリーンショット 2020-11-21 0.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/9f8a7280-8614-ca5c-3679-546a38ba0b2e.png)

__・ 続けて、ラジオボタン「日付」を選択し、「単語を洗い出す」ボタンを押した後__
![スクリーンショット 2020-11-21 0.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/4674689e-f16f-bd18-57c6-29f973d3b536.png)

__・ 続けて、ラジオボタン「イベント名」を選択し、「単語を洗い出す」ボタンを押した後__
![スクリーンショット 2020-11-21 0.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/d353081a-f40f-f23c-1ffa-5ad254adf405.png)

__・ 続けて、ラジオボタン「金額」を選択し、「単語を洗い出す」ボタンを押した後__
![スクリーンショット 2020-11-21 0.31.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862466/38214678-352e-010c-478a-e1e14c433d11.png)

___

##２. 実装スクリプト

#####（ 参考にしたウェブページ ）
・[ミナピピンの研究室「【Python/tkinter】GUIツールでファイル選択処理を実装する」](https://tkstock.site/2020/01/11/python-tkinter-gui-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e9%81%b8%e6%8a%9e-%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89/)


```Python3:tkinter_ner_radiobutton.py
# Tkinterのライブラリを取り込む
import tkinter, spacy, collections, os
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
from tkinter import messagebox
from spacy.matcher import Matcher

# グローバル変数の宣言
named_entity_label = ""

# ファイルの参照処理
def click_refer_button():
    fTyp = [("","*")]
    iDir = os.path.abspath(os.path.dirname(__file__))
    filepath = filedialog.askopenfilename(filetypes = fTyp, initialdir = iDir)
    file_path.set(filepath)
    
# 固有表現抽出処理
def extract_words_by_entity_label(text, named_entity_label):
    nlp = spacy.load('ja_ginza')
    text = text.replace("\n", "")
    doc = nlp(text)
    words_list = [ent.text for ent in doc.ents if ent.label_ == named_entity_label]
    return words_list
    
# 出力処理
def click_export_button():
    # 入力されたテキストファイルの相対パスを取得
    path = file_path.get()
    # 選択された固有表現の種別名を取得
    named_entity_label = flg.get()
    
    if path[-4:] == '.txt':
        f = open(path, encoding="utf-8")
        text_data = f.read()
        label_word_list = extract_words_by_entity_label(text_data, named_entity_label)
        # 指定された固有表現に該当する単語を取得した結果（単語リスト）を、{単語文字列 ： 出現回数}の辞書に変換する
        count_per_word = collections.Counter(label_word_list)
        # 出現回数の多い順番に並べる
        freq_per_word_dict = dict(count_per_word.most_common())
        #output_list =  ["{k}  : {v}".format(k=key, v=value) for (key, value) in freq_per_word_dict.items()]
        # 単語数を取得する
        unique_word_num = len(freq_per_word_dict)
        if unique_word_num > 0:
            message = "{num}件の{label}が見つかりました。\n\n出現回数順に並べた結果は以下です。\n\n".format(num=unique_word_num, label=named_entity_label)
            word_list = list(freq_per_word_dict.keys())
            word_freq_list = list(freq_per_word_dict.values())
            for i in  range(unique_word_num):
                tmp = "{rank}番目の単語 : {word}\n出現回数 : {count}\n\n===================\n".format(rank=i+1, word=word_list[i], count=word_freq_list[i])
                message += tmp
        else:
            message = "{num}件の{label}が見つかりました。\n\n".format(num=unique_word_num, label=named_entity_label)     
        
        textBox.insert(END, message)
    else:
        textBox.insert(END, '\nファイルがテキストファイルではありません')
    
if __name__ == '__main__':
    # ウィンドウを作成
    root = tkinter.Tk()
    root.title("固有表現計数カウンター") # アプリの名前
    root.geometry("730x500") # アプリの画面サイズ

    # Frame1の作成
    frame1 = ttk.Frame(root, padding=10)
    frame1.grid()

    # 「ファイル」ラベルの作成
    s = StringVar()
    s.set('ファイル名：')
    label1 = ttk.Label(frame1, textvariable=s)
    label1.grid(row=0, column=0)

    #テキストボックスの作成
    file_path = StringVar()
    filepath_entry = ttk.Entry(frame1, textvariable=file_path, width=50)
    filepath_entry.grid(row=0, column=1)

    # ラジオボタンの作成
    #共有変数
    flg= StringVar()
    
    #ラジオ1
    rb1 = ttk.Radiobutton(frame1, text='人名',value="PERSON", variable=flg)
    rb1.grid(row=1,column=0)
 
    #ラジオ2
    rb2 = ttk.Radiobutton(frame1, text='地名',value="LOC", variable=flg)
    rb2.grid(row=1,column=1)
    
    #ラジオ3
    rb3 = ttk.Radiobutton(frame1, text='組織名', value="ORG", variable=flg)
    rb3.grid(row=1,column=2)
    
    #ラジオ4
    rb4 = ttk.Radiobutton(frame1, text='日付',value="DATE", variable=flg)
    rb4.grid(row=2,column=0)
    
    #ラジオ5
    rb5 = ttk.Radiobutton(frame1, text='イベント名',value="EVENT", variable=flg)
    rb5.grid(row=2,column=1)
    
    #ラジオ6
    rb6 = ttk.Radiobutton(frame1, text='金額',value="MONEY", variable=flg)
    rb6.grid(row=2,column=2)
    
    # Frame2の作成
    frame2 = ttk.Frame(root, padding=10)
    frame2.grid()
    
    # テキスト出力ボタンの作成
    export_button = ttk.Button(frame2, text='ファイルから指定した種類の単語を洗い出す', command=click_export_button, width=70)
    export_button.grid(row=0, column=0)

    # テキスト出力ボックスの作成
    textboxname = StringVar()
    textboxname.set('\n\n処理結果 ')
    label3 = ttk.Label(frame2, textvariable=textboxname)
    label3.grid(row=1, column=0)
    textBox = Text(frame2, width=100)
    textBox.grid(row=2, column=0)

    # ウィンドウを動かす
    root.mainloop()
```

###（ 今後やりたいこと ）

1. ファイルを画面内に__ドラッグ・ドロップして指定__できるようにしたい。
2. 拡張子が".txt"のファイルだけでなく、__".pdf"や".pptx"のファイルを扱えるように__したい。PDFファイルやPowerPointファイルから、テキスト部分のみを切り出してテキストファイルに吐き出すPythonのモジュールを使うか、UNIXのコマンドをPythonの*os.system()*か*subprocess*メソッドで用いることで実現できそう。
3. 画面のテキスト入力欄に、日本語を打ち込めるようにしたい。
4. Pythonの環境構築がされていないPCで、スタンドアロンで動く*exe*ファイルや*MacOSアプリ*を作りたい。*Electron*や*Pyinstaller*は、Pythonモジュールのパスの設定がしんどそう。でも頑張りたい。