로고이미지
TOP

API 개발 가이드

어휘 간 유사도 분석 API

어휘 간 유사도 분석 API 란?

다양한 어휘지식을 통합한 WiseWordNet 어휘 지식베이스에 기반하여 어휘 간 거리 정보를 분석하는 기술로서 입력된 여휘간 유사도 결과를 제공합니다. 어휘 간 유사도 분석 API는 HTTP 기반의 REST API 인터페이스로 JSON 포맷 기반의 입력 및 출력을 지원하며 ETRI에서 제공하는 API Key 인증을 통해 사용할 수 있는 Open API입니다.

API 호출 1일 허용량

기술명 API명 1일 허용량

어휘 간 유사도 분석 API 사용하기

어휘 간 유사도 분석 API는 REST API이며, 어휘 간 유사도 분석을 수행할 2개의 어휘 데이터를 HTTP 통신으로 ETRI Open API 서버에 전달하면 됩니다. 서버가 제공하는 REST API의 URI는 다음과 같으며 POST 방식으로 호출해야 합니다.

http://aiopen.etri.re.kr:8000/WiseWWN/WordRel

HTTP 요청으로 어휘 간 유사도 분석을 요청할 때 사전 준비 사항에서 발급받은 API Key 정보를 요청하는 본문에 포함시켜야 합니다. 다음은 HTTP 요청 메시지 예입니다.


[HTTP Request Header]
"Authorization" : "YOUR_ACCESS_KEY"

[HTTP Request Body]
{
      "request_id": "reserved field",	
      "argument": {
            “first_word”: “FIRST_YOUR_WORD”,
            “first_sense_id”: “FIRST_WORD_SENSE_ID”,
            “second_word”: “SECOND_YOUR_WORD”,
            “second_sense_id”: “SECOND_WORD_SENSE_ID”
      }
}

위와 같은 HTTP 요청을 ETRI Open API 서버로 전달하면 서버는 JSON 형태의 Text 데이터를 HTTP 응답 메시지로 반환합니다. 다음은 HTTP 응답 예제 입니다.


[HTTP Response Header]
Access-Control-Allow-Origin:*
Connection:close
Content-Length:0
Content-Type:application/json; charset=UTF-8

[HTTP Response Body]
{
      "request_id": "reserved field",
      "result": 0,
      "return_type": "com.google.gson.internal.LinkedTreeMap",
      "return_object": {어휘 간 유사도 분석 결과 JSON}
}

구현 예제

  • JAVA
  • PHP
  • C++
  • Python
  • Node.js

