MATLABからGoogle翻訳の結果を自動取得

# はじめに

前回記事「[レーベンシュタイン距離から言語間の類似度を比較してみた](https://qiita.com/aoimidori/items/a8769100068e6e7f973b)」にて、各国の言語を解析したのですが、その時は英語の文字列を手動でGoogle翻訳にかけて各国のデータを準備しており、解析以前にそのデータセットを用意する所が面倒だったので、MATLABから自動化できないかなと試みたので覚書として残しておきます。

# せっかくなので1行ずつ解説

### 単語リストの読み込み

単語リストはこちらの[The Online Plain Text English Dictionary](http://www.mso.anu.edu.au/~ralph/OPTED/)を拝借しました。
各アルファベットから始まる単語がずらっと表になっているので、まずはこの中で"A"から始まるものをダウンロードします。Aのリンクをクリックするとcsvファイルがダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/0082cc28-a73f-2f06-65af-f7b982a6a5cc.png)

Aword.csvを開くと下記のような感じで単語がずらっと並んでいます。

<img width="300" alt="2-D Scatter.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/cb9daaa0-597b-e03d-3a26-f92bd3cd5dc7.png">

なので、このファイルを[readtable](https://jp.mathworks.com/help/matlab/ref/readtable.html)関数で読んでいきます。

```matlab
aword = readtable('Aword.csv');
```

そうすると変数awordに先ほどのcsvの中身が格納されます。

### データの確認

続いて、データの中身を見ていきます。毎回思うのですが、このステップが非常に大切で、例えば下記2896行目のような誤りデータが混じっていたりするので、こういうのは削除します。（とはいえ、削除の基準を明確に言葉にできないのは個人的に少しモヤモヤするのですが...）

<img width="400" alt="2-D Scatter.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/bf9be743-4cf6-9e70-49bc-31d1fd4b1c00.png">

2896行目以外にもちらほらあるので、手作業で削除していきます。

```matlab
aword([1958 2896 3074 3504 3535 3536 3606 3607 3650],:) = [];
```

### 重複データの削除

既にお気づきの方もいらっしゃると思いますが、どういう意図かわからないのですが、単語データが所々重複しているんですよね。なので、重複を削除する[unique](https://jp.mathworks.com/help/matlab/ref/unique.html)という関数で重複を取り除いていきます。

```matlab
aword = unique(aword(:,1),'stable');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/50be44c5-ea88-fd46-c81b-7158c0963575.png)


ちなみに'abacus'は、そろばんて意味らしいですね。~~変な単語じゃなくてよかった~~

### Google翻訳のAPIへアクセス

無料でGoogle翻訳のAPIを作る方法は[こちらの素敵すぎる記事](https://qiita.com/tanabee/items/c79c5c28ba0537112922)を参考にさせて頂きました。（というか、自分でも記事を真似てデプロイを試しましたが、後述で紹介しているコードではURLまでお借りしています。ありがとうございます。）

MATLABにはRESTful Webサービスからのコンテンツの読み込み用の関数[webread](https://jp.mathworks.com/help/matlab/ref/webread.html)があるのでこちらを利用します。

```matlab
baseurl = 'https://script.google.com/macros/s/AKfycbweJFfBqKUs5gGNnkV2xwTZtZPptI6ebEhcCU2_JvOmHwM2TCk/exec';

text = aword;
source = 'en';
target = 'nl';

for ii = 1:height(text)
    url = [baseurl '?text=' char(table2array(text(ii,1))) '&source=' source '&target=' target];
    options = weboptions('Timeout',15); % 任意で設定
    str{ii} = webread(url, options);
end
```

sourceとtargetを上記のように設定すると、英語からオランダ語への翻訳ができます。こちらのコードは、翻訳したい言語によって下記のように適宜変えていくことになります。

英語：en
オランダ語：nl
ドイツ語：de
フランス語：fr
イタリア語：it

その他の言語のコードについては[こちら](https://cloud.google.com/translate/docs/languages?hl=ja)を参照ください。

### おまけ:Live Scriptのドロップダウンを使ってみた

ということで、targetの値を変えて色々な言語に翻訳していくわけですが、後々言語コードを忘れてしまうかもしれないので、Live Scriptに付けられるドロップダウンリストなるものを作成してみました。ドロップダウンリストは[こちら](https://jp.mathworks.com/help/matlab/matlab_prog/add-interactive-controls-to-a-live-script.html)を参考に作っています。これで、他の人にソースコードを渡しても簡単に使ってもらえそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/272ab63b-c93b-fcc9-bbb0-1e39b48c9859.png)

### 結果の表示

結果の格納されているstrを、見やすいように転置させて中身を確認してみましょう。

```matlab
str = str';
```

普段使っているGoogle翻訳のGUIも重ね書きして見ましたが、うまく結果を取得できていることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/d3fb85ff-db87-a297-d132-8832dcea706b.png)


# おわりに

前回の記事の[最後の方](https://qiita.com/aoimidori/items/a8769100068e6e7f973b#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)で、他の言語でも類似度を比較してみたいと書きましたが、今回作ったスクリプトを使うことで、単語数が増えても、そして、展開する言語の数が増えても、効率よく作業が進められそうです。また機会を見つけて、前回の記事の続きも試してみたいと思います。