리액트에서 형태소 분석기 사용하기

jonyChoiGenius·2023년 2월 17일
2
post-thumbnail

형태소 분석기를 사용하고 싶었다.

빅맥좋아요 님의 JavaScript/자연어 처리[node.js] 형태소 분석기 mecab 사용하기라는 글을 읽고, mecab-ya를 설치해서 리액트나 next.js에 그대로 모듈을 올려 사용해보려고 했는데....

역시나 택도 없었다.

그러던 중 etri에서 만든 open API가 있어서 활용해보고자 한다.

https://aiopen.etri.re.kr/guide/WiseNLU에서 다양한 예제를 제공한다. (node js도 있다.)

export default function Home() {
  const [value, setValue] = useState("");
  const [result, setResult] = useState("");

  const onSubmit = (e: SubmitEvent) => {
    e.preventDefault();
    
    //axios를 통해서 보내면 된다.
    axios
      .post( //요청은 post
        "http://aiopen.etri.re.kr:8000/WiseNLU",
        {
          argument: {
            analysis_code: "morp", //"morp" 형태소 분석 코드
            text: value,
          },
        },
        {
          headers: {
            //etri에서 발급받은 API키를 넣으면 된다.
            Authorization: YOUR_ACCESS_KEY,
          },
        }
      )
      .then((res) => {
      //결과 값은 return_object에 저장되어 온다.
        const sentenceArray = res.data.return_object.sentence
        const resultArr = sentenceArray.map((e) => e.morp);
        setResult(JSON.stringify(resultArr));
      });
  };
  
  return (
    <>
      <Head>
        <title>Create Next App</title>
        <meta name="description" content="Generated by create next app" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <main className={styles.main}>
        <form action="" onSubmit={onSubmit}>
          <textarea
            value={value}
            onChange={(e) => setValue(e.target.value)}
          ></textarea>
          <button type="submit">발송</button>
        </form>
        
        {/*  응답 결과를 JSON.stringfy로 문자열화하고 이렇게 출력한다.  */}
        <div>{result}</div>
      </main>
    </>
  );
}

간단하게 테스트해봤다.

이 대표는 이날 사회관계망서비스(SNS)에 ‘이재명 배임죄 부풀리려 숫자로 장난 친 검찰’이라는 언론 보도를 공유하며 이같이 밝혔다. 검찰은 전날 대장동·위례신도시 개발 특혜 의혹과 성남FC 후원금 의혹과 관련해 이 대표에 대한 구속영장을 청구했다.

이 대표는 “배당금을 지분 아닌 확정액으로 약정했으니 배임죄라는 검찰 주장대로면 부동산 경기 호전시는 유죄, 악화시는 무죄”라며 “확정액 아닌 지분으로 약정하면 반대로, 경기 악화시에 배임이 된다”고 주장했다.

결과가 잘 뜬다

