2017.11.14 開催 golang.tokyo #10にてLT発表 Golangを用いたテキスト処理を行う際に気をつける部分、ライブラリの選定方針、テキスト処理のための基礎的なfunctionの作成について紹介しました。
⾼精度名寄せシステムを⽀えるテキスト処理(の、ほんのさわり)⽥野⼝⼤樹(@dproject21)2017.11.14 golang.tokyo #10
View Slide
あんただれよ?• ⽥野⼝ ⼤樹 (たのっち @dproject21)• ミーカンパニー株式会社所属• Java + Agileな新宿⻄⼝のSIer → 某Webサービス企業 → 現職• ⽣息域• Akiba.go• アジャイル界隈 (Agile Japan 2015 公認レポーター)• ソフトウェアテスト界隈(WACATE、アジャイルテスト読書会)• 同⼈技術書界隈(DevLOVE Pub)• クリティカル・シンキング界隈(TOCfE Bootcamp)• Go⾔語歴 5ヶ⽉• .NET → Java → Go
お仕事の内容• ミーカンパニー株式会社 http://mecompany.me/• オープンデータの医療機関データを加⼯して作り上げた医療・薬局・介護マスタデータ「SCUEL」を販売しています。• 名寄せのためのデータクレンジングにGoを全⾯採⽤しています。• Goを採⽤したことで、⾼精度の名寄せシステムを、⾼速で動作させることができています。• 名寄せシステムで使っている「テキスト処理の考え⽅」の⼀部を LT という形で紹介します。
先ほどのセッションほとんど聞けてなかったけど…• reflectパッケージは遅いので、できる限り使わないのが吉• JSONもキャッシュ(redis / memcached)するためのシリアライズ/デシリアライズで使うには遅い。ProtocolBufferやMessagePackが早いので、こちらを使おう。• Goは正規表現が遅い。簡単な正規表現は等価になるfunctionを作ったほうがいい。
今⽇のまとめ• stringsパッケージでの⽇本語テキスト処理には罠が多い。仕様をきちんと確認しよう。• いくつかの機能はutf8パッケージで代⽤できる。• Githubからライブラリを拾ってくる場合、rune対応であるか確認しよう。• rune対応のfunctionが⾜りなければ作ろう• unicodeパッケージを活⽤しよう
rune⾮対応の標準ライブラリの罠• stringsパッケージの strings.Index
rune⾮対応の標準ライブラリの罠• stringsパッケージの strings.Index3⽂字⽬(2番⽬)じゃないの?
rune⾮対応の標準ライブラリの罠• stringsパッケージの strings.Index欲しいのはバイト数じゃない⽂字数なんだ
utf8パッケージで⼀部賄えるけど…• utf8パッケージを使うRuneCountInString、良く使います
utf8パッケージで⼀部賄えるけど…• utf8パッケージを使う
Githubでライブラリ拾う場合も注意• とある処理をするためにGithubからライブラリを取得• 実⾏してみたら想定していた結果と違う!• ソースコードを読んだらrune⾮対応• rune対応の別ライブラリに変えました。
無ければ作ろう• stringsパッケージでruneに対応していない• utf8パッケージに対応する機能がない• Githubで出回っているライブラリでも⾒つからない• stringsパッケージのいくつかのfunctionはrune対応版を内製しています。
より便利なfunctionを作ろう• Goの正規表現は遅い。正規表現をfunctionに置き換えたい。• unicodeパッケージが活躍する。• [0-9] これ、unicode.IsDigitで代⽤できる。
より便利なfunctionを作ろう• Unicode.IsDigit
台⾵の前に作っていたのはココマデ
Unicodeとの格闘• Unicode.IsDigitの仕様をもう⼀度確認
Unicodeとの格闘• Unicode.IsDigitisExcludingLatinって何だ?
Unicodeとの格闘• src/unicode/letter.goこれ、[0-9]と等値ではない?
Unicodeとの格闘• Playgroundで検証(LT開始の30分ほど前に検証しました)全⾓の 1 もIsDigitでtrue判定される
よし! function作ろう!
内製functionのテストはどうしてる?• testify / assert でテスト書いています。• 最初は愚直に testingパッケージの t.Error を使っていました。• エラー時のメッセージを⾃分でつくるのは⼤変• xUnitに慣れた⾝として、assertは欲しかった。• テストコードの構成は、永和システムマネジメントさんの「時を越えたプログラミングの道」を参考にしています。• https://twop.agile.esm.co.jp/learning-go-lang-by-tdd-8326723d9362
functionを作ろう• 半⾓英数字の仕様ってどうだっけ?https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
functionを作ろう• 半⾓の英数字だけtrueになるfunctionを作ろう
functionを作ろう• 実際は「前処理」で全⾓数字を変換しているから問題起きなかったんですけどね。
今⽇のまとめ• stringsパッケージでの⽇本語テキスト処理には罠が多い。仕様をきちんと確認しよう。• いくつかの機能はutf8パッケージで代⽤できる。• Githubからライブラリを拾ってくる場合、rune対応であるか確認しよう。• rune対応のfunctionが⾜りなければ作ろう• unicodeパッケージを活⽤しようにも罠がある!仕様をきちんと確認しよう! ←NEW!!!