용어 설명
기술의 발전 데이터베이스 : 엄격한 질의어(SQL) ex) MySQL
정보검색 : Document 검색. 자유형식 질의어 ex)Google, Naver
Q/A : 긴 질의어. 짧은 대답. Ranking ex) IBM Watson
대화시스템 : 챗봇. ex) Siri, Alexa, Bixby
data 3V
빅데이터의 3요소 Volume : 데이터의 양이 많아야 함
Variety : 데이터의 종류가 다양해야 함
Velocity : 데이터가 늘어나는 속도가 빨라야 함
ex) 조선왕조실록은 static하기 때문에 빅데이터가 아님.
Information Retrieval
정보검색 집합적인 정보로부터 원하는 내용과 관련이 있는 부분을 얻어내는 행위ex) 음석인식 : 음성으로부터 음절들을 얻어서 텍스트로 변환하는 행위
Information Retrieval’s basic assumption
정보검색의 기본가정 Documents : text의 집합
Collection : documents의 집합

목표 : 질문에 대한 답변(X). 정보 요구에 관련된 Documents 찾아줌(O) ex) 가장 높은 산이 어디야?

ex) : Brutus, Caesar 작품에서 Calpurnia가 있는 작품을 뺀다.

  1. 언어모델 (일반화, stemming)
  2. Indexer (인덱싱 진행) | | Text Processing | Tokenization : 문자들을 단어로 잘라 Token으로 변환 Normalization : text와 query term이 같은 형태를 가지도록 변환 - Depluralization(단수화) : Friends → friend - Case-folding(대소문자) : Roman → roman Stemming : 같은 원형의 파생어들도 함께 매치 (worked, working) Stop words : 너무 많거나 너무 적은 common word(a, the, to, ..)는 제거 | | Indexing | 1. 언어모델을 거치면 (I-1, did-1, ..., told-2) 이렇게 나온다.
  3. Term을 lexical order로 sorting한다.
  4. 같은 Term끼리 모아서 딕셔너리-포스팅으로 만든다. | | Query Inverted Index | Query : Brutus AND Caesar

(46653+316812) AND (107913+271658) AND (87009+213312) → 363,465 ∩ 379,571 ∩ 300,321 (OR은 +연산) → (363,465 ∩ 300,321) ∩ 379,571 (AND는 작은거부터) | | Frequency | term freq : 어떤 word가 어떤 docs에서 몇 번 발생했는가 document freq : 어떤 term이 나타나는 document의 개수 collection freq : 어떤 term이 전체 collection에 나타나는 개수 | | Phrase Query (Advanced searching) | Inverted Index와 다르게 여러개 단어를 매칭시키기 위한 고급 기법. Phrase를 매칭함 (몇 단어 안에 나와야 한다)

종류

synonymy : 동의어 관계 (car=automobile) homonymy : 동음이의어 관계(can: plastic can, be able to) : 의미 다름 polysemy : 다의어 관계 (man: humankind, male) : 의미적으로 유사함 Hyponymy : 하의 관계 (flower-rese) Antomymy : 반의어 관계

정확한 결과가 나오지 않았을 때 유사한 결과라도 출력해주기 위함 ex) Thesauri에 개 검색 BT : 포유류, NT : 골드 리트리버, RT : 고양이 | | soundex | soundex : 발음이 유사한 관계 (Jonson, Jonston) | | Lemmatization 표제어 추출 | Lemma : 표제어(기본 사전형 단어) Lemmatization : 단어들로부터 표제어를 찾아가는 과정 ex) are, am, is의 표제어는 be 표제어가 한정되어있고 고유명사는 아예 표제어가 존재하지 않는다. | | Stemming 형태소 분석 | Indexing을 하기 전에 morpheme(형태소)에서 stem(어간)을 찾는 것. stem : 어간. 활용 시 모습이 변하지 않는 부분. (hunting, hunter → hunt) affix : 접사. prefix + suffix morpheme : 형태소. 뜻을 가진 가장 작은 말의 단위. = prefix + stem + suffix ex) recooked : re(prefix) + cook(stem) + ed(suffix) | | Derivation Inflection Reduction | Derivation(파생) : 접사(affix)가 덧붙어 다른 의미(품사)가 됨 ex) im+possible, possile+ity Inflection(굴절) : 접미사(suffix)에 의한 어휘의 변화. (품사는 안바뀜) ex) be → am/is/was, apple → apples, fast → faster Reduction(삭제) : 접사를 삭제해서 단어의 원형으로 바꿈 | | Stemming work | Crude affix chopping (무자비하게 affix 자르기) : prefix랑 suffix를 다 잘라버림 ex) automate, automatic, automation → automat | | Korean Stemming 한국어 형태소 분석 | 새 봄 → 새(prefix) + 봄(Noun) 새 정치가 → 새(prefix) + 정치(Noun) + 가(suffix) 봄 꽃 → 봄(Compound Noun) + 꽃(Noun) (prefix : 혼자서 단어를 이룰 수 없는 것. Compound Noun : 복합명사) | | Stemming features | recall은 좋은데 precision은 나쁨

