FileMakerでProofreading APIを活用して誤字脱字をチェックする

# はじめに
文章を書いていて「できた！」と思って見返した時、誰もが一度は通る道なのが誤字と脱字ですね。
FileMakerで見積書やダイレクトメールなど社外向けの文章を管理している場合、誤字脱字は絶対に避けたいところですがFileMakerに日本語をチェックする機能はありません[^1]。
そこで、誤字脱字を発見するAPI「Proofreading API」を使って、入力ミスを減らす試みをしてみました。

Proofreading API http://a3rt.recruit-tech.co.jp/product/proofreadingAPI/

# 環境
開発環境：Claris FileMaker Pro 19
API Version：Proofreading API Version 2

# API利用準備
先述した[Proofreading APIのサイト](http://a3rt.recruit-tech.co.jp/product/proofreadingAPI/)からAPIキーの発行を行なってください。
サイト内の[API KEY発行]ボタンを押すと、メールアドレスを入力するフォームがあるので、メールアドレスさえあれば無料で発行できます。

# FileMakerでの操作
###(1)フィールドを作成する
文章を入力するフィールドと、誤字脱字チェック結果を入れるフィールドを作成します。
![0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/08a54b29-47be-af2f-2d9c-ac7273f2ee79.png)
　　作成したらレイアウト上にフィールドを配置してください。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/8e7be8f6-8e99-ca63-e944-f60f4582b192.png)

###(2)スクリプトを作成する
####文章データを送る命令文を書く
　・使用するスクリプト：「URLから挿入」(画像A)
　・ターゲットの指定：任意のグローバル変数[^2](画像B)
　・URLを指定：`"https://api.a3rt.recruit-tech.co.jp/proofreading/v2/typo?apikey=発行したAPIキー&sentence=" & 文章を入力するフィールド`(画像C)
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/4afdf3ea-a345-ff73-bcbe-5a279c714b50.png)
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/800b8148-4a32-f26b-f575-0b4618e13247.png)
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/72578971-ec73-d79f-28ea-0b115f3df9c4.png)

URL記述ルール
　・エンドポイントURL：`https://api.a3rt.recruit-tech.co.jp/proofreading/v2/typo`
　・apikey：発行したAPIキー
　・sentence：チェックしたい文章

「URLから挿入」スクリプトステップを設定できたなら、ここで一度スクリプトを実行して文章を送ってみましょう！
<font color="#4682B4">「本部からの**妖精**により、追加生産の手配をお願**いた**します。納品のスケジュール表**w**送ります。」</font>　
という、誤字、脱字、タイプミスの間違いオンパレードな文章を入力欄に入れて…
レイアウト上にスクリプトを実行するボタンを配置し、押してみます。

指定したグローバル変数をデータビューアで確認すると、JSON形式で結果が返ってきています。
![4-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/03a36aec-6fc6-0cd0-2420-7a482d8d253a.png)



####JSONデータの誤字脱字情報をFileMaker上で表示させる

先ほどのJSONをJSONFormatElements関数で見やすく形成したものが以下の内容です。

```
{
	"alerts" : 
	[
		{
			"pos" : 5,
			"score" : 0.884116768001396,
			"suggestions" : [ "受", "授", "供" ],
			"word" : "妖"
		},
		{
			"pos" : 6,
			"score" : 0.901461545552049,
			"suggestions" : [ "怪", "則", "定" ],
			"word" : "精"
		},
		{
			"pos" : 22,
			"score" : 0.716417705050166,
			"suggestions" : [ "に", "し", "を" ],
			"word" : "た"
		},
		{
			"pos" : 36,
			"score" : 0.756773253110933,
			"suggestions" : [ "を", "に", "は" ],
			"word" : "表"
		},
		{
			"pos" : 37,
			"score" : 0.999995851482823,
			"suggestions" : [ "に", "を", "見" ],
			"word" : "w"
		}
	],
	"checkedSentence" : "本部からの <<妖>>  <<精>> により、追加生産の手配をお願い <<た>> します。納品のスケジュール <<表>>  <<w>> 送ります。",
	"inputSentence" : "本部からの妖精により、追加生産の手配をお願いたします。納品のスケジュール表w送ります。",
	"message" : "pointed out",
	"normalizedSentence" : "本部からの妖精により、追加生産の手配をお願いたします。納品のスケジュール表w送ります。",
	"resultID" : "d8d3c53dedf8",
	"status" : 1
}
```

