1. Selection vs Ranking
1) Selection
- 정확한 분류를 해주는 방법
2) Ranking
- 유사도를 분석하고 일정 수치를 기준으로 Ranking을 만들고 상위에 속한 것을 찾아주는 방법
2. Lexion 데이터 구조
- lexcion => 사전(해시, 테이블) => 단어: 위치, 단어:위치,
- Posting => 문서:빈도:다음위치, 문서:빈도:다음위치, ...
- Local Indexing => Merge(위치를 조정, linked list)
3. TDM의 진화
- TDM으로 구현하면 Document에 들어있는 각각의 단어에 문서가 매칭되어 저장되기 때문에 중복으로 데이터를 저장하게 된다.
- 량이 너무 많아지게 되면 제곱의 형태로 늘어나기 때문에 메모리에 모두 상주하기가 어렵다.
(ex. [안녕: d1, d2, d5, d7], [의자: d3, d4, d5, d6], [용돈: d1, d4, d7] => 각각의 단어에 매칭되는 수만큼 저장되기 때문에 중복이 너무많다.)
- Document: 문서 전체를 리스트 형태로 저장한다.
- Posting: 단어에 매칭되는 문서를 Posting으로 링크드리스트 형태로 묶어 해당 문서의 index를 갖도록 저장한다.
- Lexicon: 각 단어와 단어에 매칭되는 Posting의 시작 주소를 쌍으로 저장한다.
1) Document
- 문서를 담는 역할
2) Posting
- 단어에 해당하는 문서들을 리스트 형태와 같은 구조로 저장(파이썬에서는 포인터가 없기 때문에 idx로 표현)
- 문서1_idx:빈도:다음위치 -> 문서2_idx:빈도:다음위치 -> ... 마지막문서_idx:빈도:마지막 표시(-1)
3) Lexicon
- 단어1:문서 묶음의 시작_idx
- 단어의 묶음을 Lexicon으로 모두 저장해서 가지는
4. 실습
1) 테스트 데이터와 각 구조 변수 생성
collection = [
("Document1", "this is a simple."),
("Document2", "this is another sample."),
("Document3", "this is not a sample."),
]
globalLexicon = dict() # 단어: 위치
globalDocument = list()
globalPosting = list()
globalMaxTF = dict()
globalTotalTF = dict()
2) Posting, Lexicon, Document 만들기
for docName, docContent in collection:
docIdx = len(globalDocument) # 0, 1, 2, 3 처럼 숫자 증가( 즉, Document의 순서가 idx가 됨 )
globalDocument.append(docName) # Document는 그냥 쌓음(name1, name2, name3 ...)
localPosting = dict()
for term in docContent.lower().split(): # 단어를 전체를 뒤져서 Local로 Posting을 위한 데이터를 만듦(단어1:빈도, 단어2:빈도, ...)
if term in localPosting.keys():
localPosting[term] += 1
else:
localPosting[term] = 1
for term, freq in localPosting.items(): # 위에서 만든 Local을 돌면서 Posting, Lexicon을 만듦
if term in globalLexicon.keys():
# termIdx = list(globalLexicon.keys()).index(term)
postingIdx = len(globalPosting) # 순차적으로 증가하는 값
globalPosting.append((docIdx, freq, globalLexicon[term])) # (docIdx:빈도:다음Lexicon위치)
globalLexicon[term] = postingIdx
else:
# termIdx = len(globalLexicon.keys())
postingIdx = len(globalPosting) # 순차적으로 증가하는 값
globalLexicon[term] = postingIdx
globalPosting.append((docIdx, freq, -1)) # 최초가 마지막이기 때문에 -1
'데이터 분석가 역량' 카테고리의 다른 글
Day 18 ] 정보검색 - Vector 공간 (0) | 2019.05.27 |
---|---|
Day 17 ] TF-IDF (0) | 2019.05.24 |
day 16 ] PreProcessing => Lexicon까지 정리 및 실습 (0) | 2019.05.22 |
day 16 ] 전체 과정 정리(막 정리함...) (0) | 2019.05.22 |
day 15 ] 내 데이터로 출력해보기 (0) | 2019.05.21 |