ex) 관용적 : (, , , , 에서, ...) → longest suffix를 제거 → 에서 1단계 : ssesss, iesi 2단계 : ationalate, tionaltion ... 이렇게 각 단계에 맞는 변화가 있어서 순서대로 바꾼다. (참고로 빈칸 = 지우라는 뜻 ement → `` (replacement → replac)) | | Skip Pointer | 쿼리 시간(response time)을 빠르게 하기 위해 점프해서 AND 연산. 한쪽이 지나치게 높으면 그 갑에 비슷한 값까지 skip을 타고 이동함. trade-off : 속도 증가 but, pointer를 넣을 메모리가 필요함|

기본principal : * 가 뒤쪽에 있도록 rotation을 계속 돌리자.

  1. XX$ 검색 # X로 시작하고 끝나는 모든 단어
  2. X*$X* 검색 # X로 시작하는 모든 단어.
  3. *XX$* 검색 # *X*X$X$* : X로 끝나는 모든 단어
  4. *X*X* 검색 # *X*X**X* : X를 포함하는 모든 단어
  5. X*YY$X* 검색

X*YX*Y$Y$X* : Y로 끝나고 X로 시작하는 모든 단어

  1. X*Y*Z*Y* AND Z$X* 검색

X*Y*ZY*Z$X*Z$X*Y*Z$X* AND *Y*

: Z로 끝나고 X로 시작하는 모든 단어 중에서 Y가 포함된 단어 Z$X* 한번 찾고 난 뒤에 그 중에서 *Y* 찾자. (Post filtering) | | Permuterm exercise | Query : hel*o Lookup : hel*o$o$hel* 를 검색 | | Bigram(k-gram) Index | K 문자들의 연속으로 집합을 구성함 ex) mon(K=2) ⇒ $m, mo, on, n$ ex) mon*(K=2) ⇒ $m AND mo AND on but moon이나 mormon 같은것도 찾아지는 경우가 있음. | | Processing wild-card queries | 원래 와일드카드는 expensive query execution임. Disjunctions(OR operation) 작업을 해야함 그래서 serach engine이 잘 지원하지 않는다. | | Index lists | 1. Inverted Index : term을 보고 document를 찾아줌 2. Wildcard index : term을 찾아줌

  1. standard lexicon (표준 사전)을 기준으로 (사전 단어, 정확 but 적음)
  2. 인덱싱 corpus의 lexicon을 기준으로 (모든 단어, 부정확 but 많음)

방법 lexicon과 문자 시퀀스 Q가 있을 때, Q에 가까운 lexicon의 word를 반환

가까운의 기준

  1. edit distance (Levenshtein distance)
  2. weighted edit distance
  3. n-gram overlap | | Edit distance | 두 개의 문자열 A, B가 같아지기 위해서 연산을 수행해야하는 횟수 Operation(Insert, Delete, Replace)은 character level에서 이뤄져야함 • dof → dog의 edit distance는 1이다. • cat → act의 edit distance는 2이다. (cat → aat → act) • cat → dog의 edit distance는 3이다. (cat → dat → dot → dog) ⬇ : 삭제, ➡ : 추가, ↘ : 대체(수정) | | Weighted edit distance | OCR인지 Keyboard인지 domain 따라 weight matrix를 작성한다. 키보드의 경우, d랑 f를 헷갈릴 확률이 높기 때문에 계수를 높게 준다. 그리고 d→f replace를 할 때 weight만큼 곱해줌 | | Edit distance Use | 1. Query을 받으면 characters들로 나눈다 list(Query)
  4. preset edit distance에 나열한다. edit_distance[0][] = list(Query)
  5. Correct word와 intersect한다. edit_distance[correct][query]
  6. Suggestion( Do you mean? )

ex) november : nov, ove, vem, emb, mbe, ber december : dec, ece, cem, emb, mbe, ber 겹치는게 많다 == edit distance가 가깝다 | | Jaccard coefficient 자카드 거리 | noverber의 trigram 집합 X : (nov, ove, vem, emb, mbe, ber) december의 trigram 집합 Y : (dec, ece, cem, emb, mbe, ber)