誤字脱字があると判断された場合、**"alerts"**という情報が返ってきます。
また**"checkedSentence"**には文中のおかしい箇所が<< >>で囲まれた文章が返ってきます。
これを分岐の条件に利用し、誤字脱字があった場合と無かった場合のIf文をスクリプトに書いていきます。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/afa343dd-5873-57b1-6a80-5b78d6a591fc.png)
・JSON内の"alerts"が空欄の時
　　→チェック結果のフィールドに誤字脱字が無い旨の文章を設定
・JSON内の"alerts"が空欄ではない時
　　→チェック結果のフィールドにJSONの"checkedSentence"情報を設定
という風に、IfとElseを使って分岐させました。


では、再度スクリプトを実行してみます。
![6-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/fabac3bc-1403-e692-1496-122dc28d6baf.png)

誤字脱字箇所が<< >>で囲まれた文章がチェック結果のフィールドに入りました！

今度は指摘された箇所を修正した文章でスクリプトを実行してみます。
![7-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/40f18e86-1293-dc89-bf70-173582e9da6a.png)
誤字脱字は無いと判断されました！

# 応用編
誤字脱字箇所を<< >>で囲んでくれますが、長文になると見づらくなります。
Wordの赤波線のように、該当箇所は見やすいようハイライトしたいですね。
Substitute関数とTextColor関数を使って<< >>の色を目立たせてみましょう。

チェック結果を入れるフィールドのオプションで、計算値を指定します。
**フィールドに既存の値が存在する場合は置き換えないのチェックは外します。**
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/4c4d7fff-e4ff-a860-44d4-a1d193656539.png)

計算式は以下の内容です。

```
Substitute ( チェック結果 ; [ " <<" ; TextColor ( " <<" ; RGB ( 255 ; 0 ; 0 ) )] ; [ ">> " ; TextColor ( ">> " ; RGB ( 255 ; 0 ; 0 ) ) ] )
```
TextColorは文字の色を指定できる関数です。
Substituteでチェック結果フィールド内の「 <<」と「>> 」を、TextColorで指定した文字色で置き換えています。

設定後、スクリプトを実行すると<< >>が赤色になった文章が確認できます。
![6-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/91555f91-1632-6a51-639d-f987fa7a53e3.png)

# 注意点と解決方法
改行が入っている文章をチェックする場合、誤字脱字があると判断された時、改行も<< >>で囲まれて返ってきます。
![11-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/c41e7a18-c5bc-866e-ed26-4d35b9076c82.png)
<< >>で囲ませたくない場合、スクリプト内のElseの後のフィールド設定の計算式を以下の内容に変更すると解決します。

```
 Substitute ( JSONGetElement ( $$結果 ; "checkedSentence" ) ; " <<" & ¶ & ">> " ; "¶" )
```
Substitute関数で、「 << 改行 >> 」を、改行のみに置き換えています。

# サンプルファイル
サンプルファイルをご用意しました。
[ダウンロード](https://www.juppo.co.jp/Qiita/sample_proofreading.zip)
はじめに、スクリプトの「sample」→「URLから挿入」ステップ→「URLを指定」内の●●●を、ご自身が取得されたAPIキーに書き換えてください。
[^1]: 外国語のスペルチェック機能はあります。[Claris FileMaker Pro 19 ヘルプ ](https://help.claris.com/ja/pro-help/index.html#page/FMP_Help%2Fchecking-spelling.html)
[^2]: 今回は返ってくるJSONをわかりやすくするためグローバル変数にしましたが、通常の変数($)でも動作に問題はないです。

# おわりに


Proofreading APIを利用するにあたり、提供元の規約をよく読んで自己責任においてご利用ください。
A3RT利用規約 http://a3rt.recruit-tech.co.jp/policy/terms.html

色々な文章を試す中、「大腸を更新してください」という文章は誤字判定されませんでした。（正：台帳を更新してください）
ただし上記の文章はWordの校正機能や、yahooの校正支援サービスでも誤字判定されませんでしたので、AIにはまだ判断が難しい文章なのかもしれません。
Proofreading APIは過去に精度向上のアップデートも行われているので、今後の進化に期待です。