Based on article data(동아일보), a system that receives the draft of the article as input and automatically recommends related articles
- 기자가 CMS(기사 작성 프로그램)에서 기사의 초안을 완성한다
- 기사 초안에 대한 ‘관련 기사 추천’ 기능을 사용한다(필요시 날짜, 기자와 같은 필터링을 설정)
- 서버에서 해당 기사 초안을 받아 ChatGPT 4o를 이용해 일정 분량(700~900자)으로 요약하고 이를 임베딩하여 벡터를 만든다 (필터링용 데이터가 있다면 같이 전송)
- 서버가 VectorDB에 해당 벡터를 Query로 사용하여 관련 기사를 검색한다(필터링용 데이터가 있다면 메타 데이터 필터링을 수행)
- 5개의 관련 기사를 검색하여 해당 기사의 요약문, 기자, 작성일, 링크 등을 CMS에 반환하고 이를 토대로 기자가 ‘관련 기사’를 선정한다
- FastAPI를 이용한 서버 개발(streamlit/main.py) 및 Streamlit을 이용한 데모 페이지 구성(streamlit/app.py)
- Azure Cloud로 개설한 Ubuntu 서버에 Docker를 사용하여 Milvus 컨테이너 구동
- 연관 기사 검색 옵션으로 '지난 7일', '지난 1달', '지난 1년', '지난 3년'을 추가하여 작성된 기사 원고에 맞는 '연관 기사 검색' 기능 구현
- 당시의 화제성 있는 이슈를 다루는 기사의 경우, '지난 7일'처럼 짧은 기간으로 설정하는 것이 검색 및 추천 성능을 높일 것으로 기대
- 과거 사건들과의 연관성을 비교(ex. 이태원 참사, 미연준 금리 변동 등)하는 기사의 경우, '지난 1년', '지난 3년'처럼 비교적 긴 기간으로 설정하는 것이 성능 향상에 도움이 될 것으로 기대
-
crawling.ipynb
- 동아일보 2024년 기사 링크를 기반으로 크롤링하여 id, title, date, content, link로 이루어진 sqlite DB를 구축
- dataset/2024.csv, dataset/2023.csv가 있으면 생략 가능, dataset은 huggingface에서 다운 가능
-
preprocessing.ipynb
- title(기사 제목), content(기사 본문)에 대한 전처리 과정
- 한자 변환(hanja 라이브러리 설치), 특수문자 변환(dataset/2024_norm.csv)
- 이후 Dense Embedding의 성능을 높이기 위해 권장되는 토큰 수에 맞추기 위해 content 450자 기준 split(dataset/*_norm_split.csv)
-
KPF-BERT-NER.ipynb
- 한국언론진흥재단이 개발한 KPFBERT기반의 NER모델을 이용한 기사본문 NER
- 기사 데이터를 기반으로 학습한 KPFBERT이기 때문에 해당 Task에 가장 적합한 모델이라 판단
- Colab에서 진행하였으며, 10만 개 기사(2023
2024.08)를 450자 split한 약 18만개 행의 데이터에 대해 총 34시간 소요(dataset/*_norm_split_ner.csv)
- 한국언론진흥재단이 개발한 KPFBERT기반의 NER모델을 이용한 기사본문 NER
-
Kiwi_customizing.ipynb
- 길이가 짧아 정보성이 부족한 기사(100~150자, 주로 행사 소개 or 간단한 소식 전달 수준)를 제거(dataset/20230101_20240807_norm_split_ner_pruning.csv)
- NER 결과 빈도 분석으로 유효한 어휘 모음 추출(10만개의 기사에서 추출된 NER 300만개, 중복없이 23만개, 빈도수 8미만 제거하여 최종적으로 약 2.5만개)
- NER 기반 유효한 어휘 모음(2.5만개)를 Kiwi 형태소 분석기 사전에 추가하여 Custom 형태소 분석기 제작(model/custom_dict.txt)
-
BM25_model.ipynb
- 기사 본문(2024_norm_split.csv), Custom Kiwi 형태소 분석기를 각각 Corpus, Analyzer로 지정
- Corpus, Analyzer를 이용하여 BM25 모델 생성, 학습(4시간 소요), 저장(model/bm25_model_20230101_20240807.json)
-
milvus_create_insert.ipynb
- Sparse Embedding Model로 5번의 Custom BM25 모델을, Dense Embedding Model로 Upstage/solar-embedding-1-large를 이용
- Docker를 이용하여 Milvus Container를 생성 및 실행하고 'Donga' Collection 생성
- 기사 본문(dataset/20230101_20240807_norm_split_ner_pruning.csv)을 Sparse/Dense Embedding하고 'Donga' Collection에 삽입(3~4시간 소요)
-
vector_search.ipynb
- 구축한 Milvus Collection('Donga')에 HybridSearchRetriever로 vector search 수행(연관 기사 검색)
- 현재 개발한 Hybridsearch 버전(Donga)과 Basic 버전(Donga_800)과의 비교
- 일단, 짧은 질문 형태의 query 기반으로 연관 기사 검색 및 추천을 실행
-
document_input_compare.ipynb