英和辞書付きGo言語仕様書(Word Wise Go Spec)というのを作りました。 https://dqneo.github.io/gospec/spec.html
開発した動機や仕組みについての解説です。
英和辞書付きGo言語仕様書Word Wise Go Spec@DQNEOmercari.go 2021-07-19
View Slide
自己紹介● DQNEO (ドキュネオ)● アメリカ版メルカリのバックエンドを開発● Goコンパイラを2つ自作○ minigo, babygo○ アメリカGopherConで発表● 最近の趣味は英語学習
こんな悩みありませんか?● Go言語もっと上達したい。英語も勉強したい。● 時間がない○ そうだ、両方同時にやろう!● 言語仕様書を原文で読んでみる → 挫折
英和辞書付きGo言語仕様書https://dqneo.github.io/gospec/spec.html
デモ
「辞書引けるツール既にあるじゃん」「MacOSに辞書ついてるし」
特徴● インストール不要○ 単なるWebページ● 専用辞書が組み込まれている○ 専門用語に強い (例: operator, expression)○ 余分な情報がゼロ (例: room)○ Go言語に詳しい人間が作った■ Goコンパイラ2回作った経験■ Go言語仕様輪読会での利用実績 /メンバーからのコントリビュート● masterの最新版仕様(v1.17)に対応済み○ https://tip.golang.org/ref/spec へのパッチとして実装されている
なぜ翻訳ではなく辞書なのか?
翻訳を作るのは大変● 作業量が膨大○ 文書が2万語あったら、2万語全部翻訳する必要● 複数人で分業しづらい (品質のバラツキ、用語や文体のバラツキ)● オリジナルに追従しつづけるのが大変● モチベーションが続かない○ 少なくとも、自分が欲していない※翻訳にも価値はあると思うし、翻訳にたずさわっている方には敬意を表します
辞書付き仕様書の利点 (作り手視点)● てこの原理が効く○ 20,000語の文書でも、単語をユニークカウントすると 1400語ほど○ 多くの単語は和訳不要■ a, the, of, because などの基本語■ package, pointer などカタカナ語として定着してる単語○ 500語分の辞書を作れば、大半の文章はカバーできる● 複数人分担しやすい○ 単語単位の翻訳なので、品質のバラツキは生じにくい● オリジナルの変更に追従するのが簡単○ 仕様変更で文章が変わっても、辞書はそのまま適用できる○ 陳腐化しにくい● 作ってる本人にも恩恵がある○ 自分が欲しかったやつや〜
辞書付き仕様書の利点 (ユーザ視点)● 英文を読む際に、文法にだけ集中すればよくなる● 仕様書を英語で読んでおくと、標準ライブラリのコード読解に役立つ○ 変数名、関数名、型名は英語○ コメントもドキュメントも英語
開発の裏側
きっかけ● 「言語仕様書を自然言語解析したら、何か面白いことができないか?」○ 単語の頻度分析とか○ 仕様書の不備や矛盾を検知するとか
単語の頻度分析をやってみた特に「頻度」の利用方法は思いつかず...→ 辞書を作ったら面白いかも?
Kindleで洋書を読むときのアレ
問題点● 辞書の英単語リストをどうやって作るか○ 文書全体は2万語もあるので、人力では無理● 単語の語形変化の扱い○ 名詞: variables, variable○ 動詞: specify, specifies, specifying, specified→ Go言語による自然言語処理で解決
開発の流れ● 原文(HTML)からテキストのみを抽出● トークン分割・品詞分類● 単語の正規化● 各単語の和訳を作成 (人力)● UI実装 (ツールチップ)● ビルド
仕様書原文(HTML)からテキストのみを抽出html txtgithub.com/PuerkitoBio/goquery を利用
文章をトークン分割&品詞分類txtgithub.com/jdkato/prose/v2 を利用
生トークンの問題● 重複しまくり○ “the” が 1283回登場● 句読点がトークン扱い○ , : . “● 単語の変異が、全て別トークン扱い○ variables, variable○ specify, specifies, specifying, specified
生トークンに対する前処理● 句読点を除去● 小文字化● 機能語を除去○ the, a, of, because, ...→ Go言語で自作のフィルタを書いた
名詞の正規化 (複数形を単数形に)● variables -> variable● properties -> propertygithub.com/jinzhu/inflection を利用
動詞の正規化● Porter2 アルゴリズムというのがあるらしい○ Stem(語幹)を抽出してくれる● [compare, compared, comparing, compares] -> compargithub.com/surgebase/porter2 を利用
訳語制作● ここは人力● GoogleSpreadSheetで管理● Stem(語幹)に対する訳語を登録● @syumai さん、@nobishiii さんが協力
辞書引きは2ステップ● comparing -> compar -> “比較する”
UI実装● @syumai さんが開発● OSSバンザイ
ビルド (Makefile)https://github.com/DQNEO/gospec-analyzer/blob/main/Makefile辞書ファイルをダウンロード仕様書原文をダウンロードhtml を txt に変換トークン分割
ビルドのデモ
レポジトリ● https://github.com/DQNEO/gospec-analyzer○ 自然言語処理● https://github.com/DQNEO/gospec○ 生成物を GitHub Web Pages で配信
発展課題● 多言語対応○ 中国語、韓国語、スペイン語 etc○ 辞書さえ用意すれば実装は簡単● 英文を構文解析して視覚化○ どれが主語でどれが述語か○ どの形容詞/副詞がどの名詞/動詞を修飾してるか
おまけお気に入り単語の紹介
ご清聴ありがとうございましたQ&A タイム