$J\cdot C=\frac{\left| X \cap Y \right|}{\left| X \cup Y \right|}$

처리과정 (alone, border, ardent) JC(”alone”,”border”), JC(”alone”,”ardent”), JC(”border”,”ardent”) → (lore, border, ardent) JC(”lore”,”border”)=3/7, JC(”lore”,”ardent”)=2/8 → (lore, border, border) JC(”lore”,”border”)=3/7, JC(”border”,”border”)=1 | | Context-sensitive spell correction | 1. Query term 중 하나는 틀렸다고 가정, closed한 term을 찾아주자. ex) flew form Heathrow가 다 틀렸다고 하면 경우의 수가 너무 많음 하나만 틀렸다고 가정하고 더하자. flew + form + Heathrow 2. Query term의 closed term을 다 뽑아서 그 중에 Hit 한거만 추천해주자. Hit-based spelling correction courpus : 코퍼스에서 많이 나온걸 맞다고 하자. query log : 사람들이 많이 검색하는게 맞다고 하자. | | | | | Soundex | 1. 첫번째 글자는 남겨둔다. 2. 모든 모음의 count를 0으로 만든다. 3. 자음은 다음과 같이 바꾼다.

  1. 연속된 digit은 지운다.
  2. 결과에서 0이 나오면 다 지운다.
  3. <대문자><숫자><숫자><숫자> 형식이 되도록 남으면 앞에서부터 4개 자르고 부족하면 뒤에 0을 붙이자

ex1 • HermanH06505H655HermannH065055H655

ex2 • BeijingB002052B252PekingP02052P252

ex3) • PARKSEYOUNGP0622000052P6252P625KIMSEONGROKK0520052602K525262K525

high recall 같은 업무 (인터폴)에서 쓰인다. 이름이 특정 국가에 bias되는 경우 | | Process Assemble | 프로세스 기법들을 하이브리드로 사용할 수 있다. • Positional inverted index with skip pointers • Wild-card index • Spell-correction • Soundex ex) (SPELL(moriset) /3 toron*to) OR SOUNDEX(chaikofski) : moriset 스펠링 체크를 하고 toron*to 형식이 3개 word 안에 나오거나 chaikofski와 발음이 비슷한 거를 찾아라. | | | | | seek time, latency and Transfer time | Seek time : 디스크가 track에 있는 data를 찾는 시간 Latency : 디스크가 sector를 찾는 시간 Transfer Time : 전송시간 Access Time(seek time + latency) + Transfer time | | RCV1 Collection | 셰익스피어 작품들 말고 연구용으로 공개된 Collection(set of docs) ex) a, the, wish, wishes, a, the token avg : 그냥 slicing한거 갈아/개수 : (1+3+4+6+1+3)/6 term avg : 언어모델 거친거 길이/개수 : (1+3+4)/3 | | Saving problem | Inverted Indexing 하는 과정은 다음과 같은데, Docs → 토큰화 → 일반화 → Sort → 딕셔너리, 포스팅으로 나누기 여기서, 너무 많은 Docs를 한번에 Sorting 시키려면 문제가 발생. | | BSBI 정렬 기반 블록화 색인 | Blocked sort-based Indexing. Sorting에 최적화된 인덱싱 기법. 최소한의 disk seek을 이용해서 sorting을 구현함. | | BSBI basic idea | **1. record를 memory 안에 들어갈 수 있을 정도로 block으로 나눔 2. posting들을 쌓아서 → sorting하고 → 다시 disk에 넣음 3. 모두 merge함 ***record : (term, docID)

block ← ParseNextBlock() #parsing해서 block에 넣기 BSBI_INVERT(block) # sorted된 block을 생성(메모리 안에서) WriteBlockToDist(block,fn) #block을 disk에 저장함 MergeBlocks(f1,f2,...,fn) #Disk에 저장된 block들을 다시 합침

마지막에 MergeBlock 할 때 priority queue를 써서 각 block에서 A로 시작하는거부터 차례대로 쌓고 B로 시작하는거 차례대로 쌓고... 하는거임 block1 : a, the, want block2 : a, a, th block3 : an, of the, of block4 : an → priority queue : [a,a,an,an] 에서 빠른 순서대로 큐에 넣는 방법 | | SPIMI 단일 패스 메모리 색인 | BSBI는 크기 조정에는 뛰어난데 term-termID hash table이 있어야함 대용량 collection에서 기억장치에 올리기가 적합하지 않음. SPIMI(Single-pass in-memory indexing) : termID 대신 term을 그대로 사용하여 각 block의 dictionary를 disk에 기록하는 방식. | | SPIMI basic idea | 각 block마다 complete inverted index를 생성하고 나중에 합치자. 일단 sorting하지말고 posting을 accumulate한다.

