PandasでWeb上のテーブルデータを取得する。そして非常にシンプルな英単語暗記のためのアプリを作成する。

はじめに

この記事の最後に英単語15個を日本語訳とともに載せています。
その英単語表をPandasで取得して操作してみます。
最後にその結果を使って英単語を暗記するための単語帳アプリを作ってみました。

環境

pandasとlxmlを使用しました。どちらもpipでインストール可能です。
(lxmlは直接使用しませんがないとread_htmlを実行したときエラーが出ます)

データの取得

import pandas as pd

url = 'https://touch-sp.hatenablog.com/entry/2021/03/07/234555'
dfs = pd.read_html(url, encoding='utf-8')
df = dfs[0]

これだけでデータが取得できます。
read_htmlはサイト上にあるテーブルデータをあるだけ取得してリストで返してくれます。
この記事にはテーブルデータが1つしかないのでリストの長さは1です。
最終行でリストからデータフレームを取得してます。

完全重複の除去

「council」という単語をわざと重複して含めています。
次の1行で重複を除去できます。

df = df.drop_duplicates()

辞書型に変換

「conversation」という単語は「会話」と「談話」という日本語訳で別々の行に書かれています。
この単語の扱いをどうすればよいか?
この先取得したデータをどのように使用するかにもよりますが今回はpandasデータフレームをPythonの辞書型に変換することにします。一つの英単語に日本語訳をリストで登録すれば問題は解決します。

words_list = list(df['英単語'].unique())

words_dict = {}
for word in words_list:
    words_dict[word] = list(df[df['英単語']==word]['意味'])

保存

毎回Webページにアクセスするのは非現実的なのでpickleで保存しました。

import pickle

with open('words_dict.pkl', 'wb') as f:
    pickle.dump(words_dict, f)

英単語暗記のためのアプリ

非常にシンプルなアプリを即席で作りました。ここからはpyqt5のインストールも必要です。

import pickle
import random
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QFont

with open('words_dict.pkl', 'rb') as f:
    words_dict = pickle.load(f)

dict_keys = words_dict.keys()

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()
        self.question = ''
        self.new_question = True
        
    def initUI(self):
        
        self.label_q = QLabel()
        self.label_q.setAlignment(Qt.AlignCenter)
        self.label_q.setFont(QFont("Times", 20, QFont.Bold))
        
        self.label_a = QLabel()
        self.label_a.setAlignment(Qt.AlignCenter)
        self.label_a.setFont(QFont("Times", 20, QFont.Bold))
        
        layout = QVBoxLayout()
        layout.addWidget(self.label_q)
        layout.addWidget(self.label_a)
        self.setLayout(layout)
        self.show()

    def keyPressEvent(self, e):
        
        if e.key() == Qt.Key_Return:
            if self.new_question == True:
                self.label_a.clear()
                self.question = random.choice(list(dict_keys))
                self.label_q.setText(self.question)
                self.new_question = False
            else:
                self.label_a.setText(', '.join(words_dict[self.question]))
                self.new_question = True

app = QApplication(sys.argv)
ex =Window()
ex.setWindowTitle('単語帳')
ex.setGeometry(100,100,400,200)
sys.exit(app.exec_())

エンターキーをポンポンと連打するだけです。
英単語のテーブルはいろんな人がレベル別にして(高校3年レベル、英検2級レベルなど)公開してくれています。それらを今回のようにread_htmlでスクレイピングしても良いですし、自分でCSVファイルを作ってread_csvで読み込んでも良いと思います。
誰でも簡単に英単語暗記のためのアプリが作れます。

テーブルデー

英単語 意味
agenda 議題
chairperson 議長
handout 配布資料
conference 会議
council 会議
council 会議
conversation 会話
conversation 談話
majority 大多数
minute(s) 議事録
content 内容
suggestion 提案
argument 議論
committee 委員会
representative 代表者

2021年8月10日追記

PyQt6を使う場合はこちらです。
touch-sp.hatenablog.com

2022年3月29日追記

新たにスクリプトをブラッシュアップしました。
touch-sp.hatenablog.com