음성 명령을 이해하고 뉴스와 지식 소스를 검색하며 콘텐츠를 요약하고 읽어줍니다.
데모 영상을 확인해 보세요.
Chatbots Magazine은 Chatbots Magazine의 상위 100개 기사에 내 Delbot 기사를 소개했습니다.
python app.py
입력하세요.봇은 여전히 뜨거운 주제입니다. 모두가 그들에 대해 이야기하고 있습니다.
처음부터 하나 만들어 보는 것은 어떨까요? 오늘 우리가 만들 간단한 것은 다음과 같은 질문을 이해하고 답할 것입니다.
우리의 목표는 처음부터 봇을 코딩하고 자연어 처리(NLP)를 사용하는 것입니다.
또한 웹 앱 섹션도 완료하면 봇이 음성 지원 및 웹 기반이 됩니다. 가장 좋은 점은 음성 인식 및 합성을 위해 복잡한 작업을 수행할 필요가 없다는 것입니다. 최신 웹 브라우저에 내장된 기능을 사용할 것입니다.
높은 수준에서 우리는 두 가지 광범위한 유형의 쿼리를 이해할 수 있기를 원합니다. 다음은 흐름도입니다.
우리는 뉴스 를 요청할 수도 있습니다. 예:
Guardian의 Fantastic Beasts에 대한 최신 정보는 무엇입니까?
봇은 요청된 뉴스 소스(아무 것도 지정되지 않은 경우 New York Times)의 API를 쿼리하고 결과를 요약합니다.
[...] 첫 번째 해리포터 영화(2001년 해리포터와 마법사의 돌)와 마지막 영화(2011년 해리포터와 죽음의 성물 2부)를 비교하는 것은 밤비를 저수지의 개들과 비교하는 것과 다소 유사합니다. 우리는 해리가 태어나기 거의 60년 전인 1920년대 뉴욕에서 그를 처음 만났습니다.
(출처: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
지식에 대한 질문을 할 수도 있습니다. 예:
RDF 트리플이란 무엇입니까?
그러면 봇은 다음과 같이 대답합니다.
의미론적 트리플 또는 간단히 트리플은 리소스 설명 프레임워크의 원자 데이터 엔터티입니다.n이 형식을 사용하면 지식을 기계가 읽을 수 있는 방식으로 표현할 수 있습니다. 특히 RDF 트리플의 모든 부분은 고유한 URI를 통해 개별적으로 주소를 지정할 수 있습니다. 예를 들어 위의 두 번째 구문은 RDF에서 http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/로 표시될 수 있습니다. http://example.name#JohnDoe34를 알고 있습니다.
(출처: https://en.wikipedia.org/wiki/Semantic_triple)
입력을 분류하기 위한 간단한 규칙을 정의합니다. 쿼리에 뉴스 또는 최신 단어 중 하나가 포함되어 있으면 뉴스 쿼리 입니다. 그렇지 않으면 지식 쿼리 입니다.
QueryAnalyzer
클래스의 predict
기능은 봇의 주요 진입점입니다. 위의 분류를 수행합니다. 다른 함수를 호출하여
마지막으로 출력과 오류가 있었는지 나타내는 플래그를 반환합니다.
우리는 입력이 다음 형식 중 하나라고 가정합니다.
New York Times 에 스타워즈 에 대한 최신 뉴스가 어떻게 나오나요?
Brexit 에 대한 최신 정보를 읽어보세요.
Guardian 에서 2017년 Marvel Cinematic Universe 영화 에 대한 소식을 알려주세요.
토큰 | 주다 | 나 | 그만큼 | 최신 | 소식 | ~에 | 도널드 | 지우다 | ~에서 | 그만큼 | 새로운 | 요크 | 타임스 | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS | 동사 | 프론 | DET | 조정 | 명사 | ADP | PROPN | PROPN | ADP | DET | PROPN | PROPN | PROPN | PUNC |
꼬리표 | VB | PRP | DT | JJS | NN | 안에 | NNP | NNP | 안에 | DT | NNP | NNP | NNP | . |
위와 같이 구성된 문장에는 패턴이 있습니다. 그리고 전치사가 핵심입니다.
검색 주제는 첫 번째 전치사와 마지막 전치사 사이입니다. 요청한 소스는 마지막 전치사 뒤 끝에 있습니다. 마지막 명사 덩어리가 소스입니다.
두 번째 예와 같이 출처가 명시되지 않은 경우 첫 번째 전치사 이후의 모든 항목이 검색 주제로 간주됩니다.
Adposition은 쉽게 말하면 전치사와 후치사입니다.
영어와 같은 머리 첫 글자 언어에서는 일반적으로 형용사가 명사구 앞에 옵니다. 예를 들어 Marvel Cinematic Universe 의 캐릭터. 구자라트어와 같은 최종 언어에서는 명사구 뒤에 adposition이 나옵니다. 이것은 후치사입니다. 예를 들어 માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો는 단어 단위로 다음과 같이 번역됩니다. 마블 시네마틱 유니버스 캐릭터.
입력에서 소스 와 쿼리를 추출하는 QueryExtractor
클래스에서 get_news_tokens
호출합니다. 내부적으로는 _split_text
호출하여 입력에서 명사 청크, 품사 및 완전히 구문 분석된 텍스트를 추출합니다. 쿼리의 용어를 표제어로 정리합니다.
다음으로 source 를 기반으로 media_aggregator.py의 Aggregator
클래스 중 하나에 대한 쿼리를 사용하여 get_news
함수를 호출합니다. 그러면 뉴스 API에 의해 응답으로 전송된 뉴스 기사 목록이 반환됩니다. 현재 Guardian API와 New York Times API를 지원합니다.
마지막으로 응답 목록에서 첫 번째 항목(기본값)을 선택하고 shorten_news
함수를 사용하여 요약합니다.
우리는 입력이 다음 형식 중 하나라고 가정합니다.
존 디어
잔다르크
도널드 트럼프는 누구 인가 ?
JRR 톨킨은 누구 였나요 ?
주어 술어 객체란 무엇 입니까 ?
입자물리학에 대해 알려 주세요 .
토큰 | 무엇 | ~이다 | 안 | RDF | 삼루타 | ? |
---|---|---|---|---|---|---|
POS | 명사 | 동사 | DET | PROPN | 명사 | PUNC |
꼬리표 | WP | VBZ | DT | NNP | NN | . |
토큰 | 말하다 | 나 | ~에 대한 | 그 | - | 남성 | 그리고 | 그만큼 | 석사 | ~의 | 그만큼 | 우주 | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS | 동사 | 프론 | ADP | 프론 | PUNC | 명사 | CONJ | DET | 명사 | ADP | DET | 명사 | PUNC |
꼬리표 | VB | PRP | 안에 | PRP | 하이프 | NN | CC | DT | NNS | 안에 | DT | NN | . |
조동사를 찾으면 처음 나온 이후의 모든 것을 쿼리로 처리합니다. 따라서 예제 1 에서 쿼리는 RDF 트리플 입니다.
그렇지 않으면 첫 번째 이후의 모든 명사 청크를 쿼리로 처리합니다. 따라서 예 2 에서는 쿼리가 he-man the masters the Universe 입니다.
쿼리를 추출하는 QueryExtractor
클래스에서 get_knowledge_tokens
호출합니다.
이를 get_gkg
함수에 전달합니다. 이 함수는 Wikipedia Python 패키지를 통해 Wikipedia API를 쿼리하고 상위 결과에 대한 5문장 요약을 반환합니다.
NLTK를 사용한 텍스트 요약의 FrequencySummarizer
클래스를 사용했습니다. 또는 sumy를 사용할 수도 있습니다.
re , bs4 , requests , Operator , collections , heapq , string 및 nltk 패키지 외에도 다음을 사용합니다.
spaCy : spaCy 설치 문서에 설명된 대로 설정하세요. spaCy는 우리가 빠른 NLP를 수행하는 데 도움이 될 것입니다. NLTK를 사용할 수도 있지만 spaCy를 사용하면 더 빠르게 진행할 수 있습니다. 이 프로젝트에서는 spaCy를 사용합니다.
Wikipedia : Wikipedia API를 쿼리하는 데 도움이 됩니다. 여기에서 Wikipedia Python 패키지 문서를 읽을 수 있습니다.
요약 : 제가 사용한 것은 JustGlowing이 작성한 The Glowing Python 블로그에서 빌려온 것입니다. 긴 내용을 요약했습니다. 또는 sumy를 사용할 수도 있습니다.
Flask-RESTful, Flask(선택 사항) : 웹 앱을 구축하고 RESTful 웹 서비스를 통해 봇을 운영하기 위한 것입니다.
음성 쿼리를 실행하고 브라우저가 응답 내용을 읽도록 할 수 있는 멋진 웹페이지를 추가합니다. 이를 위해 Web Speech API를 사용합니다.
우리는 Flask 기반 REST 웹 서비스를 20줄 미만의 코드로 실행하고 있습니다. QueryService
클래스는 요청을 처리합니다.
현재로서는 웹 앱에서 봇으로 입력을 보내는 데 서비스 호출이 하나만 필요합니다. 이는 QueryService
클래스의 post
기능을 통해 수행됩니다. post
위에서 언급한 주요 진입점인 predict
함수를 호출합니다.
봇을 시연하기 위해 기본 웹페이지를 만들었습니다. Web Speech API를 사용하여 음성 입력을 받고 콘텐츠를 읽어줍니다. 템플릿 폴더에서 index.html 파일을 찾을 수 있습니다. 웹 사이트를 열기 전에 필요한 모든 패키지와 라이브러리를 설치했는지, 그리고 웹 서비스가 실행 중인지 확인하세요.
우리의 간단한 봇은 제한된 범위의 요청을 이해합니다. 다음과 같은 다른 종류의 요청은 이해할 수 없습니다.
구조가 다른 지식 요청
부트스트랩 집계가 무엇인지 설명해주세요.
컴퓨터 신경과학에 대해 말해 보세요.
구조가 다른 뉴스 요청
New York Times는 Roger Federer의 최근 경기에 대해 뭐라고 말합니까?
테니스계에는 무슨 일이 일어나고 있는 걸까?
다른 유형의 지식 요청
치즈는 어떻게 만들어지나요?
JK 롤링은 어디에서 태어났나요?
금성에 하늘도시를 건설할 수 있을까?
프랑스 혁명은 언제 일어났나요?
목성에 대적점이 있는 이유는 무엇입니까?
후속 질문 및 맥락
부트스트랩 집계가 무엇인지 설명해주세요.
그리고 랜덤 포레스트와 어떤 관련이 있나요?
후속 질문에서 그것이 무엇을 의미하는지 이해하는 것은 아나포라 해결이라고 알려진 것입니다. 그것은 모두 맥락을 이해하는 것의 일부입니다. 다른 단어는 다른 문맥에서 다른 것을 의미합니다. 인간은 이러한 미묘한 차이를 이해하고 있지만 기계에게 이를 가르치는 것은 훨씬 더 어렵습니다.
우리는 우리가 정의한 몇 가지 규칙을 기반으로 봇을 구축한다는 목표를 달성했습니다. 우리는 또한 일부 NLP 기술을 사용했습니다. 마지막으로 봇을 웹 애플리케이션에 배포했습니다. 그러나 우리 봇은 이해하고 답변할 수 있는 쿼리의 종류가 제한되어 있습니다. 이해의 범위가 왜 그렇게 좁습니까?
일반적으로 컴퓨터가 언어를 실제로 이해하도록 만드는 것은 AI가 어려운 문제입니다. NLP에는 이를 전담하는 NLU(Natural Language Understanding)이라는 분야가 있습니다.
우리는 기계 학습 기반 솔루션을 구현하여 봇이 잠재적으로 훨씬 더 광범위한 요청을 이해할 수 있도록 할 수 있습니다.
여기에서 사용되는 API의 이용 약관을 반드시 읽어보시기 바랍니다.