이 프로젝트는 원래 소피아 대학의 AI 과정을 위해 고안되었습니다. 실행하는 동안 시간이 부족해서 내가 가진 아이디어를 모두 구현할 수 없었지만 계속 작업할 계획입니다... 그리고 T5 Transformers를 사용하여 질문을 생성하면서 석사 논문의 주제를 선택했습니다. 방해 요소와 함께 쌍으로 대답하십시오 . Question-Generation-Transformers 저장소에서 확인해 보세요.
대상 답변으로 사용되는 식별 키워드에 대한 접근 방식은 RANLP2021 컨퍼런스(퀴즈 및 답변 인식 질문 생성기에 대한 답변 후보 생성)에서 채택되었습니다.
아이디어는 이 복잡한 문제를 더 간단한 단계로 분할하여 텍스트에서 객관식 답변을 생성하는 것입니다.
다른 프로젝트의 Python 패키지와의 충돌을 방지하려면 패키지가 설치될 가상 환경을 만드는 것이 좋습니다. 이를 원하지 않으면 다음 명령을 건너뛰고 요구사항.txt 파일을 직접 설치할 수 있습니다.
가상 환경 만들기:
python -m venv venv
가상 환경에 들어가세요:
윈도우:
. .venvScriptsactivate
리눅스 또는 MacOS
source .venvScriptsactivate
Venv 내부에 ipython을 설치하십시오.
ipython kernel install --user --name=.venv
Venv 내부에 jupyter lab을 설치합니다.
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
무엇이든 하기 전에, 질문이 어떻게 만들어지고, 그 대답이 어떤 단어인지 좀 더 알고 싶었습니다.
나는 Wikipedia 기사에서 생성된 약 100,000개의 질문이 있는 SQuAD 1.0 데이터 세트를 사용했습니다.
데이터 탐색 jupyter 노트북에서 제가 찾은 통찰력에 대해 읽을 수 있습니다.
내 가정은 본문의 단어가 질문에 대한 훌륭한 답변이 될 것이라는 것이었습니다. 내가 해야 할 일은 어떤 단어나 짧은 문구가 답변이 될 만큼 좋은지 결정하는 것뿐이었습니다.
나는 텍스트의 각 단어에 대해 이진 분류를 하기로 결정했습니다. spaCy는 단어 태깅에 정말 도움이 되었습니다.
이진 분류를 위해 전체 데이터 세트를 생성해야 했습니다. SQuAD 데이터세트의 각 질문 단락에서 논스톱 단어를 추출하고 여기에 다음과 같은 몇 가지 기능을 추가했습니다.
그리고 레이블은 isAnswer - 단락에서 추출된 단어가 SQuAD 질문의 답변과 동일하고 동일한 위치에 있는지 여부입니다.
TF-IDF 점수 및 제목과의 코사인 유사성 과 같은 다른 기능도 있으면 좋겠지만 이를 추가할 시간이 없었습니다.
그 외에도 새로운 기능을 만드는 것은 우리의 상상력에 달려 있습니다. 문장의 시작, 중간 또는 끝, 주변 단어에 대한 정보 등이 있을 수 있습니다. 더 많은 기능을 추가하기 전에 있으면 좋을 것입니다. 기능이 유용한지 여부를 평가하는 측정항목입니다.
나는 스팸 필터링 과 유사한 문제를 발견했습니다. 여기서 일반적인 접근 방식은 이메일의 각 단어에 스팸 이메일인지 스팸 이메일이 아닌지 태그를 지정하는 것입니다.
scikit-learn의 Gaussian Naive Bayes 알고리즘을 사용하여 각 단어가 답인지 분류했습니다.
결과는 놀라울 정도로 좋았습니다. 한눈에 알고리즘이 대부분의 단어를 답변으로 분류했습니다. 그렇지 않은 것들은 사실 부적합했습니다.
Naive Bayes 의 멋진 점은 각 단어에 대한 확률을 얻을 수 있다는 것입니다. 데모에서는 가능성이 가장 높은 답변부터 가능성이 가장 낮은 답변까지 단어를 정렬하는 데 이를 사용했습니다.
내가 가졌던 또 다른 가정은 대답의 문장이 쉽게 질문으로 바뀔 수 있다는 것이었습니다. 텍스트의 답변 위치에 공백을 두면 "cloze" 질문이 표시됩니다 (빠진 단어에 대해 공백이 있는 문장).
답: 산소
질문: _____은(는) 기호가 O이고 원자 번호가 8인 화학 원소입니다.
나는 cloze 질문을 더 질문처럼 보이는 문장으로 변환하는 것이 가치가 없다고 결정했지만 텍스트가 한 언어에서 다른 언어로 번역되는 방식과 유사하게 seq2seq 신경망을 사용하여 수행할 수 있다고 상상합니다.
그 부분이 정말 잘 나왔어요.
각 답변에 대해 단어 임베딩 및 코사인 유사성을 사용하여 가장 유사한 단어를 생성합니다.
대부분의 단어는 괜찮으므로 정답으로 착각하기 쉽습니다. 그러나 분명히 적절하지 않은 것들도 있습니다.
오답이 포함된 데이터세트가 없었기 때문에 좀 더 고전적인 접근 방식을 사용했습니다.
답변과 품사 또는 이름이 동일 하지 않은 단어를 제거하고 질문에 더 많은 맥락을 추가했습니다.
객관식 답변이 포함된 데이터 세트를 찾고 더 나은 오답을 생성하기 위한 ML 모델을 만들 수 있는지 확인하고 싶습니다.
데모 프로젝트를 추가한 후 생성된 질문은 바로 강의실에 들어가기에는 적합하지 않지만 나쁘지도 않습니다.
멋진 점은 접근 방식의 단순성 과 모듈성 입니다. 여기서 잘못된 부분( 예: 동사 분류 )을 찾아 수정 사항을 연결할 수 있습니다.
복잡한 신경망을 갖는 것( 해당 주제에 관한 모든 논문이 그러하듯이 )은 특히 우리가 살고 있는 시대에 더 나은 결과를 가져올 것입니다. 하지만 제가 이 접근 방식을 통해 알게 된 가장 큰 장점은 소프트웨어 엔지니어가 소프트웨어 엔지니어링 사고방식을 갖고 AI 분야에 진출하여 의미 있는 결과를 볼 수 있는 관문 과 같다는 것입니다.
나는 이 주제가 매우 흥미롭고 많은 잠재력을 가지고 있다고 생각합니다. 나는 아마 이 분야에서 계속 일할 것 같아요.
저는 데이터 마이닝 석사 과정 에도 등록했고 아마도 비슷한 프로젝트를 수행하게 될 것입니다. 여기에 유용한 내용을 링크하겠습니다.
이미 프로젝트를 마무리하는 데 좀 더 시간을 투자했지만 새로운 사용자 정의 기능으로 쉽게 확장할 수 있는 능력을 갖추면서 AI 분야에 입문하는 방법에 대한 튜토리얼로 좀 더 변형하고 싶습니다.
업데이트 - 29.12.19: 저장소가 꽤 유명해져서 모든 모듈을 결합하고 모든 텍스트에 대한 질문을 생성하는 새 노트북( Demo.ipynb )을 추가했습니다. 나는 다른 노트북을 다시 주문하고 코드를 문서화했습니다(조금 더 나아졌습니다).
업데이트 - 09.03.21: 가상 환경을 실행하기 위한 지침이 포함된 요구사항.txt 파일을 추가하고 ValueError: 피연산자를 모양과 함께 브로드캐스트할 수 없는 버그를 수정했습니다. (230, 121) (83, )
나는 또한 질문 생성이라는 비슷한 주제로 석사 논문 작업을 시작했습니다.
업데이트 - 27.10.21: Question-Generation-Transformers 저장소에 석사 논문 코드를 업로드했습니다. 확인해 보시기를 적극 권장합니다.
또한 분류기를 사용하여 답변 후보를 선택하는 접근 방식이 RANLP2021 컨퍼런스에서 학생 논문으로 승인되었습니다. 여기 종이가 있어요.