SlideShare a Scribd company logo
1 of 37
Download to read offline
 mecabはいいぞ
@Web技術勉強会#01
 (10分LT)
アシアル株式会社江口悠• 2019 年 04 月 06 日(土)
自己紹介
WEB Java / Androidを一番長くやって
ました。
エンタープライズ系の大規模システム
・アプリが多かったのですが、 Asialに
入ってからは小中規模な PJをPHPや
Cordova/Vueで作る機会が増えまし
た。
趣味: 死にゲー。3Dモデリング
自然言語処理・形態素解析( = 単語を最小限の意味の塊に分解する )エンジン。
※自然言語処理・形態素解析について詳細は語りません
mecabとは??
$mecab
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
mecabを使ってどんなアプリが作れるか??
人工知能
AI
Python / R ??
ちがう
俺は
PHPでやりたい
んだ
概要
人工無脳なChatBotをLaravelと
DynamoDB、AWS SQSで作った話
更新クエリは処理時間かかるので、
Command系操作は、Laravelの
Event/ListenerとAWS SQSを組み合わ
せて非同期更新で一工夫してみた話
いい天気だね!
だね〜
デモ
▼Github
- https://github.com/yueguchi/munoh-api-pack
- PHP7.3 / Laravel5.7 / SQS / DynamoDB / Docker(-compose)
- https://github.com/yueguchi/munoh-front
- Vue2.6 / TypeScript 3.3
local画面
▼API
$docker-compose up -d --build
▼フロント
$npm run serve
全体構成
Archtecture
主なAPI
分かち書きAPI
$ curl 'http://localhost:18080/api/v1/separate?word=今日はWEB技術勉強会の第一回で
す!' | jq .
{
"words": [
"今日",
"は",
"WEB",
"技術",
"勉強",
"会",
"の",
"第",
"一",
"回",
"です",
"!"
]
}
未登録の分かち書き単語の登録API
$ curl -X PUT 'http://localhost:18080/api/v1/regist/words?word=私は今年で結
婚4年目に突入です!'
{"message":"Created"}
REPL(会話) API
$ curl 'http://localhost:18080/api/v1/repl?word=Hello' | jq .
{
"message": "World!!"
}
$ curl 'http://localhost:18080/api/v1/repl?word=結婚しよう' | jq .
{
"message": "ちょっと何言っているのかわからなかったです ..."
}
会話の仕組み
人工無脳(1)
分かち書き
● 「今日」「は」「いい」「天気」「だ
ね」「!」
● 「今日」「は」「いい」
● 「は」「いい」「天気」
● 「いい」「天気」「だね」
● 「天気」「だね」「!」
● 「だね」「!」EOS
mecab
● 形態素解析
○ 品詞分解
$ echo '今日はいい天気!' | mecab
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
いい 形容詞,自立,*,*,形容詞・イイ,基本形
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
! 記号,一般,*,*,*,*,!,!,!
EOS
人工無脳(2)
マルコフ連鎖
分かち書きした単語を3つのグループに分けて、dynamoに登録すること
で単語の連続性を導き出せる。
ロジック・フロー
REPL(リプライ)ロジック
1. request: ?word=「今日は良い天気だね」
2. 形態素解析して、ランダムに wordを1つ選定。 例:「天気」
3. word1が「天気」であるword2を全て抽出
4. 3からランダムで1つ選定
5. word2が4の単語であるword3を全て抽出
6. 5からランダムで1つ選定
7. word3が6の単語であるword3を全て抽出
8. 6からランダムで1つ選定
9. 3 + 5+7で返答の完成
10. DBに存在しない文章は Eventに登録
word1 word2 word3
天気 だね !
だね ! EOS
気分 は 最高
は 最高 だね
最高 だね 〜
だね 〜 EOS
「天気だね!」と「気分は最高だね〜」が DynamoDBに登録されているとする
「だね」の次の候補は「!」 or 「〜」 => ランダムに選定
よって、「だね〜」 or 「だね!」でREPLすることになる。
フロー(Draw.IO)
SQS
得た知識
開発から学んだこと
● [セキュリティ]コマンドインジェクション
○ "echo ${word} | mecab -E '' -F '%mn'";
■ escapeshellarg($word)だけではMBが空文字になる問題
● https://cloud.docker.com/u/nanayu/repository/docker/nanayu/munoh-api
● [AWS]DynamoDBのテーブル設計をノリと雰囲気でやりながら学んだ
○ パーティションをuuidで作ってしまった。。
○ baopham/laravel-dynamodbを使った。Scan(全項目走査)になってしまっているので、GSIをword1パーティションで
作成して、Queryするようにするも、POSTで400エラー!!IAMロールにindexも追記して解決
○ ISO8601日付文字でorderByやbetweenできない。
■ Numberで比較しないとダメ...
● 2019-02-10T07:05:47+00:00 -> 1549749947 or 201904041324とかとか
"Resource": [
"arn:aws:dynamodb:ap-northeast-1:リソース番号:table/words",
"arn:aws:dynamodb:ap-northeast-1:リソース番号:table/words/index/word1-index"
]
● 雰囲気でDynamo(及びLibrary)使ってるとScanに気づかず本番で死ぬ??
○ RCUコストもかかるしね
■ 雰囲気で使って死ぬのはこれに限った話じゃないけど w
● 検索はDynamoDB直接つかうもんじゃない。
○ ElasticSearch連携
開発から学んだこと
工夫したこと
● [Docker] CMD
○ 1命令のみ可なので、bash &&にまとめた
■ フォアグラウンド指定は最後のみ
● [Docker]ベースイメージ
○ phpやapache、セキュリティ設定etc...などの基本構成と設定をした上で、osと
middleware専用のイメージを作成
■ Dockerfileでバカバカ作業したくなかったのと、apt系の作業時間短縮
● [Laravel]更新作業(Command)と取得作業(Query)の分断
○ 今回は更新をSQSとLaravel Eventに一任した
今後の発展
● [AWS] ElasticSearchで詳細な絞り込みを実現
○ DynamoDBから直接データ取得しているため、絞り込みに弱い。
■ ElasticSearchからデータを取得する方式に転換したい
● Dynamodbへのupdate(Stream)をトリガーにLambdaでElasticSearchへ
Docker
まとめ 反省
mecabはいいぞ
ランダムではなく
出現頻度で選定
したい
(HITレコードの数)
最後に
俺はただmecabを使い
たかっただけなんです。

