이것은 로컬 시스템의 텍스트 파일에 있는 쿼리에 응답하기 위해 Python을 기반으로 하는 파일 검색 엔진의 기본 구현입니다. 우리는 일치하는 문서의 관련성을 평가하기 위해 "tf-idf 용어 가중치"와 "코사인 유사성"을 사용했습니다. tf-idf 계산이 미리 계산되어 검색 속도가 훨씬 빨라집니다. 또한 검색 속도를 높이기 위해 Stemming(Porter Stemmer)이 사용되었습니다. Python의 Tkinter 라이브러리를 사용하는 기본 사용자 인터페이스가 제공됩니다.
python2 createIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
createIndex_tfidf.py는 코퍼스에 대한 tdf-idf 값을 계산하기 위해 한 번만 실행됩니다.
python2 queryIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
이 단계에서는 전체적으로 세 가지 파일이 생성됩니다.
제목색인.dat
이 파일은 말뭉치의 각 문서에 할당된 고유한 docId(문서 ID)를 저장합니다.
테스트인덱스.dat
여기에서 모든 문서에 나타나는 모든 고유 용어(불용어 제외)에 대한 정보를 포함하는 색인 파일(역 색인 데이터 구조라고도 함)이 생성됩니다. 각 문서에는 titleIndex에 저장된 대로 0부터 시작하는 고유 ID가 부여됩니다. dat. 용어에 대한 정보는 다음과 같이 색인 파일에 저장됩니다. term|docID0:pos1,pos2;docID1:pos3,pos4,pos5;…..|tf0,tf1,tf2...|idf 여기서는 tf0,tf1,tf2 docID0,docID1,docID2의 용어 빈도를 각각 나타냅니다. idf는 역 문서 빈도를 나타내고 pos1은 해당 문서에서 용어의 위치를 나타냅니다.
라인.데이트
이 파일은 다양한 문서에서 해당 용어가 나타나는 줄에 대한 정보를 저장합니다. 이 줄 정보는 다음과 같이 표시됩니다. term|docID0:line1,line2;docID1:line3,line4,line5
이러한 파일을 생성하기 전에 문서의 모든 용어가 불용어 목록에서 확인됩니다. 용어가 불용어에 나타나면 건너뛰고 그렇지 않으면 해당 정보가 위 파일에 저장됩니다. 또한 각 용어는 색인에 추가되기 전에 Porter Stemmer에 의해 파생되었습니다.
여기에서는 우선 line.dat,titleIndex.dat 및 testIndex.dat 파일의 모든 정보가 Python의 사전을 사용하여 다시 저장됩니다.
이제 지원되는 다양한 유형의 쿼리는 다음과 같습니다.
One Word Queries(OWQ) 이것은 단일 용어 쿼리이며 출력은 각 문서에 해당 용어가 있는 줄 번호와 함께 요청된 용어를 포함하는 문서 목록입니다.
다중 단어 쿼리(MWQ) MWQ의 입력은 일련의 단어이고 출력은 줄 번호와 함께 쿼리 용어를 포함하는 문서 목록입니다.
구문 쿼리(PQ) PQ의 입력은 다시 일련의 단어이며 일치하는 문서는 지정된 순서로 모든 쿼리 용어를 포함하는 문서입니다.
이제 쿼리가 존재하는 문서 목록을 찾았으므로 순위를 매길 차례입니다. 여기서 사용한 순위 체계는 tf-idf를 기반으로 합니다. Tf-Idf는 문서의 각 용어에 용어 빈도(tf)와 역문서 빈도(idf)를 기반으로 가중치를 할당하는 가중치 체계입니다. 가중치 점수가 높은 용어가 더 중요한 것으로 간주됩니다. 이는 정보 검색에서 가장 널리 사용되는 가중치 체계 중 하나입니다.
용어의 용어 빈도(tf)는 문서마다 다릅니다. 이는 기본적으로 문서 D에서 용어 t의 발생 횟수입니다. 용어가 문서에 더 많이 나타날수록 더 중요해지기 때문에 tf를 매개변수로 선택하는 것이 매우 논리적입니다. 크기가 no와 같은 벡터로 문서를 나타낼 수 있습니다. 문서의 고유 용어 수와 각 값은 해당 문서의 용어 수를 나타냅니다. 공통 벡터 공간에서 문서를 벡터로 표현하는 것을 벡터 공간 모델이라고 하며 이는 정보 검색에 매우 기본입니다. 하지만 여기에는 한 가지 단점이 있습니다. 문서의 크기가 커짐에 따라 용어의 빈도가 증가함에 따라 tf의 가중치도 증가할 것입니다. 따라서 다른 문서와 동일한 정보를 포함하고 여러 번 복사된 문서가 더 중요하게 간주됩니다. 이 단점을 근절하기 위해 벡터의 각 값을 노름으로 나누어 벡터가 단위 벡터가 되도록 하겠습니다.
tf는 모든 용어를 동일하게 중요하게 간주하기 때문에 용어 빈도를 사용하여 문서에서 용어의 가중치를 계산할 수는 없습니다. 그러나 일부 용어는 다른 용어보다 더 드물게 발생하고 더 차별적입니다. 순전히 tf를 순위 측정 기준으로 사용하는 경우 음파와 같은 주제를 검색하면 용어의 빈도가 유일한 매개변수이므로 광파 및 기타 파동이 포함된 많은 문서를 얻게 될 수 있습니다.
이 효과를 완화하기 위해 역 문서 빈도를 사용합니다. 용어의 문서 빈도는 기본적으로 해당 용어를 포함하는 문서의 수입니다. 따라서 용어의 역문서 빈도(idf)는 코퍼스의 문서 수를 용어의 문서 빈도로 나눈 값입니다. 일반적으로 idf의 인수는 상당히 크고 log(idf)를 사용하면 더 나은 결과를 얻을 수 있는 것으로 나타났습니다. 로그는 증가하는 함수이므로 결과를 방해하지 않고 사용할 수 있습니다.
우리는 tf와 idf를 모두 정의했으며 이제 이들을 결합하여 문서 d에서 용어 t의 최종 점수를 생성할 수 있습니다. 문서를 다시 벡터로 표현하겠습니다. 각 항목은 문서에 있는 해당 용어의 tf-idf 가중치입니다. 문서 d에 있는 용어 t의 tf-idf 가중치는 단순히 해당 tf에 idf를 곱한 것입니다.
이제 tf-idf 가중치를 기반으로 각 문서의 벡터를 구축했습니다. 이제 주어진 문서 벡터를 사용하여 질의에 답할 차례입니다. 우선 문서 벡터를 만들었던 것과 유사한 방식으로 쿼리 벡터 자체를 생성합니다. 즉, tf-idf 점수를 기반으로 합니다(쿼리 문서 자체를 고려). 이제 쿼리 벡터가 준비되었으므로 쿼리가 있는 모든 문서를 찾을 것입니다. 이제 쿼리 벡터와 쿼리가 존재하는 문서 벡터의 내적을 취하겠습니다. 내적 이 높을수록 문서 벡터와 쿼리 벡터가 더 비슷해집니다. 이는 문서 벡터와 쿼리 벡터 사이의 각도가 작다는 것을 의미합니다. 쿼리와 문서 사이의 유사성을 찾는 기술을 코사인 유사성이라고 합니다.