JSON parsing을 위해 Gson 라이브러리를 사용하여 제공하고 있습니다. Gson 라이브러리에 대한 자세한 설명은 https://github.com/google/gson 에서 확인 하실 수 있습니다.


  import java.io.DataOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.HttpURLConnection;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.util.HashMap;
  import java.util.Map;
   
  import com.google.gson.Gson;
   
  public class Example {
   
      static public void main ( String[] args ) {
          String openApiURL = "http://aiopen.etri.re.kr:8000/WiseWWN/WordRel";
          String accessKey = "YOUR_ACCESS_KEY";           // 발급받은 API Key
          String firstWord = "FIRST_WORD";                // 첫번째 어휘 데이터
          String firstSenseId = "FIRST_WORD_SENSE_ID";  // 첫번째 어휘 의미코드
          String secondWord = "SECOND_WORD";              // 두번째 어휘 데이터
          String secondSenseId = "SECOND_WORD_SENSE_ID"; // 두번째 어휘 의미코드
   
          Gson gson = new Gson();
   
          Map<String, Object> request = new HashMap<>();
          Map<String, String> argument = new HashMap<>();
   
          argument.put("first_word", firstWord);
          argument.put("first_sense_id", firstSenseId);
          argument.put("second_word", secondWord);
          argument.put("second_sense_id", secondSenseId);
   
          request.put("argument", argument);
   
   
          URL url;
          Integer responseCode = null;
          String responBody = null;
          try {
              url = new URL(openApiURL);
              HttpURLConnection con = (HttpURLConnection)url.openConnection();
              con.setRequestMethod("POST");
              con.setDoOutput(true);
              con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
              con.setRequestProperty("Authorization", accessKey);	
   
              DataOutputStream wr = new DataOutputStream(con.getOutputStream());
              wr.write(gson.toJson(request).getBytes("UTF-8"));
              wr.flush();
              wr.close();
   
              responseCode = con.getResponseCode();
              InputStream is = con.getInputStream();
              byte[] buffer = new byte[is.available()];
              int byteRead = is.read(buffer);
              responBody = new String(buffer);
   
              System.out.println("[responseCode] " + responseCode);
              System.out.println("[responBody]");
              System.out.println(responBody);
   
          } catch (MalformedURLException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }


<?php
$openApiURL = "http://aiopen.etri.re.kr:8000/WiseWWN/WordRel";
$accessKey = "YOUR_ACCESS_KEY";
$firstWord = "FIRST_WORD";
$firstSenseId = "FIRST_SENSE_ID";
$secondWord = "SECOND_WORD";
$secondSenseId = "SECOND_SECSE_ID ";
 
 
$request = array(
    "argument" => array (
        "first_word" => $firstWord,
        "first_sense_id" => $firstSenseId,
        "second_word" => $secondWord,
        "second_sense_id" => $secondSenseId
    )
);
 
try {
    $server_output = "";
    $ch = curl_init();
    $header = array(
        "Content-Type:application/json; charset=UTF-8",
        "Authorization":{$accessKey}
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_URL, $openApiURL);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode ( $request) );
 
    $server_output = curl_exec ($ch);
    if($server_output === false) {
        echo "Error Number:".curl_errno($ch)."\n";
        echo "Error String:".curl_error($ch)."\n";
    }
 
    curl_close ($ch);
} catch ( Exception $e ) {
    echo $e->getMessage ();
}
 
echo "result = " . var_dump($server_output);
?>

JSON parsing을 위해 jsoncpp 라이브러리를 사용하여 제공하고 있습니다. jsoncpp 라이브러리에 대한 자세한 설명은 https://github.com/open-source-parsers/jsoncpp 에서 확인 하실 수 있습니다.

HTTP 통신을 위해 curl 라이브러리를 사용하여 제공하고 있습니다. curl 라이브러리에 대한 자세한 설명은 https://curl.haxx.se/libcurl 에서 확인 하실 수 있습니다.

컴파일을 위해서는 아래와 같이 추가된 LIB에 대한 옵션을 추가해야 합니다.

g++ (c++파일명) (JSONCPP)/json/json.h (JSONCPP)/json/json-forwards.h (JSONCPP)/jsoncpp.cpp -I(CURL)/include -lcurl

#include <curl/curl.h>
#include <json/json.h>
#include <iostream>
#include <string>
 
using namespace std;
 
size_t writeDataFunc(void *ptr, size_t size, size_t nmemb, std::string stream);
 
int main() {
    char* openApiURL = (char*)"http://aiopen.etri.re.kr:8000/WiseWWN/WordRel";
    string accessKey = "YOUR_ACCESS_KEY";
    string firstWord = "FIRST_WORD";
    string firstSenseId = "FIRST_SENSE_ID";
    string secondWord = "SECOND_WORD";
    string secondSenseId = "SECOND_SENSE_ID";
 
    Json::Value request;
    Json::Value argument;
 
    argument["first_word"] = firstWord;
    argument["first_sense_id"] = firstSenseId;
    argument["second_word"] = secondWord;
    argument["second_sense_id"] = secondSenseId;
  
    request["argument"] = argument;
 
    CURL *curl;
    curl_slist* responseHeaders = NULL;
    curl = curl_easy_init();
 
    if( curl == NULL ) {
        cout << "Unable to initialize cURL interface" << endl ;
    } else {
        responseHeaders = curl_slist_append( responseHeaders , "Content-Type: application/json; charset=UTF-8" ) ;
        responseHeaders = curl_slist_append( responseHeaders , ("Authorization: " + accessKey).c_str() ) ; 
        string requestJson = request.toStyledString();
        long statusCode;
        string response;
 
        curl_easy_setopt(curl, CURLOPT_URL, openApiURL);
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, responseHeaders ) ;
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestJson.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeDataFunc);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
 
        curl_easy_perform(curl);
 
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &statusCode);
        curl_easy_cleanup(curl);
 
        cout << "[responseCode] " << statusCode << endl;
        cout << "[responBody]" << endl;
        cout << response << endl;
    }
 
    return 0;
}
 
