edic2convを使った後、例文を削って自分用のankiフォーマットに編集するスクリプトをpythonで書いた

この記事を見るような方ならば、きっと以下のサイトを目にしていることだろう。

kanzenmap.nomaki.jp

rubyu.hatenablog.com

E-DICをcsv形式で出力してくれるツールが提供されており、大変ありがたい。

ただ、出力されたcsvファイルをankiにそのまま流し込んだものは、個人的には学習しづらかった。

そこで、自分用に編集した話を書き残しておく。

以降では『英和イディオム完全対訳辞典』の編集について書く。『動詞を使いこなすための英和活用辞典』も編集したのだがスクリプトの内容はほぼ同じであるため、記事にはしない。

編集方針を立てる

edic2convを使用すると

  • 英和イディオム完全対訳辞典 語義
  • 英和イディオム完全対訳辞典 対訳(英和)
  • 英和イディオム完全対訳辞典 対訳(和英)

の3種類のcsvファイルが出力される。

出力すればわかるが、「対訳」の例えば英和のファイルの内容は次のようになっている。

  • 1列目(ankiカードの表に対応):英語の例文
  • 2列目(ankiカードの裏に対応):その訳

f:id:armik:20191007112834p:plain
英和イディオム完全対訳辞典 対訳(英和)

和英は1列目と2列目が逆転したものになっている。

見ての通り見出しがないため、このままankiに流し込んでは覚えにくいと思った。いきなり例文だけが表に現れることになるためだ。

見出しを追加しても良いのだが、例文からそれにに対応する見出しを選び出すのは(少なくとも私の技術力では)難しい。

一方、見出しがあるのは「語義」の方だ。「語義」のファイルの内容は次のようになっている。

  • 1列目:見出し
  • 2列目:見出し+意味+例文①+例文①の訳+例文②+例文②の訳+...

f:id:armik:20191007112841p:plain
英和イディオム完全対訳辞典 語義

こちらは1列目に例文がなく、2列目にまとまっているのだが、このままankiに流し込むと見出しだけで覚えることになり、効率が悪い。

また、一つの見出しにつき例文が複数ある場合がある*1

さらに、一つの見出しに意味が複数ある場合もある。

  • 1列目:見出し
  • 2列目:見出し+意味1+例文1-①+例文1-①の訳+...+意味2+例文2-①+例文2-①の訳+...

複数の意味がある場合、それぞれに用意された例文の数も見出しによって異なるため、判別が難しい。そこで今回はスキップすることにした。

私の理想は次のような形だ。

  • 1列目:見出し+例文①
  • 2列目:意味+例文①の訳

つまり、表には見出し+例文を置き、裏に意味+例文の訳があるのが望ましい。

例文②以降を削ることになってしまうが、仕方ない。

「語義」から私の理想に近づけていくには、2つの手順を踏めばよい。

  • 2列目の見出しの削除
  • 2列目の例文①を1列目に移動する

手でやるのは地獄なので、テキストエディタpythonを使って編集していく。

2列目の見出しの削除

これはさほど難しくはない。csvファイルを適当なテキストエディタ(サクラエディタvscodeなど)で開き、正規表現を用いた置換で

  • 置換前:,".*?<br><br>
  • 置換後:,"

とした。csvファイルがカンマ区切りであること、意味の前にbrタグが現れていることを利用している。

2列目の例文①を1列目に移動する

これが厄介だった。テキストエディタの置換でできる範囲を超えている。

結論から書くと、上に書いた置換を施したcsvファイルに対して次のpythonスクリプトを実行した。

import csv
import re
import pprint
with open('idiom/idiom2.csv', encoding='utf-8') as f:
    reader = csv.reader(f)
    l = [row for row in reader]
idiom_regex = re.compile(r'¶.*?(')
Jap_regex = re.compile(r'[\.\"\!\?](.*?)')
Men_regex = re.compile(r'「.*?」.*?¶|[①②③④⑤⑥⑦⑧⑨⑩].*?¶')
Pl_regex = re.compile(r'[①②③④⑤⑥⑦⑧⑨⑩].*?¶')
num = 0
for row in range(len(l)):
    mo = idiom_regex.findall(l[row][1])
    mo_jap = Jap_regex.findall(l[row][1])
    mo_men = Men_regex.findall(l[row][1])
    mo2 = Pl_regex.search(l[row][1])

    if len(mo) > 0 and len(mo_jap) > 0 and len(mo_men) > 0 and mo2 is None:        
        l[row][0] = l[row][0] + '<br>' + mo[0].replace('¶', '').replace('(', '')
        l[row][1] = mo_men[0].replace('¶', '') + '<br>' + mo_jap[0].replace('.', '').replace('¶', '')
        
with open('idiom/idiom_modified.csv', 'w', encoding='utf-8') as f2:
    writer = csv.writer(f2)
    writer.writerows(l)

冗長だが最低限はできているかと思う。

4行目と21行目で入出力ファイル名を指定している。

7~10行目でそれぞれ例文、例文の訳、意味、意味が複数ある場合の判定を取得するための正規表現を指定している。

18・19行目で取得した内容をcsvファイルに配置している。

最後に

ざっと見た限りは思うようにできたと思う。python便利。

見出しは全部で17547個あるが、手で移動しなければならない項目(一つの見出しに意味が複数あるもの)は2376個まで減らすことができた。

残りの2376個も自動化したいところ。

E-DIC 英和|和英 (イーディック) 第2版 (<CDーROM>(Win版))

E-DIC 英和|和英 (イーディック) 第2版 ((Win版))

全ての元凶。

python全般、正規表現によるマッチングについて書かれた本。csvファイルの扱いにも触れている。

rs.luminousspice.com

編集後のインポートの方法はこちら。

*1:これが例文から見出しを出力するのが難しい原因