はじめに
Node.js + Express + PostgreSQLで英単語検索APIを開発しています。
この記事では「01. データ用意編」と称して、API開発に必要なデータ(英和辞書)の用意の仕方について記載しています。
パブリックドメインの英和辞書に対して、TreeTaggerのPython wrapperを使用して品詞のタグ付けを行いました。
やったこと
必要なデータ(英和辞書)とは?
最低でも下記の3つは必要であろうと考えました。
- 英単語
- 日本語訳
- 品詞情報
データの取得
英単語と日本語訳については、下記のパブリックドメインの英和辞書を使用させて頂きました。
https://kujirahand.com/web-tools/EJDictFreeDL.php
品詞情報の付与
今回使用させて頂いた上記パブリックドメインの英和辞書データ (ejdic-hand)には品詞情報がありませんでした。
英単語APIの作成にあたり、やはり品詞情報は必要でしょう。
そこで、英語(+様々な言語)に対して品詞タグ付けをすることができるTreeTaggerを使用し、品詞のタグ付けを行いました。
TreeTaggerとは?
TreeTaggerは品詞タグ付け器です。英語をはじめ、多くの自然言語に対応しています。
Python、Ruby、Javaなどの、様々なの言語に対してwrapperが提供されています。
今回はPythonのwrapperを使用してタグ付けを行いました。
TreeTagger公式ドキュメント
TreeTaggerのインストール
開発環境はUbuntu16.04です。
公式ドキュメント通りに進めて、問題なくインストールすることができました。
品詞タグ付けのソースコード
#!/usr/bin/env python
#! -*- coding:utf-8 -*-
""" 英単語の品詞情報を取得する。
"""
import re
import treetaggerwrapper as ttw
def main():
# TAGDIRを指定する必要がある。
tagger = ttw.TreeTagger(TAGLANG='en',TAGDIR='/usr/local/src/treetagger')
lines = read_file()
result = []
dict_def = load_def()
for line in lines:
try:
english, japanese = line.split('\t')
japanese = japanese.rstrip('\n')
# 複数語は取り込み対象外とする。
if re.match('.+[\s ].+', english):
continue
tags = tagger.TagText(english)
tags2 = ttw.make_tags(tags)
word_type = tags2[0][1]
result.append(english + '\t' + japanese + '\t' + dict_def[word_type])
except:
continue
write_file(result)
def read_file():
"""
パブリックドメインの英語辞書データ
https://kujirahand.com/web-tools/EJDictFreeDL.php
"""
with open('./ejdic-hand-utf8.tsv') as f:
return f.readlines()
def write_file(ary):
with open('./ejdic-hand-utf8-with-word-type.tsv', 'w') as f:
return f.write('\n'.join(ary))
def load_def():
"""
TreeTaggerの付与する品詞タグを、実際の品詞表記に変換するための定義ファイル
http://computer-technology.hateblo.jp/entry/20150824/p1
"""
result = {}
with open('./def_word_type.tsv') as f:
for line in f.readlines():
list_line = line.split('\t')
result[list_line[0]] = list_line[3].rstrip('\n')
return result
if __name__ == '__main__':
main()
結果
下記の通り、各英単語について品詞を割り当てることができました。
ejdic-hand-utf8-with-word-type.tsv より一部抜粋
afflict (肉体的に,精神的に)(…で)…'を'『苦しめる』,悩ます(distress)《+『名』+『with』+『名』 (a person's do『ing』)》 動詞
affliction (心身の)苦悩,難儀 / 苦悩(悩み)を引き起こすもの 名詞
affluence (物質的な)裕福 / (思考・言葉などの)豊かさ 名詞
affluent (物質的に)裕福な / (思考・言葉などが)豊富な,たくさんの;(…が)豊富な《+『in』+『名』》 / (川の)支流 形容詞
次回以降、こちらのデータを使用して英単語検索APIを開発していきます。