社内用の文章校正ツールをサーバーレスで作ってみた

こんにちは、

2019年度新入社員の福田です。

今回はニフティものづくりブログを執筆する際に用語ガイドラインに沿った校正をしてくれるツールをサーバーレスで作ってみました。

用語ガイドラインとは

ニフティではものづくりブログのように外部に公開する文章に使われている言葉が正しいかチェックするための用語のリストが存在します。

例えば、「@Nifty」や「@NIFTY」はガイドライン上で正しくありません、正しくは「@nifty」です。

このようなニフティでの用語に加えて一般的な誤字などをまとめたガイドラインがあります。

ツールの構成

AWSのサービスであるAPI Gateway、Lambda、S3を使ってサーバーレスな構成にしました。

S3にホスティングされたウェブサイトからAPI Gatewayを経由してテキストデータをアップロードし、S3上に生成された構成データを取得する仕組みです。

Lambdaの言語はnode.js、フロントエンドはライブラリとしてReactを採用しました。

文章校正の仕組み

例えば以下のようなルールがあるとします。

  • 誤:申込  → 正:申し込み
  • 誤:頂ける → 正:いただける

この場合、「お申込頂けます」という文を校正すると、「申込」は「申し込み」、「頂けます」は「いただけます」なので「申し込みいただけます」です。

名詞の場合は当てはまる言葉をそのまま校正すればよいですが、動詞の場合は簡単ではありません。

動詞である「頂ける」という言葉を校正するには基本形である「頂ける」とその活用形である「頂け」「頂けれ」「頂ける」「頂けよ」を考慮しなければならないのです。

コンピューター上で文章を校正するには文章を小さな単位(=形態素)に分解して品詞を判別しなければならなければなりません。これを形態素解析と呼びます。

JavaScriptで形態素解析をするにはJavaの形態素解析ライブラリであるkuromojiをJavaScriptに移植したkuromoji.jsというライブラリを使います。

今回はkuromoji.jsを用いてAWSのLambda上で形態素解析を行い、文章の校正をしたいと思います。

kuromoji.jsの辞書に任意の単語を追加する

kuromoji.jsは辞書を内蔵しているのですが、内蔵されている辞書に存在しない単語を含む文章を形態素解析するとうまくいかないことがあります。

例えば「@nifty」をkuromoji.jsで形態素解析すると以下のような結果が得られます。

辞書に「@nifty」という単語が存在しないため「@」と「nifty」が区切られてしまいました。

これでは校正ができないので、自分で辞書に単語を追加していこうと思います。

kuromoji.js/node_modules/mecab-ipadic-seed/lib/dict内に任意の名前でCSVファイルを作ります。

CSVのフォーマットは以下のようになっています。

今回は左文脈ID、右文脈ID、コストは空にしておきます。

追加したら、ビルドコマンドを実行します。

完了したらkuromoji.js/dict内に更新された辞書が生成されます。

生成した辞書を使って「@nifty」をkuromoji.jsで形態素解析をすると以下の結果になります。

Lambdaの作成

AWS上でkuromoji.jsを使って校正する処理をLambdaで作っていこうと思います。

まずは、受け取った文字列をテキストファイルとして、S3のバケットに保存する関数を作成します。

次にテキストファイルから間違っている用語を探し、正しい用語と間違っている理由をJSONにして返す関数を作成します。

kuromoji.jsをそのまま使っても良かったのですが、今回はPromiseに対応したkuromoji.jsのラッパーライブラリであるkuromojinを使用しました。

この関数のディレクトリ構成は以下のようになっています。

校正の処理は対象となる用語を記述した以下のようなJSONを用意して、形態素の基本形と用語を比較しました。

API GatewayでREST APIの作成

API GatewayではテキストデータをJSON形式でPOSTリクエストするためのエンドポイントと、POSTリクエストで返ってきたIDの校正データをGETリクエストで取得するためのエンドポイントの2つを作ります。

前者のAPI Gatewayの設定は統合リクエストの統合タイプを「Lambda関数」に設定してS3バケットに保存するための関数を選択します。

後者のAPI Gatewayの設定は統合リクエストの統合タイプを「AWSサービス」に設定してS3バケットに保存された校正データのJSONファイルをGETリクエストするように設定します。

この状態では、テキストデータをS3バケットに保存しても校正データは生成されないため校正データを生成するLambdaにS3のトリガーを設定し、S3バケットにテキストファイルが保存されたらLambdaが実行されるように設定します。

フロントエンド部分の作成

文章を入力してREST APIにHTTPリクエストをするためのページを作成していきます。

フロントエンドのライブラリはReact、モジュールバンドラーはParcel、HTTPクライアントとしてaxios、CSS in JSライブラリとしてstyled-componentsを使用しました。

左の枠に校正する文章を入力して校正ボタンをクリックすると、中央に校正部分がハイライトされた文章、右に校正の詳細が表示されます。

作成したページはS3の静的ページホスティング機能でホスティングしました。

S3の静的ページホスティング機能についてはこちらの記事をご覧ください。

AWS初心者の私がAmazon S3のStatic website hostingを利用して静的Webページをホスティングしてみました

まとめ

今回はAWSのサービスを活用してサーバーレス構成で社内用ツールを作成しました。

ウェブアプリケーションを運用するとなるとコストが気になると思いますので、今回使用したサービスの料金ページを参考にコストを計算していきます。

1リクエストあたりのコストを無料枠を除いて計算してみたところ約0.000085USDでしたので日本円だと 0.009円ぐらいです。

仮にEC2でインスタンスを立てて運用すると考えると種類にもよりますが、1カ月あたり固定で数千円のコストがかかります。

サーバーレス構成にするとリクエストごとに課金されるので、非常にコストパフォーマンスに優れているのではないのでしょうか。