【GAS】GAS와 COTOHA API로 루오시바 Bot를 투게더한다

개요



구글 번역과 형태소 해석의 조합으로 루대 시바봇을 섬뜩했기 때문에 만들어 보았다.
(무슨 달인지 몰라…)

개인용 Slack로 담담하게 속담을 루씨풍으로 번역해 흘려 받고 있다.
멘션을 보내면, 그 문장을 번역해 돌려준다.



藪에서 스틱이 되었으면 좋겠지만, 藪에서 rod.
가끔 번역 가감이 절묘한 것이 흐르고 있다고 무심코 웃어 버린다.

「Fruit report는 sleepwait」


Benkei의 Stuck


메커니즘



당연하다고 하면 당연하지만, GAS에서는 Google 번역을 매우 간단하게 할 수 있다.LanguageApp.translate('文章', 'ja', 'en');
루씨의 경우는 문장에 포함된 특정 부분만을 영역할 필요가 있다.
거기서 사용하는 것이 자연 언어 해석. WebAPI로 일부 게시되었지만,
그 중에서 「COTOHA API」라고 하는 것을 사용해 보았다.
참조는 매우 이해하기 쉽고, 특히 헤매지 않고 사용할 수있었습니다.

COTOHA API

COTOHA API를 통해 문장의 형태소와 그 품사 정보를 받는다.
거꾸로 말해 버리면, 명사, 동사, 형용사만을 번역해 재결합하는 것만으로 그렇게 된다.

내용


function roux(text){
  var json = getJson(text);
  var resultArray = jsonToArray(json);
  return convertRoux(resultArray);
}

function getJson(text) {
  var properties = PropertiesService.getScriptProperties();
  var accessToken = 'Bearer ' + properties.getProperty('access_token');

  var url = properties.getProperty('APIBaseURL');
  var body = { sentence: text };
  var header = { Authorization: accessToken };
  var payload = JSON.stringify(body);

  var params = {
    method: 'post',
    contentType: 'application/json;charset=UTF-8',
    headers: header,
    payload: payload
  };

  var response = UrlFetchApp.fetch(url, params);
  return(response.getContentText());
}

function jsonToArray(json) {
  var jsonData = JSON.parse(json);

  jsonData = jsonData["result"];
  var ary = [];

  for (var i in jsonData) {
    var sub = jsonData[i]["tokens"];

    for (var j in sub) {
      ary.push([sub[j]["form"],sub[j]["pos"]])
      j++;
    }
    j==0;
    i++;
  }
  return ary
}

function convertRoux(resultArray){
  var resultText = '';
  var tmp = '';
  resultArray.forEach(function(value){
    switch (true) {
      case  /名詞/.test(value[1]): //名詞系は翻訳する
        resultText = resultText + LanguageApp.translate(value[0], 'ja', 'en');
        break;

      case  /形容詞語幹/.test(value[1]): //形容詞語幹はいったん無視し、次に来る形容詞接尾辞と合わせて翻訳する
        tmp = value[0];
        break;

      case  /形容詞接尾辞/.test(value[1]): //直前にある形容詞語幹と合わせて翻訳する
        resultText = resultText + LanguageApp.translate(tmp + value[0], 'ja', 'en');
        break;

      case  /動詞活用語尾/.test(value[1]): //動詞活用語尾は除外する
        break;

      case  /動詞語幹/.test(value[1]): //動詞語幹はいったん無視し、次に来る動詞接尾辞と合わせて翻訳する
        tmp = value[0];
        break;

      case  /動詞接尾辞/.test(value[1]): //直前にある動詞語幹と合わせて翻訳する
        resultText = resultText + LanguageApp.translate(tmp + value[0], 'ja', 'en');
        break;

      case  /接尾辞/.test(value[1]): //ほか、接尾辞は除外する
        break;

      default:
        resultText = resultText + value[0];
        break;
    }
  });

  return resultText
}

function roux (text)



본체. 여기에 일본어의 문장을 건네주면, 루 번역한 결과를 돌려준다.

function getJson(text) ~ function jsonToArray(json)



여기서 문장을 COTOHA API에 건네주어 결과의 json을 취득하고 있다.
그 후, json으로부터 각 형태소와 그 품사 정보를 2차원 배열로 정리하고 있다.

function convertRoux (resultArray)



여기서 품사마다 이하 3패턴의 처리로 구분하고 있다.
  • 번역할 단어
  • 번역하지 않는 단어
  • 삭제할 단어

  • 동사, 형용사는 각각 어간과 접미사가 있기 때문에 조금 파고 처리하고 있다.
    찌르면 더 세세한 법칙이 나온다고 생각하지만, 어느 정도 잡음 가감이 있던 편이 루씨다움이 된다.



    보충



    실제 Bot화에 대해서는 생략하지만, Bot화하는 경우에는 액세스 토큰의 갱신이 필수.
    COTOHA API의 토큰은 24h의 기한이므로,
    아래 코드를 트리거로 하루 1회 실행하고 있다.
    ID계는 스크립트나 스프레드시트의 프로퍼티에 기입하도록(듯이) 하면 좋다.
    function refreshTaken() {
      var properties = PropertiesService.getScriptProperties();
    
      var url = properties.getProperty('AccessTokenPublishURL');
      var body = { grantType: 'client_credentials', clientId: properties.getProperty('clientId'), clientSecret:properties.getProperty('clientSecret')};
      var payload = JSON.stringify(body);
      var params = {
        method: 'post',
        contentType: 'application/json',
        payload: payload
      };
    
      var response = UrlFetchApp.fetch(url, params);
      var jsonData = JSON.parse(response);
    
      properties.setProperty('access_token', jsonData["access_token"]);
    }
    
    

    좋은 웹페이지 즐겨찾기