# 今週何知った? week:36 ## 各自発表 > [name=ken3ypa] ### Amazon SQSの概要ついて #### きっかけ - 仕事で触ることになったのでその素振り - あるマイクロサービスをサーバーレスで動かしており、今回それを利用する際に、従来の同期処理から非同期処理にも対応できるように書き換えることになった - もし処理が失敗した場合のエラーのハンドリングとしてSQSを利用することになった ### SQSとは - [Amazon SQS(サーバーレスアプリのためのメッセージキューサービス)| AWS](https://aws.amazon.com/jp/sqs/) ### 主な用語 | 用語 | 説明 | |---------------|--------------------------------------------------------------------------------------------| | Queue | メッセージを格納・管理するためのデータ構造。SQSでは、Standard QueueとFIFO Queueが提供されている | | Standard Queue | SQSで提供されるデフォルトのキュータイプ。順序付けは保証されない | | FIFO Queue | 順序付けが保証されたSQSキュータイプ。メッセージは送信された順序で処理される | | Producer | メッセージを生成し、キューに送信するコンポーネント | | Consumer | キューからメッセージを取り出し、処理を行うコンポーネント | | Message | キューに送信されるデータの単位。プロデューサーが生成し、コンシューマーが処理する対象 | | Visibility Timeout | メッセージがコンシューマーによって受信された後、そのメッセージが他のコンシューマーに表示されない期間 | | Dead Letter Queue | 処理に失敗したメッセージを格納するためのキュー。これにより、障害の分析や再処理を容易に行える | | Long Polling | キューからメッセージが利用可能になるまで待機するポーリング方式。リソース使用量やレイテンシが低減される | | Short Polling | キューを定期的に短い間隔でポーリングする方式。リアルタイム性は高いものの、リソース使用量が増える | | Message Retention Period | キューに格納されたメッセージが削除されるまでの期間。デフォルトは4日で、最大14日まで設定可能 | ## SNSとの違い | 項目 | SQS | SNS | |----------------|----------------------------------------------------------|----------------------------------------------------------| | タイプ | メッセージキューサービス | パブリッシュ/サブスクライブ型メッセージングサービス | | メッセージング | ポーリングによるメッセージ受信 | プッシュ型 | ## 実際に画面で見てみる --- > [name=makicamel] # 全文検索 ## テキスト解析 - テキスト解析の大まかな流れ - 文字の正規化 - トークン化 - トークン列に対する各種処理 - タームとトークンの違い - ターム - 検索対象となる単語 - 転置インデックスに登録されている単語 - トークン - ドキュメントや検索クエリに現れる単語 - テキスト解析の対象となる ## 3.2 英語のテキスト解析 - 英語のテキスト解析時の課題 - 大文字小文字の違い - 解決策:すべてのトークンを小文字に統一して出力する - 複数形・三人称単数・現在進行形などによる語尾の違い - 解決策:入力された単語を語幹(stem)と呼ばれる共通の文字列に置き換える - これを「ステミング」と呼ぶ - e.g. 「connects」「connection」→「connect」 - ref. Porter Stemmer - 記号の扱い - e.g. 「use-case」「I'll」「C#」 - 解決策:実現したい検索にあわせ無視・除去・残す記号を決める - e.g. ハイフンで接続された単語はハイフンを除去する - 「use-case」→「usecase」 ## 3.3 日本語のテキスト解析 日本語の主なテキスト解析手法 1. 形態素解析 2. N-Gram ### 3.3.1 形態素解析器を用いたテキスト解析 - 役割 - 単語への分割 - 品詞の同定 - 語形変化の解析 - 有名な実装 - MeCab - Kuromoji - Sudachi - 動作 - 内包する辞書を用いて「入力された文章を区切ることができる可能性」のパターンを洗い出す - 洗い出したパターンのうち「最もそれらしい単語列」を結果として出力する 「最もそれらしい単語列」は各辞書に付随するコストを利用して計算する - 正規化 - 形態素解析器が持つ形態素情報を活用して正規化する - 品詞 - 活用形(基本形) - よみ - e.g. - 助詞(てにをは)をフィルタリングしタームに採用しない - オートコンプリート - 課題 - 辞書に登録されている単語の種類や総数に形態素解析が依存する - 長いトークンの一部の文字列で検索する用途に不向き ### 3.3.2 文字 N-Gram を用いたテキスト解析 - 特徴 - N 文字ずつ切り出してトークンとして出力する - 辞書を用いない - 品詞などの付加情報がなくトークンをそのままタームとして使用する - クエリ側における注意 - N 文字以上の単語が入力された場合フレーズ検索を行う - クエリの文字数が N より少ない場合のケアを行う - e.g. N が 2 で 1 文字の単語がクエリとして入力された場合 - 2 文字以上でなければトークンとして出力しない - スペースや制御文字を追加して 2 文字にしてトークンとして出力する ## 3.5 テキスト解析で行うそのほかの処理 - 日本語のテキスト解析では全角半角を揃える正規化が重要 - トークン化の前処理で実施するのが一般的 ### 3.5.1 Unicode 正規化 合成済み文字と結合文字列はバイト配列が違うので正規化が必要 - 合成済み文字 - 「が」(U+304C) - 結合文字列 - 「か」+「゛」(U+304B)(U+3099) ```ruby "\u304C".unicode_normalize => "が" ["\u304B", "\u3099"].map(&:unicode_normalize) => ["か", "゙"] "\u304B\u3099".unicode_normalize => "が" ``` - Unicode における文字の等価性の定義 - 正準等価 - 視覚的・機能的等価性 - 互換等価 - 同じ文字を表しているが視覚的な外観・機能が異なる場合の等価性 - e.g. 「㌢」と「センチ」、「1」と「①」 - 等価性に基づき出力を統一する形式 - NFC - Normalization Form Composition - 正準等価の文字を分解し正準等価の文字を合成して出力 - e.g. 「が」 - NFD - Normalization Form Decomposition - 正準等価の文字を分解して出力 - e.g. 「か」と「゛」 - NFKC - Normalization Form Compatibility Composition - 互換等価の文字を分解し正準等価の文字を合成して出力 - e.g. 「㌢」 - NFKCは、互換等価性で分解し正準等価性で合成するため、分解後合成されない場合もある(コード例) - NFKD - Normalization Form Compatibility Decomposition - 互換等価の文字を分解して出力 - e.g. 「センチ」 ```ruby # 304C => が %i[nfc nfd nfkc nfkd].map do |form| "\u304C".unicode_normalize(form).each_codepoint { |s| p s.to_s(16) } end # nfc, nfkc "304c" # nfd, nfkd # 3322 => ㌢ %i[nfc nfd nfkc nfkd].map do |form| "\u3322".unicode_normalize(form).each_codepoint { |s| p s.to_s(16) } end # nfc, nfd "3322" # ㌢ # nfkc, nfkd # 互換等価性によって分解され、正準等価性によって合成されるため、分解されたあと合成されない "30bb" # セ "30f3" # ン "30c1" # チ ``` - ref - [Pythonで文字列をUnicode正規化(unicodedata.normalize) | note.nkmk.me](https://note.nkmk.me/python-unicodedata-normalize/) - [String#unicode_normalize (Ruby 3.2 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/String/i/unicode_normalize.html) - [Rubyで文字コードを扱うコードを書くときに便利なメソッド集 - Qiita](https://qiita.com/ima1zumi/items/28ef13f5af3d9afdeaf3) ### 3.5.2 ストップワード - 英語の冠詞・be 動詞、日本語の助詞を指す - 以前はテキスト解析で出力しないことが多かった - 「To be or not to be」のような検索クエリは検索できない - 現在では取り除かないことが推奨されている - スコア計算時に単語の頻度などを用いて適切なランキングを行い、ストップワードによるノイズを減らす ### 3.5.3 類義語の展開 - 類義語管理は検索対象のドメインによって異なるためシステム運用者に委ねられる - ドメインによっては既存の同義語辞書を利用できる - 類義語の展開は検索クエリのテキスト解析でのみ実行する
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up