More Related Content

Similar to Eguchi web techstudy_01

1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)Masataka Sato
 
mixiアプリxZendFramework
mixiアプリxZendFrameworkmixiアプリxZendFramework
mixiアプリxZendFramework清水樹
 
Interop2017
Interop2017Interop2017
Interop2017tak9029
 
Spath for enterprise
Spath for enterpriseSpath for enterprise
Spath for enterpriseKoichiro Sumi
 
組込み技術とモバイル技術
組込み技術とモバイル技術組込み技術とモバイル技術
組込み技術とモバイル技術Tomo Watanabe
 
Javaユーザに知ってほしい Processing入門
Javaユーザに知ってほしいProcessing入門Javaユーザに知ってほしいProcessing入門
Javaユーザに知ってほしい Processing入門chickenJr
 
着任したエンジニアをスムーズにテイクオフさせる道具だて
着任したエンジニアをスムーズにテイクオフさせる道具だて着任したエンジニアをスムーズにテイクオフさせる道具だて
着任したエンジニアをスムーズにテイクオフさせる道具だてKiyotaka Kunihira
 
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論賢次 海老原
 
20141220_iOS8マルチデバイス対応(Size Classes編)
20141220_iOS8マルチデバイス対応(Size Classes編)20141220_iOS8マルチデバイス対応(Size Classes編)
20141220_iOS8マルチデバイス対応(Size Classes編)Kanako Kobayashi
 
Teachme for business
Teachme for businessTeachme for business
Teachme for businessKeitaro Shoji
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」
20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」
20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」Takashi Uemura
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向Tsutomu Ogasawara
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -Tomoya Kabe
 
通常の3倍の速度で プログラミング!? 「 Emacsキーバインドのすすめ」
通常の3倍の速度でプログラミング!?「 Emacsキーバインドのすすめ」通常の3倍の速度でプログラミング!?「 Emacsキーバインドのすすめ」
通常の3倍の速度で プログラミング!? 「 Emacsキーバインドのすすめ」KinkumaDesign
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編Asami Abe
 
【DL輪読会】マルチモーダル LLM
【DL輪読会】マルチモーダル LLM【DL輪読会】マルチモーダル LLM
【DL輪読会】マルチモーダル LLMDeep Learning JP
 

Similar to Eguchi web techstudy_01 (20)

1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
 
エンジニア勉強会_DECIDE
エンジニア勉強会_DECIDEエンジニア勉強会_DECIDE
エンジニア勉強会_DECIDE
 
mixiアプリxZendFramework
mixiアプリxZendFrameworkmixiアプリxZendFramework
mixiアプリxZendFramework
 
Interop2017
Interop2017Interop2017
Interop2017
 
Spath for enterprise
Spath for enterpriseSpath for enterprise
Spath for enterprise
 
組込み技術とモバイル技術
組込み技術とモバイル技術組込み技術とモバイル技術
組込み技術とモバイル技術
 
Javaユーザに知ってほしい Processing入門
Javaユーザに知ってほしいProcessing入門Javaユーザに知ってほしいProcessing入門
Javaユーザに知ってほしい Processing入門
 
着任したエンジニアをスムーズにテイクオフさせる道具だて
着任したエンジニアをスムーズにテイクオフさせる道具だて着任したエンジニアをスムーズにテイクオフさせる道具だて
着任したエンジニアをスムーズにテイクオフさせる道具だて
 
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
 
20141220_iOS8マルチデバイス対応(Size Classes編)
20141220_iOS8マルチデバイス対応(Size Classes編)20141220_iOS8マルチデバイス対応(Size Classes編)
20141220_iOS8マルチデバイス対応(Size Classes編)
 
Teachme for business
Teachme for businessTeachme for business
Teachme for business
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」
20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」
20121124 学生セミナー「基礎からわかる! IT業界とプログラミング」
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向
 
デ部プレゼン資料20100306
デ部プレゼン資料20100306デ部プレゼン資料20100306
デ部プレゼン資料20100306
 
Teachme
TeachmeTeachme
Teachme
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
 
通常の3倍の速度で プログラミング!? 「 Emacsキーバインドのすすめ」
通常の3倍の速度でプログラミング!?「 Emacsキーバインドのすすめ」通常の3倍の速度でプログラミング!?「 Emacsキーバインドのすすめ」
通常の3倍の速度で プログラミング!? 「 Emacsキーバインドのすすめ」
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編
 
【DL輪読会】マルチモーダル LLM
【DL輪読会】マルチモーダル LLM【DL輪読会】マルチモーダル LLM
【DL輪読会】マルチモーダル LLM
 

Eguchi web techstudy_01