레플리
글 수 282

챗봇에서 유사한 문장 자동인식 방법

조회 수 5148 추천 수 0 2018.04.27 17:42:21


챗봇을 개발할 때 가장 중요한 것 중 하나는 입력된 문장의 의도를 정확하게 판단하는 것입니다. 하지만 미리 정의된 문장에서 조금만 변형이 되면 인식을 못하는 경우가 대부분입니다. 왜 이런 문제가 발생하고 그 해결 방안에는 어떤 것들이 있는지 알아보겠습니다.

 

 

 

문장의 의도 파악

 

kakao.jpg

 

비슷한 문장을 판단할 때 고려해야 할 첫번째 사항은 동사의 변화입니다. 위의 사진처럼 '알려줘'는 인식하지만 '알려주면 좋겠어'처럼 어미가 변하면 이해하지 못합니다.

 

두번째는 동의어의 유무입니다. '아이유 최신곡 뭐야' 같이 유사한 뜻을 가진 단어를 사용했을 때도 같은 의미로 인식할 수 있어야 합니다.

 

세번째는 문장의 구조가 달라졌을 경우입니다. '요즘 나온 아이유의 노래가 뭐니'의 경우 단순히 단어만 바뀐 것이 아니라 형태 자체가 변경되었습니다.

 

 

 

K-001.png

 

이를 해결하기 위해서는 의도에 다양한 문장을 미리 입력하는 수밖에 없습니다. 의도가 몇 개 되지 않는다면 가능하겠지만 종류가 늘어날수록 사람이 해야할 작업량이 급격히 증가합니다. 예를 들어, 100개의 의도가 있고 각각 30개의 문장을 설정한다면 무려 3000개의 문장을 일일이 입력해야 합니다.

 

만약 하나의 문장만 입력해도 사용자가 물어보는 비슷한 질문들의 의도를 자동으로 파악할 수 있다면 어떨까요. 챗봇 빌더에서 이런 기능을 제공한다면 챗봇을 구현하는데 큰 도움이 될 것입니다.

 

 

 

규칙기반으로 유사도 측정

 

비슷한 문장을 판단하는 첫 번째 방법은 형태소분석을 통해 동사의 어간만 비교를 하는 것입니다. 다음과 같이 '알리'만 일치하면 같은 의미로 처리할 수 있습니다. 

 

알려줘 : 알리+어+주+어

알려줄래 : 알리+어+주+ㄹ래

알려주면 좋겠어 : 알리+어+주+면+좋+겠+어

 

 

 

하지만 어미에 의해 뜻이 바뀌는 경우 문제가 발생할 수 있다는 단점이 있습니다.

 

알려주지마 : 알리+어+주+지+마

알려주기 싫어 : 알리+어+주+기+싫+어

 

 

 

그리고 동의어 사전을 만들어서 유사한 의미를 갖는 단어인지 검사를 합니다. 하지만 이런 동의어 사전을 구하기가 쉽지 않고, 챗봇에서는 보다 넓은 범위로 판단을 하기 때문에 별도의 작업이 필요할 것 같습니다.

 

[동의어] : 알리, 뭐, 말, ...

알려줘 : 알리+어+주+어

뭐야 : 뭐+야

말해줘 : 말+하+아+주+어

 

 

 

또 하나의 단점은 이런 방법으로는 문장의 구조가 완전히 다른 경우 올바르게 판별하기 어렵다는 것입니다. 역시 규칙기반 보다는 딥러닝으로 스스로 학습하는 방식이 더 적합하지 않을까 생각합니다.

 

 

 

RNN으로 유사도 측정

 

K-002.png

 

딥러닝의 RNN을 사용하여 문장의 유사도를 측정할 수 있습니다. Seq2Seq는 2개의 RNN을 연결하여 텍스트를 생성하는 모델입니다. 입력과 출력이 같은 문장이 되도록 학습을 시키면 인코더의 출력인 벡터는 문장을 압축한 정보를 나타냅니다. 이 값의 코사인 유사도를 측정하여 두 문장이 얼마나 비슷한지 판별합니다.

 

