Upgrade to Pro — share decks privately, control downloads, hide ads and more …

高精度名寄せシステムを支える テキスト処理 (の、ほんのさわり)

dproject21
November 14, 2017

高精度名寄せシステムを支える テキスト処理 (の、ほんのさわり)

2017.11.14 開催 golang.tokyo #10にてLT発表
Golangを用いたテキスト処理を行う際に気をつける部分、ライブラリの選定方針、テキスト処理のための基礎的なfunctionの作成について紹介しました。

dproject21

November 14, 2017
Tweet

More Decks by dproject21

Other Decks in Programming

Transcript

  1. ⾼精度名寄せシステムを⽀える
    テキスト処理
    (の、ほんのさわり)
    ⽥野⼝⼤樹(@dproject21)
    2017.11.14 golang.tokyo #10

    View Slide

  2. あんただれよ?
    • ⽥野⼝ ⼤樹 (たのっち @dproject21)
    • ミーカンパニー株式会社所属
    • Java + Agileな新宿⻄⼝のSIer → 某Webサービス企業 → 現職
    • ⽣息域
    • Akiba.go
    • アジャイル界隈 (Agile Japan 2015 公認レポーター)
    • ソフトウェアテスト界隈(WACATE、アジャイルテスト読書会)
    • 同⼈技術書界隈(DevLOVE Pub)
    • クリティカル・シンキング界隈(TOCfE Bootcamp)
    • Go⾔語歴 5ヶ⽉
    • .NET → Java → Go

    View Slide

  3. お仕事の内容
    • ミーカンパニー株式会社 http://mecompany.me/
    • オープンデータの医療機関データを加⼯して作り上げた医療・
    薬局・介護マスタデータ「SCUEL」を販売しています。
    • 名寄せのためのデータクレンジングにGoを全⾯採⽤しています。
    • Goを採⽤したことで、⾼精度の名寄せシステムを、⾼速で動作
    させることができています。
    • 名寄せシステムで使っている「テキスト処理の考え⽅」の⼀部
    を LT という形で紹介します。

    View Slide

  4. 先ほどのセッションほとんど聞けてな
    かったけど…
    • reflectパッケージは遅いので、できる限り使わないのが吉
    • JSONもキャッシュ(redis / memcached)するための
    シリアライズ/デシリアライズで使うには遅い。
    ProtocolBufferやMessagePackが早いので、こちらを使おう。
    • Goは正規表現が遅い。
    簡単な正規表現は等価になるfunctionを作ったほうがいい。

    View Slide

  5. 今⽇のまとめ
    • stringsパッケージでの⽇本語テキスト処理には罠が多い。仕様
    をきちんと確認しよう。
    • いくつかの機能はutf8パッケージで代⽤できる。
    • Githubからライブラリを拾ってくる場合、rune対応であるか確
    認しよう。
    • rune対応のfunctionが⾜りなければ作ろう
    • unicodeパッケージを活⽤しよう

    View Slide

  6. rune⾮対応の標準ライブラリの罠
    • stringsパッケージの strings.Index

    View Slide

  7. rune⾮対応の標準ライブラリの罠
    • stringsパッケージの strings.Index

    View Slide

  8. rune⾮対応の標準ライブラリの罠
    • stringsパッケージの strings.Index
    3⽂字⽬(2番⽬)じゃないの?

    View Slide

  9. rune⾮対応の標準ライブラリの罠
    • stringsパッケージの strings.Index

    View Slide

  10. rune⾮対応の標準ライブラリの罠
    • stringsパッケージの strings.Index
    欲しいのは
    バイト数じゃない
    ⽂字数なんだ

    View Slide

  11. utf8パッケージで⼀部賄えるけど…
    • utf8パッケージを使う
    RuneCountInString、良く使います

    View Slide

  12. utf8パッケージで⼀部賄えるけど…
    • utf8パッケージを使う

    View Slide

  13. Githubでライブラリ拾う場合も注意
    • とある処理をするためにGithubからライブラリを取得
    • 実⾏してみたら想定していた結果と違う!
    • ソースコードを読んだらrune⾮対応
    • rune対応の別ライブラリに変えました。

    View Slide

  14. 無ければ作ろう
    • stringsパッケージでruneに対応していない
    • utf8パッケージに対応する機能がない
    • Githubで出回っているライブラリでも⾒つからない
    • stringsパッケージのいくつかのfunctionは
    rune対応版を内製しています。

    View Slide

  15. より便利なfunctionを作ろう
    • Goの正規表現は遅い。正規表現をfunctionに置き換えたい。
    • unicodeパッケージが活躍する。
    • [0-9] これ、unicode.IsDigitで代⽤できる。

    View Slide

  16. より便利なfunctionを作ろう
    • Unicode.IsDigit

    View Slide

  17. 台⾵の前に作っていたのはココマデ

    View Slide

  18. Unicodeとの格闘
    • Unicode.IsDigitの仕様をもう⼀度確認

    View Slide

  19. Unicodeとの格闘
    • Unicode.IsDigit
    isExcludingLatinって何だ?

    View Slide

  20. Unicodeとの格闘
    • src/unicode/letter.go
    これ、[0-9]と等値ではない?

    View Slide

  21. Unicodeとの格闘
    • Playgroundで検証(LT開始の30分ほど前に検証しました)
    全⾓の 1 もIsDigitでtrue判定される

    View Slide

  22. よし! function作ろう!

    View Slide

  23. 内製functionのテストはどうしてる?
    • testify / assert でテスト書いています。
    • 最初は愚直に testingパッケージの t.Error を使っていました。
    • エラー時のメッセージを⾃分でつくるのは⼤変
    • xUnitに慣れた⾝として、assertは欲しかった。
    • テストコードの構成は、永和システムマネジメントさんの「時
    を越えたプログラミングの道」を参考にしています。
    • https://twop.agile.esm.co.jp/learning-go-lang-by-tdd-
    8326723d9362

    View Slide

  24. functionを作ろう
    • 半⾓英数字の仕様ってどうだっけ?
    https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)

    View Slide

  25. functionを作ろう
    • 半⾓の英数字だけtrueになるfunctionを作ろう

    View Slide

  26. functionを作ろう
    • 半⾓の英数字だけtrueになるfunctionを作ろう

    View Slide

  27. functionを作ろう
    • 実際は「前処理」で全⾓数字を変換しているから問題起きな
    かったんですけどね。

    View Slide

  28. 今⽇のまとめ
    • stringsパッケージでの⽇本語テキスト処理には
    罠が多い。仕様をきちんと確認しよう。
    • いくつかの機能はutf8パッケージで代⽤できる。
    • Githubからライブラリを拾ってくる場合、
    rune対応であるか確認しよう。
    • rune対応のfunctionが⾜りなければ作ろう
    • unicodeパッケージを活⽤しようにも罠がある!
    仕様をきちんと確認しよう! ←NEW!!!

    View Slide