용어 | 설명 |
---|---|
기술의 발전 | 데이터베이스 : 엄격한 질의어(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) 가장 높은 산이 어디야?
Brutus
와 Caesar
은 포함하면서 Calpurnia
는 포함하지 않는 작품은?ex) : Brutus
, Caesar
작품에서 Calpurnia
가 있는 작품을 뺀다.
Brutus(110100)
& Caesar(110111)
& NOT Calpurnia(101111)
⇒ 100100
⇒ Antony and Cleopatra
, Hamlet
|
| Information Retrieval Model | Boolean 모델
Vector 모델
Probability 모델 |
| Inverted index | Term T를 포함하고 있는 documents들을 미리 저장해놓는 것.
ex) Caesar
를 포함하고 있는 책들 : 1,2,4,5,6번 |
| Inverted index Struct | Terms → Posting ListI
-1, did
-1, ..., told
-2) 이렇게 나온다.Brutus AND Caesar
Brutus
와 Caesar
의 posting list를 비교같은 값(docID)이 나오면 ADD.
Tirme complextity : O(X+Y) |
| Indexing Time
vs Query Time | Indexing Time : 크롤러가 크롤링하고 인덱싱 할 때의 시간
Query Time : 사용자가 검색(쿼리)하고 결과가 나오는데 까지의 시간 |
| Boolean Retrieval Model | 단어가 있는지 없는지만 판단하는 모델 (regex느낌)
Boolean Query : AND, OR, NOT Operator으로 수행한다.
판례나 특허 등 하나만 있어도 치명적인 곳에서 사용한다.
ex) LIMIT! /3 STATUTE ACTION /S FEDERAL /2 TORT /3 CLAIM
|
| Boolean Query merge | ??????????????????????? |
| | |
| Query Optimization | Document freq가 가장 작은 두개부터 차례대로 AND를 하면 더 빠름
Brutus : 7, Caesar : 8, Calpurnia : 2
(Brutus AND Caesar) AND Calpurnia : 16
(Brutus AND Calpurnia) AND Caesar : 12
OR 연산은 AND연산과 다르게 모두 traverse해야 하므로 먼저 한다.
(madding OR crowd) AND (ignoable OR strife)
**OR size는 최대한 보수적으로 잡자 (**A+B-A∩B → A+B) |
| Query Optimization Practice | Query : (tangerine OR trees) AND (kaleidoscope OR eyes) AND (marmalade OR skies)(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를 매칭함 (몇 단어 안에 나와야 한다)
LIMIT! /3 STATUTE /3 FEDERAL /2 TORT
이런것도 할 수 있음종류
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단계 : sses
→ ss
, ies
→ i
2단계 : ational
→ ate
, tional
→ tion
... 이렇게 각 단계에 맞는 변화가 있어서 순서대로 바꾼다.
(참고로 빈칸 = 지우라는 뜻 ement
→ `` (replacement → replac)) |
| Skip Pointer | 쿼리 시간(response time)을 빠르게 하기 위해 점프해서 AND 연산.
한쪽이 지나치게 높으면 그 갑에 비슷한 값까지 skip을 타고 이동함.
trade-off : 속도 증가 but, pointer를 넣을 메모리가 필요함|
*
| 뭐든지 될 수 있는 카드(조커). |
| query processing
with Wild-card | mon* : mon을 포함하는 모든 단어(forward) = mon≤term<moo
mon : nom을 포함하는 모든 단어(backward) = non>term≥nom
procent : pro와 tnec를 포함 = pro≤term<prp AND tned≥term>tnec
*마지막 처럼 중간에있는 경우, 를 뒤로 보내 premuterms를 하자. |
| Permuterm Index
순열 색인 | 검색하기 전에 query값에 순열을 써서 특별한 모양으로 색인하는것.
hello는 hello$, ello$h, llo$he, lo$hel, o$hell, $hello으로 indexing한다.
$
: term의 끝. hello$이면 뒤에 term X. $hello는 앞에 term이 X.기본principal : *
가 뒤쪽에 있도록 rotation을 계속 돌리자.
X
➡ X$
검색 # X로 시작하고 끝나는 모든 단어X*
➡ $X*
검색 # X로 시작하는 모든 단어.*X
➡ X$*
검색 # *X
→ *X$
→ X$*
: X로 끝나는 모든 단어*X*
➡ X*
검색 # *X*
→ X**
→ X*
: X를 포함하는 모든 단어X*Y
➡ Y$X*
검색X*Y
→ X*Y$
→ Y$X*
: Y로 끝나고 X로 시작하는 모든 단어X*Y*Z
➡ *Y* AND Z$X*
검색X*Y*Z
→ Y*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을 찾아줌
방법 lexicon과 문자 시퀀스 Q가 있을 때, Q에 가까운 lexicon의 word를 반환
가까운의 기준
list(Query)
edit_distance[0][] = list(Query)
edit_distance[correct][query]
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|}$
lord
Bigrams : lo
, or
, rd
threshold = 1
postings
lo
→ alone, lore, sloth
or
→ border, lore, morbid
rd
→ ardent, border, card처리과정
(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. 자음은 다음과 같이 바꾼다.
ex1
• Herman
→ H06505
→ H655
• Hermann
→ H065055
→ H655
ex2
• Beijing
→ B002052
→ B252
• Peking
→ P02052
→ P252
ex3)
• PARKSEYOUNG
→ P0622000052
→ P6252
→ P625
• KIMSEONGROK
→ K0520052602
→ K525262
→ K525
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
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에 저장하자.
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) - 파일 개수만큼 |
| --- | --- |
| --- | --- |