[[{"id":0,"lemma":"이","type":"NNP","position":0,"weight":0.119957
"id":1,"lemma":"대표","type":"NNG","position":4,"weight":0.217613
"id":2,"lemma":"는","type":"JX","position":10,"weight":0.171665
"id":3,"lemma":"이날","type":"NNG","position":14,"weight":0.064624
"id":4,"lemma":"사회","type":"NNG","position":21,"weight":0.0948841
"id":5,"lemma":"관계","type":"NNG","position":27,"weight":0.0948841
"id":6,"lemma":"망","type":"NNG","position":33,"weight":0.0948841
"id":7,"lemma":"서비스","type":"NNG","position":36,"weight":0.182119
"id":8,"lemma":"(","type":"SS","position":45,"weight":1
"id":9,"lemma":"SNS","type":"SL","position":46,"weight":1
"id":10,"lemma":")","type":"SS","position":49,"weight":1
"id":11,"lemma":"에","type":"JKB","position":50,"weight":0.152234
"id":12,"lemma":"‘","type":"SS","position":54,"weight":1
"id":13,"lemma":"이재명","type":"NNP","position":57,"weight":0.0418763
"id":14,"lemma":"배임","type":"NNG","position":67,"weight":0.0747373
"id":15,"lemma":"죄","type":"NNG","position":73,"weight":0.0747373
"id":16,"lemma":"부풀리","type":"VV","position":77,"weight":0.0367607
"id":17,"lemma":"려","type":"EC","position":86,"weight":0.0403822
"id":18,"lemma":"숫자","type":"NNG","position":90,"weight":0.104656
"id":19,"lemma":"로","type":"JKB","position":96,"weight":0.0919981
"id":20,"lemma":"장난","type":"NNG","position":100,"weight":0.0465285
"id":21,"lemma":"치","type":"VV","position":107,"weight":0.0640961
"id":22,"lemma":"ㄴ","type":"ETM","position":107,"weight":0.0640961
"id":23,"lemma":"검찰","type":"NNG","position":111,"weight":0.172015
"id":24,"lemma":"’","type":"SS","position":117,"weight":1
"id":25,"lemma":"이","type":"VCP","position":120,"weight":0.0606199
"id":26,"lemma":"라는","type":"ETM","position":123,"weight":0.117737
"id":27,"lemma":"언론","type":"NNG","position":130,"weight":0.0882435
"id":28,"lemma":"보도","type":"NNG","position":137,"weight":0.133659
"id":29,"lemma":"를","type":"JKO","position":143,"weight":0.145219
"id":30,"lemma":"공유","type":"NNG","position":147,"weight":0.161194
"id":31,"lemma":"하","type":"XSV","position":153,"weight":0.0702779
"id":32,"lemma":"며","type":"EC","position":156,"weight":0.15778
"id":33,"lemma":"이","type":"NP","position":160,"weight":0.0726563
"id":34,"lemma":"같이","type":"JKB","position":163,"weight":0.0468648
"id":35,"lemma":"밝히","type":"VV","position":170,"weight":0.0800321
"id":36,"lemma":"었","type":"EP","position":173,"weight":0.0838268
"id":37,"lemma":"다","type":"EF","position":176,"weight":0.130033
"id":38,"lemma":".","type":"SF","position":179,"weight":1}],


[{"id":0,"lemma":"검찰","type":"NNG","position":181,"weight":0.118862
"id":1,"lemma":"은","type":"JX","position":187,"weight":0.106723
"id":2,"lemma":"전날","type":"NNG","position":191,"weight":0.0957476
"id":3,"lemma":"대장","type":"NNP","position":198,"weight":0.0383415
"id":4,"lemma":"동","type":"NNG","position":204,"weight":0.0383415
"id":5,"lemma":"·","type":"SP","position":207,"weight":1
"id":6,"lemma":"위례신","type":"NNG","position":209,"weight":0.0389695
"id":7,"lemma":"도시","type":"NNG","position":218,"weight":0.124066
"id":8,"lemma":"개발","type":"NNG","position":225,"weight":0.135655
"id":9,"lemma":"특혜","type":"NNG","position":232,"weight":0.0733739
"id":10,"lemma":"의혹","type":"NNG","position":239,"weight":0.10848
"id":11,"lemma":"과","type":"JC","position":245,"weight":0.0560496
"id":12,"lemma":"성남","type":"NNP","position":249,"weight":0.0706637
"id":13,"lemma":"FC","type":"SL","position":255,"weight":1
"id":14,"lemma":"후원","type":"NNG","position":258,"weight":0.193876
"id":15,"lemma":"금","type":"XSN","position":264,"weight":0.193876
"id":16,"lemma":"의혹","type":"NNG","position":268,"weight":0.117647
"id":17,"lemma":"과","type":"JKB","position":274,"weight":0.108331
"id":18,"lemma":"관련","type":"NNG","position":278,"weight":0.0995058
"id":19,"lemma":"하","type":"XSV","position":284,"weight":0.0664857
"id":20,"lemma":"어","type":"EC","position":284,"weight":0.0664857
"id":21,"lemma":"이","type":"NNP","position":288,"weight":0.069296
"id":22,"lemma":"대표","type":"NNG","position":292,"weight":0.272202
"id":23,"lemma":"에","type":"JKB","position":298,"weight":0.179128
"id":24,"lemma":"대하","type":"VV","position":302,"weight":0.0944951
"id":25,"lemma":"ㄴ","type":"ETM","position":305,"weight":0.0587679
"id":26,"lemma":"구속","type":"NNG","position":309,"weight":0.185053
"id":27,"lemma":"영장","type":"NNG","position":315,"weight":0.45448
"id":28,"lemma":"을","type":"JKO","position":321,"weight":0.165356
"id":29,"lemma":"청구","type":"NNG","position":325,"weight":0.18841
"id":30,"lemma":"하","type":"XSV","position":331,"weight":0.072845
"id":31,"lemma":"었","type":"EP","position":331,"weight":0.072845
"id":32,"lemma":"다","type":"EF","position":334,"weight":0.185878
"id":33,"lemma":".","type":"SF","position":337,"weight":1}],


[{"id":0,"lemma":"이","type":"NNP","position":338,"weight":0.120916
"id":1,"lemma":"대표","type":"NNG","position":342,"weight":0.243248
"id":2,"lemma":"는","type":"JX","position":348,"weight":0.232732
"id":3,"lemma":"“","type":"SS","position":352,"weight":1
"id":4,"lemma":"배당","type":"NNG","position":355,"weight":0.162451
"id":5,"lemma":"금","type":"XSN","position":361,"weight":0.162451
"id":6,"lemma":"을","type":"JKO","position":364,"weight":0.109121
"id":7,"lemma":"지분","type":"NNG","position":368,"weight":0.0853314
"id":8,"lemma":"아니","type":"VCN","position":375,"weight":0.106739
"id":9,"lemma":"ㄴ","type":"ETM","position":378,"weight":0.105396
"id":10,"lemma":"확정","type":"NNG","position":382,"weight":0.14588
"id":11,"lemma":"액","type":"XSN","position":388,"weight":0.14588
"id":12,"lemma":"으로","type":"JKB","position":391,"weight":0.0916003
"id":13,"lemma":"약정","type":"NNG","position":398,"weight":0.0272529
"id":14,"lemma":"하","type":"XSV","position":404,"weight":0.0272529
"id":15,"lemma":"었","type":"EP","position":404,"weight":0.031932
"id":16,"lemma":"으니","type":"EC","position":407,"weight":0.0716855
"id":17,"lemma":"배임","type":"NNG","position":414,"weight":0.0895955
"id":18,"lemma":"죄","type":"NNG","position":420,"weight":0.0895955
"id":19,"lemma":"이","type":"VCP","position":423,"weight":0.0691364
"id":20,"lemma":"라는","type":"ETM","position":423,"weight":0.0721645
"id":21,"lemma":"검찰","type":"NNG","position":430,"weight":0.113545
"id":22,"lemma":"주장","type":"NNG","position":437,"weight":0.166298
"id":23,"lemma":"대로","type":"JX","position":443,"weight":0.0351678
"id":24,"lemma":"이","type":"VCP","position":449,"weight":0.0430531
"id":25,"lemma":"면","type":"EC","position":449,"weight":0.0430531
"id":26,"lemma":"부동","type":"NNG","position":453,"weight":0.269639
"id":27,"lemma":"산","type":"NNG","position":459,"weight":0.269639
"id":28,"lemma":"경기","type":"NNG","position":463,"weight":0.0972044
"id":29,"lemma":"호전시","type":"NNG","position":470,"weight":0.0345945
"id":30,"lemma":"는","type":"JX","position":479,"weight":0.0957788
"id":31,"lemma":"유죄","type":"NNG","position":483,"weight":0.0783701
"id":32,"lemma":",","type":"SP","position":489,"weight":1
"id":33,"lemma":"악화","type":"NNG","position":491,"weight":0.082012
"id":34,"lemma":"시","type":"NNG","position":497,"weight":0.0163388
"id":35,"lemma":"는","type":"JX","position":500,"weight":0.0818221
"id":36,"lemma":"무죄","type":"NNG","position":504,"weight":0.0686834
"id":37,"lemma":"”","type":"SS","position":510,"weight":1
"id":38,"lemma":"이","type":"VCP","position":513,"weight":0.0417878
"id":39,"lemma":"라며","type":"EC","position":513,"weight":0.053112
"id":40,"lemma":"“","type":"SS","position":520,"weight":1
"id":41,"lemma":"확정","type":"NNG","position":523,"weight":0.102369
"id":42,"lemma":"액","type":"XSN","position":529,"weight":0.102369
"id":43,"lemma":"아니","type":"VCN","position":533,"weight":0.10683
"id":44,"lemma":"ㄴ","type":"ETM","position":536,"weight":0.104989
"id":45,"lemma":"지분","type":"NNG","position":540,"weight":0.0809752
"id":46,"lemma":"으로","type":"JKB","position":546,"weight":0.0915119
"id":47,"lemma":"약정","type":"NNG","position":553,"weight":0.0630562
"id":48,"lemma":"하","type":"XSV","position":559,"weight":0.0362
"id":49,"lemma":"면","type":"EC","position":562,"weight":0.119442
"id":50,"lemma":"반대","type":"NNG","position":566,"weight":0.143537
"id":51,"lemma":"로","type":"JKB","position":572,"weight":0.1009
"id":52,"lemma":",","type":"SP","position":575,"weight":1
"id":53,"lemma":"경기","type":"NNG","position":577,"weight":0.0734365
"id":54,"lemma":"악화","type":"NNG","position":584,"weight":0.0709956
"id":55,"lemma":"시","type":"NNB","position":590,"weight":0.0255226
"id":56,"lemma":"에","type":"JKB","position":593,"weight":0.102073
"id":57,"lemma":"배임","type":"NNG","position":597,"weight":0.097553
"id":58,"lemma":"이","type":"JKC","position":603,"weight":0.0703955
"id":59,"lemma":"되","type":"VV","position":607,"weight":0.1401
"id":60,"lemma":"ㄴ다","type":"EF","position":607,"weight":0.134716
"id":61,"lemma":"”","type":"SS","position":613,"weight":1
"id":62,"lemma":"고","type":"JKQ","position":616,"weight":0.139868
"id":63,"lemma":"주장","type":"NNG","position":620,"weight":0.105959
"id":64,"lemma":"하","type":"XSV","position":626,"weight":0.0678788
"id":65,"lemma":"었","type":"EP","position":626,"weight":0.0678788
"id":66,"lemma":"다","type":"EF","position":629,"weight":0.175514
"id":67,"lemma":".","type":"SF","position":632,"weight":1}]]

부정확하다는 평가도 있었지만, 19년도 평가고 지금은 잘 비교적 잘 분석되는 것 같다.
이 정도 성능이면 실사용이 가능할 것으로 보인다.

profile
천재가 되어버린 박제를 아시오?

0개의 댓글