size_t writeDataFunc(void *ptr, size_t size, size_t nmemb, std::string stream) {
    size_t realsize = size * nmemb;
    std::string temp(static_cast<const char*>(ptr), realsize);
    stream.append(temp);
    return realsize;
}

python 3.0을 기준으로 작성되었습니다.

HTTP 통신을 위해 urllib3 라이브러리를 사용하여 제공하고 있습니다. Python 3.0 이하의 버전에서 예제를 실행하기 위해서는 별도로 urllib3의 설치가 필요합니다. 설치에 대한 설명은 https://pypi.python.org/pypi/urllib3 를 참고하시기 바랍니다. urllib3 라이브러리에 대한 자세한 설명은 https://urllib3.readthedocs.io/en/latest/ 에서 확인 하실 수 있습니다.

#-*- coding:utf-8 -*-
import urllib3
import json
 
openApiURL = "http://aiopen.etri.re.kr:8000/WiseWWN/WordRel"
accessKey = "YOUR_ACCESS_KEY"
firstWord = 'FIRST_WORD'
firstSenseId = 'FIRST_SENSE_ID'
secondWord = 'SECOND_WORD'
secondSenseId = 'SECOND_SENSE_ID'
 
requestJson = {   
    "argument": {
        'first_word': firstWord,
        'first_sense_id': firstSenseId,
        'second_word': secondWord,
        'second_sense_id': secondSenseId
    }
}
 
http = urllib3.PoolManager()
response = http.request(
    "POST",
    openApiURL,
    headers={"Content-Type": "application/json; charset=UTF-8", "Authorization": accessKey},
    body=json.dumps(requestJson)
)
 
print("[responseCode] " + str(response.status))
print("[responBody]")
print(str(response.data,"utf-8"))




var openApiURL = 'http://aiopen.etri.re.kr:8000/WiseWWN/WordRel';
var access_key = 'YOUR_ACCESS_KEY';
var firstWord = 'FIRST_WORD';
var firstSenseId = 'FIRSR_SENSE_ID';
var secondWord = 'SECOND_WORD';
var secondSenseId = 'SECOND_SENSE_ID';
 
var requestJson = {
    'argument': {
        'first_word': firstWord,
        'first_sense_id': firstSenseId,
        'second_word': secondWord,
        'second_sense_id': secondSenseId
    }
};
 
var request = require('request');
var options = {
    url: openApiURL,
    body: JSON.stringify(requestJson),
    headers: {'Content-Type':'application/json','Authorization':access_key}
};
request.post(options, function (error, response, body) {
    console.log('responseCode = ' + response.statusCode);
    console.log('responseBody = ' + body);
});

어휘 간 유사도 분석 API 레퍼런스

  • 요청 파라미터
  • 응답
  • 오류코드

어휘 간 유사도 분석 API에 필요한 요청 본문에 다음과 같은 파라미터를 작성해야 합니다.


[HTTP Request Header]
"Authorization" : "YOUR_ACCESS_KEY"

[HTTP Request Body]
{
    "argument": {
        "first_word": "FIRST_YOUR_WORD",
        "first_sense_id": "FIRST_WORD_SENSE_ID",
        "second_word": "SECOND_YOUR_WORD",
        "second_sense_id": "SECOND_WORD_SENSE_ID"
    }
}

다음은 파라미터에 대한 설명입니다.

