Closed jinmang2 closed 2 years ago
RetrievalBase의 get_relevant_doc
메서드를
class RetrievalBase(FaissMixin, PandasMixin):
def get_relevant_doc(self, query: str, k: int, use_faiss: bool = False) -> Tuple[List, List]:
"""
입력 query에 관련이 있는 상위 k의 document를 검색
Arguments:
quert (str):
하나의 Query를 받음
k (int):
상위 몇 개의 pasaage를 반환할지 결정
Returns:
document score (List):
입력 query에 대한 topk document 유사도
document indices (List):
입력 query에 대한 topk document 인덱스
"""
query_emb = self.get_query_embedding(query)
doc_scores, doc_indices = self.get_topk_similarity(query_emb, k, use_faiss)
return doc_scores, doc_indices
@abstractmethod
def get_query_embedding(self, query):
pass
@abstractmethod
def get_topk_similarity(self, query_emb, k, use_faiss):
pass
SparseRetrieval의 get_relevant_doc_bulk
의 배치화 방식이 비효율적인 것 같아서 numpy의 partition으로 재구현했습니다.
저희의 코드에서는 SparseRetrieval
의 get_topk_similarity
메서드에 구현할 예정입니다.
SparseRetrieval 구현완료!
unittest 코드 작성 시도
original command
python retrieval.py \
--dataset_name ./data/aistage-mrc/train_dataset \
--data_path ./data/aistage-mrc \
--model_name_or_path bert-base-multilingual-cased \
--context_path wikipedia_documents.json
new command
python unittest/test_retrieve.py unittest/configs/test_retrieve.yaml
original results
[query exhaustive search] done in 43.945 s
Top-1 passage with score 0.198994
국회에 관해 규정하는 헌법 제4장의 첫 조문이다.
...
[get_relevant_doc] done in 16.390 s
Top-1 passage with score 0.1990
국회에 관해 규정하는 헌법 제4장의 첫 조문이다.
...
위에 부분이 method 명을 get_topk_similarity_with_faiss
로 바꿨었는데 반영이 안되어있다. 다음 commit에서 수정해야겠다.
주말 간 구현에 참고한 링크들
엘라스틱 관련
index_config = {
'settings':{
'analysis':{
'analyzer':{
'my_analyzer':{
"type": "custom",
'tokenizer':'nori_tokenizer',
'decompound_mode':'mixed',
'stopwords':'_korean_',
'synonyms':'_korean_',
# filtering
"filter": [
"lowercase", #영문 소문자로 변경
"my_stop_filter", #사용자가 설정한 filter
"nori_readingform", #한자 음독 변환
"cjk_bigram", #chinese-japaness-korean
"decimal_digit" #아라비아 숫자 외에 문자를 전부 아라비아 숫자로 변경
]
},
},
'filter':{
"my_stop_filter": {
"type" : "stop",
"stopwords_path" : "user_dic/my_stop_dic.txt"
}
}
},
# 파라미터 값 관련 참조(https://www.elastic.co/guide/en/elasticsearch/reference/7.15/index-modules-similarity.html#dfr)
'similarity':{
# setting ranking functions
'my_bm25_similarity':{
'type':'BM25',
'b':0.75, #[0.3 ~ 0.8]
'k1': 1.2 #[1.2 ~ 2.0]
},
'my_dfr_similarity':{
'type':'DFR',
"basic_model":"g", #[g, if, in, ine]
"after_effect": "l", #[b, l]
"normalization": "h2", #[no, h1, h2, h3, z]
"normalization.h2.c": 3.0 #[1.0 ~ 3.0]
},
'my_dfi_similarity':{
'type':'DFI',
"independence_measure":"standardized", #[standardized, saturated, chisquared]
},
'my_ib_similarity':{
'type':'IB',
"distribution":"ll", #[ll, spl]
"lambda": "df", #[df, ttf]
"normalization": "h2", #[no, h1, h2, h3, z]
},
# LM Dirichlet
'my_lmd_similarity':{
'type':'LMDirichlet',
"mu":2000 #단어 빈도 관련 페널티
},
#LM Jelinek Mercer
'my_lmjm_similarity':{
'type':'LMJelinekMercer',
"lambda":0.1 #[0.1(short text) ~ 0.7(long text)]
}
}
},
'mappings':{
'properties':{
'document_text':{
'type':'text',
'analyzer':'my_analyzer',
'similarity':'my_bm25_similarity',
},
}
}
}
Elastic Search 개발 노트 추가
개발 노트 추가 TODO: BM25 파일 저장 에러 확인
Special Mission 3에서 언급된
SparseRetrieval
와DenseRetrieval
객체를 추상화시켜서 확장성있는 코드로 개발.제공된 retrieval.py에는 boilerplate가 너무 많습니다. 이를 추상화시켜서 나중에 새로운 Retrieval를 추가해도 동작하도록 개발합니다.