Slide 1

Slide 1 text

英和辞書付きGo言語仕様書 Word Wise Go Spec @DQNEO mercari.go 2021-07-19

Slide 2

Slide 2 text

自己紹介 ● DQNEO (ドキュネオ) ● アメリカ版メルカリのバックエンドを開発 ● Goコンパイラを2つ自作 ○ minigo, babygo ○ アメリカGopherConで発表 ● 最近の趣味は英語学習

Slide 3

Slide 3 text

こんな悩みありませんか? ● Go言語もっと上達したい。英語も勉強したい。 ● 時間がない ○ そうだ、両方同時にやろう! ● 言語仕様書を原文で読んでみる → 挫折

Slide 4

Slide 4 text

英和辞書付きGo言語仕様書 https://dqneo.github.io/gospec/spec.html

Slide 5

Slide 5 text

デモ

Slide 6

Slide 6 text

「辞書引けるツール既にあるじゃん」 「MacOSに辞書ついてるし」

Slide 7

Slide 7 text

特徴 ● インストール不要 ○ 単なるWebページ ● 専用辞書が組み込まれている ○ 専門用語に強い (例: operator, expression) ○ 余分な情報がゼロ (例: room) ○ Go言語に詳しい人間が作った ■ Goコンパイラ2回作った経験 ■ Go言語仕様輪読会での利用実績 /メンバーからのコントリビュート ● masterの最新版仕様(v1.17)に対応済み ○ https://tip.golang.org/ref/spec へのパッチとして実装されている

Slide 8

Slide 8 text

なぜ翻訳ではなく 辞書なのか?

Slide 9

Slide 9 text

翻訳を作るのは大変 ● 作業量が膨大 ○ 文書が2万語あったら、2万語全部翻訳する必要 ● 複数人で分業しづらい (品質のバラツキ、用語や文体のバラツキ) ● オリジナルに追従しつづけるのが大変 ● モチベーションが続かない ○ 少なくとも、自分が欲していない ※翻訳にも価値はあると思うし、 翻訳にたずさわっている方には敬意を表します

Slide 10

Slide 10 text

辞書付き仕様書の利点 (作り手視点) ● てこの原理が効く ○ 20,000語の文書でも、単語をユニークカウントすると 1400語ほど ○ 多くの単語は和訳不要 ■ a, the, of, because などの基本語 ■ package, pointer などカタカナ語として定着してる単語 ○ 500語分の辞書を作れば、大半の文章はカバーできる ● 複数人分担しやすい ○ 単語単位の翻訳なので、品質のバラツキは生じにくい ● オリジナルの変更に追従するのが簡単 ○ 仕様変更で文章が変わっても、辞書はそのまま適用できる ○ 陳腐化しにくい ● 作ってる本人にも恩恵がある ○ 自分が欲しかったやつや〜

Slide 11

Slide 11 text

辞書付き仕様書の利点 (ユーザ視点) ● 英文を読む際に、文法にだけ集中すればよくなる ● 仕様書を英語で読んでおくと、標準ライブラリのコード読解に役立つ ○ 変数名、関数名、型名は英語 ○ コメントもドキュメントも英語

Slide 12

Slide 12 text

開発の裏側

Slide 13

Slide 13 text

きっかけ ● 「言語仕様書を自然言語解析したら、何か面白いことができないか?」 ○ 単語の頻度分析とか ○ 仕様書の不備や矛盾を検知するとか

Slide 14

Slide 14 text

単語の頻度分析をやってみた 特に「頻度」の利用方法は思いつかず... → 辞書を作ったら面白いかも?

Slide 15

Slide 15 text

Kindleで洋書を読むときのアレ

Slide 16

Slide 16 text

問題点 ● 辞書の英単語リストをどうやって作るか ○ 文書全体は2万語もあるので、人力では無理 ● 単語の語形変化の扱い ○ 名詞: variables, variable ○ 動詞: specify, specifies, specifying, specified → Go言語による自然言語処理で解決

Slide 17

Slide 17 text

開発の流れ ● 原文(HTML)からテキストのみを抽出 ● トークン分割・品詞分類 ● 単語の正規化 ● 各単語の和訳を作成 (人力) ● UI実装 (ツールチップ) ● ビルド

Slide 18

Slide 18 text

仕様書原文(HTML)からテキストのみを抽出 html txt github.com/PuerkitoBio/goquery を利用

Slide 19

Slide 19 text

文章をトークン分割&品詞分類 txt github.com/jdkato/prose/v2 を利用

Slide 20

Slide 20 text

生トークンの問題 ● 重複しまくり ○ “the” が 1283回登場 ● 句読点がトークン扱い ○ , : . “ ● 単語の変異が、全て別トークン扱い ○ variables, variable ○ specify, specifies, specifying, specified

Slide 21

Slide 21 text

生トークンに対する前処理 ● 句読点を除去 ● 小文字化 ● 機能語を除去 ○ the, a, of, because, ... → Go言語で自作のフィルタを書いた

Slide 22

Slide 22 text

名詞の正規化 (複数形を単数形に) ● variables -> variable ● properties -> property github.com/jinzhu/inflection を利用

Slide 23

Slide 23 text

動詞の正規化 ● Porter2 アルゴリズムというのがあるらしい ○ Stem(語幹)を抽出してくれる ● [compare, compared, comparing, compares] -> compar github.com/surgebase/porter2 を利用

Slide 24

Slide 24 text

訳語制作 ● ここは人力 ● GoogleSpreadSheetで管理 ● Stem(語幹)に対する訳語を登録 ● @syumai さん、@nobishiii さんが協 力

Slide 25

Slide 25 text

辞書引きは2ステップ ● comparing -> compar -> “比較する”

Slide 26

Slide 26 text

UI実装 ● @syumai さんが開発 ● OSSバンザイ

Slide 27

Slide 27 text

ビルド (Makefile) https://github.com/DQNEO/gospec-analyzer/blob/main/Makefile 辞書ファイルをダウンロード 仕様書原文をダウンロード html を txt に変換 トークン分割

Slide 28

Slide 28 text

ビルドのデモ

Slide 29

Slide 29 text

レポジトリ ● https://github.com/DQNEO/gospec-analyzer ○ 自然言語処理 ● https://github.com/DQNEO/gospec ○ 生成物を GitHub Web Pages で配信

Slide 30

Slide 30 text

発展課題 ● 多言語対応 ○ 中国語、韓国語、スペイン語 etc ○ 辞書さえ用意すれば実装は簡単 ● 英文を構文解析して視覚化 ○ どれが主語でどれが述語か ○ どの形容詞/副詞がどの名詞/動詞を修飾してるか

Slide 31

Slide 31 text

おまけ お気に入り単語の紹介

Slide 32

Slide 32 text

ご清聴ありがとう ございました Q&A タイム