doc1 : a, the, write, an, a doc2 : a, hash, want, wall

  1. Query를 token_stream으로 만든다.
  2. token_stream을 하나씩 iterate하면서 term에 대한 dict를 만든다.
  3. dict에는 term:posting_list가 존재한다.
  4. posting_list가 꽉 차면 linked list로 새로 연결한다.
  5. memory가 가능할 때 까지 반복하다가 꽉 차면 block으로 만든다.
  6. dict를 key값(term)에 대해 sorting한다.
  7. block을 disk에 저장한다. | | | | | Distributed Computing | GRID computing : heterogenous computer (슈퍼 컴퓨터를 엮은 것) Cluster computing : 연산장치를을 묶어서 슈퍼 컴퓨터로 만드는것 commodity : 분산 컴퓨팅을 범용적으로 쓸 수 있게 만든 상품들. 하둡. | | Distributed Indexing 분산 인덱싱 | 사실 인덱싱은 함수형 프로그래밍으로 봐야함 document → parse → pairing(term,docID) → sort() → reduce() | | MapReduce 맵리듀스 | 1. document를 parser에 넣어서 term을 추출한다.
  8. term-docID로 pair를 만든다**(MAP)**
  9. term을 기준으로 sorting한다**(Shuffle)**
  10. 똑같은 term끼리 모으고 docID는 posting list로 만든다**(Reduce)**
  11. 저장한다. | | MapReduce Parellel 맵리듀스 병렬처리 | 맵리듀스는 단어 하나만 보고 독립적으로 진행돼서 병렬처리가 가능함.
  12. term-partitioned : 각 머신들에게 term을 나눠서 줌
  13. document-partitioned : 각 머신들에게 document를 나눠서 줌(most) | | MapReduce exercise | doc1 : C came, C c’ed doc2 : C died

Map → <C,d1>, <came,d1>, <C,d1>, <c’ed,d1>, <C, d2>, <died, d2> Sort and Shuffle → (<C,(d1,d2,d1)>, <came,(d1)>, <c’ed,(d1)>, <died,(d2)>,) Reduce → (<C,(d1:2,d2:1)>, <came,(d1:1)>, <c’ed,(d1:1)>, <dies,(d2:1)>) | | at Exam | Map Function이 word count면? Map → <C,1>, <came,1>, <C,2>, <c’ed,1>, <C, 3>, <died, 1> Reduce → (<C,3>, <came,1>, <c’ed,1>, <dies,1>) Map Function이 Stemming이라면? Map → <C,고유명사>, <came,동사>, ... | | Static indexing | 딕셔너리와 posting list는 항상 바뀐다. static document : 셰익스피어 dynamic document : 웹 문서 | | Dynamic indexing | 1. big **main index(주 인덱스)**는 disk에 유지 2. small **auxiliary index(보조 인덱스)**는 메모리에 유지 Invalidation bit vector : 무효 비트 제거 | | main + auxiliary index | 두 개 동시에 쓰려니까 merge할 때 stiff함. 느림. 메모리에서 쌓다가 꽉 차면 disk에 저장하자.

  1. memory 안에 aux list의 크기를 $z_0$이라고 하자.
  2. 지정크기 n을 초과하면 $i_0$만큼 디스크에 저장.
  3. 근데 $z_0$==$i_0$가 이미 있으면 $z_0$랑 $i_0$를 합쳐서 $i_1$을 만든다.
  4. 근데 $i_1$도 이미 있으면 $z_1$랑 $i_1$를 합쳐서 $i_2$을 만든다.
  5. $i_2$ 다 만들면 저장. $i_1$은 삭제 Binorminal (2배씩 증가하는 수열. 앞에꺼의 2배) 처럼 생겼다.

ex) index i2 i1 i0 1 → 1 : i0 2 → 1 0 : i1 3 → 1 1 : i1,i0 4 → 1 0 0 : i2 5 → 1 0 1 : i2,i0Logarithmic merge Pros | | | merge를 꼭 안해도 된다. (i0가 없으면 걍 거기에 넣으면 됨). main index를 디스크에 하나만 유지하려면 할 때마다 append하면서 merge해줘야함.

index construction time • Aux index, main index : O(T^2) • Logarithmic merge : posting마다 O(logT)라서 전체는 O(TlogT) Query time • Aux index, main index : O(1) • Logarithmic merge : O(logT) - 파일 개수만큼 |

| --- | --- |

Untitled

| --- | --- |