하지만 '아이유 최신곡 알려줘'와 '요즘 나온 아이유의 노래가 뭐니' 처럼 문장의 구조가 다른 경우에는 성능이 좋지 않다는 문제가 있습니다. 그렇기 때문에 실제로 챗봇에 적용하기는 어려울 것 같습니다.

 

 

 

< 참고 자료 >

RNN을 이용한 한국어 문장 간 구문 유사도 측정

 

 

 

Siamese Network로 유사도 측정

 

lstm.jpg

Siamese Network는 샴쌍둥이처럼 두 개의 동일한 RNN을 사용합니다. 동시에 두 문장을 입력으로 받아 '일치/불일치'를 결정하도록 학습합니다. 그렇기 때문에 서로 다른 구조의 문장도 유사하다는 것을 정확히 판단할 수 있습니다.

 

 

 

lstm2.jpg

 

단어 기반이 아니라 위와 같이 캐릭터 문자 기반으로도 네트워크를 구성할 수 있습니다.

 

 

 

< 참고 자료 >

- https://github.com/dhwajraj/deep-siamese-text-similarity

Siamese Recurrent Architectures for Learning Sentence Similarity

Learning Text Similarity with Siamese Recurrent Networks

 

 

 

정리

 

제가 사용해본 챗봇 빌더 중에서는 이런 기능을 지원하는 곳이 아직 없었습니다. 하지만 앞으로 유사도를 자동으로 처리해주는 플랫폼이 곧 나오지 않을까 생각됩니다. 만약 그게 가능하다면 다른 제품과의 경쟁에서 상당히 유리해 질 수 있습니다. 

 

하지만 문제는 딥러닝으로 학습을 하기 위한 데이터가 필요하다는 것입니다. 두 문장이 일치하는지 레이블이 되어 있는 데이터를 사람이 직접 작성을 해야합니다. 페이페이 리가 방대한 사진 정보를 담고 있는 ImageNet을 만든 것처럼 문장에 대한 정보를 모아둔 TextNet이 필요할지도 모르겠습니다.

 

 

 

< 챗봇 개발자 모임 >

- 페이스북 그룹에 가입하시면 챗봇에 대한 최신 정보를 쉽게 받으실 수 있습니다.

https://www.facebook.com/groups/ChatbotDevKR/

List of Articles
제목 글쓴이 날짜 조회 수
부적절한 문장을 판단해주는 딥러닝 모델 - Ask Delphi file 깊은바다 2021-11-08 399
문장을 벡터로 변환하는 방법들 깊은바다 2021-09-16 926
네이버의 초거대모델인 HyperCLOVA 논문 file 깊은바다 2021-09-13 556
챗봇의 슬롯 채우기(Slot Filling)와 DST(Dialogue State Tracking) file 깊은바다 2021-08-19 1453
죽은 약혼자를 챗봇으로 살려낸 남자 - Project December 깊은바다 2021-07-27 559
인터넷 검색을 하고 장기기억을 저장하는 페이스북의 챗봇 - Blenderbot 2 file 깊은바다 2021-07-19 653
GPT-3 데모 사이트 - gpt3demo.com 깊은바다 2021-07-13 3701
6B 파라미터의 GPT-J_6B 오픈소스 모델 깊은바다 2021-07-01 3090
GPT-3를 활용하여 주석을 코드로 바꿔주는 GitHub Copilot 깊은바다 2021-06-30 356
구글의 딥러닝 대화 모델 - LaMDA 깊은바다 2021-06-13 587
일상대화 딥러닝 모델들을 쉽게 실행할 수 있는 Openchat 깊은바다 2021-06-01 569
GPT-3를 사용하여 코딩을 하는 MS의 파워FX 깊은바다 2021-06-01 249
텍스트 스타일을 바꾸는 딥러닝 기술 깊은바다 2021-06-01 436
KoGPT2 v2.0 공개 깊은바다 2021-05-03 1589
이루다 같은 챗봇은 어떤 원리로 작동하는 걸까? 깊은바다 2021-04-03 1691