Field 명 타입 필수 여부 설명
access_key String API 사용을 위해 ETRI에서 발급한 사용자 API Key
argument Object API 사용 요청 시 분석을 위해 전달할 내용
first_word String 비교 분석할 어휘 Text 로서 UTF-8 인코딩된 텍스트만 지원
first_sense_id String 첫 번째 어휘의 의미 코드
2자리 숫자 : 동음이의어 의미코드
4자리 숫자 : 동음이의어 의미코드(2자리)+다의어 의미 코드(2자리)
second_word String 비교 분석 대상 어휘 Text 로서 UTF-8 인코딩된 텍스트만 지원
second_sense_id String 두 번째 어휘의 의미 코드
2자리 숫자 : 동음이의어 의미코드
4자리 숫자 : 동음이의어 의미코드(2자리)+다의어 의미 코드(2자리)

어휘 간 유사도 분석 API는 요청된 어휘 간 유사도 분석 결과를 JSON 형태의 Text 데이터로 반환합니다.
다음은 정상적인 요청 처리에 대한 HTTP 응답 예입니다.


[HTTP Response Header]
Access-Control-Allow-Origin:*
Connection:close
Content-Length:0
Content-Type:application/json; charset=UTF-8

[HTTP Response Body]
{
    "request_id": "reserved field",
    "result": 0,
    "return_type": "com.google.gson.internal.LinkedTreeMap",
    "return_object": {어휘 간 유사도 분석 결과 JSON}
}

다음은 오류가 발생한 요청 처리에 대한 HTTP 응답 예입니다.


[HTTP Response Header]
Access-Control-Allow-Origin:*
Connection:close
Content-Length:0
Content-Type:application/json; charset=UTF-8

[HTTP Response Body]
{
    "request_id": "reserved field",
    "result": -1,
    "reason": {오류 메시지}
}

분석된 결과는 다음과 같은 내용이 포함되어 있습니다.

구분 JSON Key 이름 설명
MetaInfo Title Open APIs의 타이틀 명
Link 해당 Open APIs를 사용하기 위한 URL 정보
WWN WordRelInfo FirstWordInfo 첫 번째 어휘 정보
Word 어휘의 원문자열
HomonymCode 어휘의 동음이의어 코드 (2자리 숫자)
PolysemyCode 어휘의 다의어 코드 (2자리 숫자)
Definition 의미 정보
POS 어휘의 품사
명사 : "n"
동사 : "v"
SecondWordInfo 두 번째 어휘 정보
Word 어휘의 원문자열
HomonymCode 어휘의 동음이의어 코드 (2자리 숫자)
PolysemyCode 어휘의 다의어 코드 (2자리 숫자)
Definition 의미 정보
POS 어휘의 품사
명사 : "n"
동사 : "v"
WordRelInfo 어휘 간 유사도 분석 정보
ShortedPath 가장 가까운 연결 어휘 경로 정보
Distance 어휘 경로 거리 정보 (숫자)
Similarity 어휘 간 거리 유사도
Algorithm 거리 유사도 알고리즘
SimScore 거리 유사도 신뢰도

어휘 간 유사도 분석 API의 오류 코드 목록은 다음과 같습니다.

http status code result reason 설명
403 -1 Empty Auth Header Authorization 헤더가 없는 경우
403 -1 Invalid Key KEY API 키가 없는 경우
403
-1 Blocked KEY API 키가 관리자에 의해서 차단된 경우
403
-1 Daily Limit Exceeded 일간 호출 제한에 걸린 경우
403
-1 Monthly Limit Exceeded
월간 호출 제한에 걸린 경우
403
-1 Yearly Limit Exceeded
연간 호출 제한에 걸린 경우
403
-1 Too Many Keys 같은 IP에서 여러 API 키가 사용된 경우
403
-1 Too Many IPs 하나의 API 키를 여러 IP 에서 사용한 경우
403
-1 Not Allowed IP API 호출 가능한 IP 가 아닌경우
(API 설정에서 허용된 IP가 아닌경우)
403
-1 Not Allowed Subpath 하위경로 접근 제한이 되어 있는 경우
403 -1 Invalid API
등록되지 않은 API를 요청한 경우
408 -1
Request Timeout
서버의 요청 대기가 시간을 초과한 경우
413
-1 Body Size Limit Exceeded
요청 바디가 설정된 값보다 큰 경우
429
-1 Concurrent Limit Exceeded
연속호출 허용 범위를 넘어서 호출한 경우
500 -1 Internal Server Error 내부 오류 발생한 경우