👨🏻‍🏫IT 활동/인공지능교육 - NLP

[NLP] Day 15 - Lexicon

728x90
반응형

Lexicon

문서표현, Lexicon dictonary의 token이 해당문서에 있으면 1, 없으면 0으로 표현된 리스트

In [1]:
from konlpy.corpus import kobill

def getLexicon():
    lexicon = list()
    
    for docName in kobill.fileids():
        document = kobill.open(docName).read()
        
        for token in document.split():
            if token not in lexicon:
                lexicon.append(token)
                
    return lexicon
In [2]:
%timeit getLexicon()
108 ms ± 1.4 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [3]:
def getLexiconBySet():
    lexicon = list()
    
    for docName in kobill.fileids():
        document = kobill.open(docName).read()
        
        for token in document.split():
            lexicon.append(token)
            
    return list(set(lexicon))
        
In [4]:
lexicon = getLexiconBySet()
In [5]:
def getDocRepr(lexicon):
    docList = list() # 문서목록
    docRepr = list() # 문서표현 of BOW의 집합 => 문서갯수만큼
    
    for docName in kobill.fileids(): # 문서 한개 열고
        document = kobill.open(docName).read()
        
        docList.append(docName) # 문서목록에 추가
        docVector = list(0 for _ in range(len(lexicon)))
        # 문서표현(BOW) = [0] * 단어의 갯수(|Lexicon|)
        
        for token in document.split(): # 문서내 단어
            if token in lexicon: # 사전에 있는지
                docVector[lexicon.index(token)] = 1
                # 사전에 있으면, 사전의 단어 위치(index)에 1
                
        docRepr.append(docVector) # 문서 Vector Append
                
    return docList, docRepr
In [6]:
def getDocReprByDict(lexicon):
    docRepr = dict()
    # key = 문서
    # value = BOW => list X, dict
    
    for docName in kobill.fileids():
        document = kobill.open(docName).read()
        
        docRepr[docName] = dict()
        
        for token in document.split(): 
            if token in lexicon: 
                docRepr[docName][lexicon.index(token)] = 1
    
    return docRepr
In [9]:
%timeit getDocReprByDict(lexicon)
341 ms ± 8.33 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [10]:
docRepr = getDocReprByDict(lexicon)
In [12]:
docRepr['1809890.txt'][23], lexicon[23]
Out[12]:
(1, '작성하면')
In [13]:
from collections import defaultdict

def getDocReprByDefaultDict(lexicon):
    docRepr = defaultdict(lambda: defaultdict(int))
    
    for docName in kobill.fileids():
        document = kobill.open(docName).read()
 
        for token in document.split(): 
            docRepr[docName][token] = 1
    
    return docRepr
In [14]:
docRepr = getDocReprByDefaultDict(lexicon)
In [15]:
docRepr['1809890.txt']
Out[15]:
defaultdict(int,
            {'지방공무원법': 1,
             '일부개정법률안': 1,
             '(정의화의원': 1,
             '대표발의': 1,
             ')': 1,
             '의': 1,
             '안': 1,
             '번': 1,
             '호': 1,
             '9890': 1,
             '발의연월일': 1,
             ':': 1,
             '2010.': 1,
             '11.': 1,
             '12.': 1,
             '발': 1,
             '자': 1,
             '정의화․이명수․김을동': 1,
             '이사철․여상규․안규백': 1,
             '황영철․박영아․김정훈': 1,
             '김학송': 1,
             '의원(10인)': 1,
             '제안이유': 1,
             '및': 1,
             '주요내용': 1,
             '초등학교': 1,
             '저학년의': 1,
             '경우에도': 1,
             '부모의': 1,
             '따뜻한': 1,
             '사랑과': 1,
             '보살핌이': 1,
             '필요': 1,
             '한': 1,
             '나이이나,': 1,
             '현재': 1,
             '공무원이': 1,
             '자녀를': 1,
             '양육하기': 1,
             '위하여': 1,
             '육아휴직을': 1,
             '할': 1,
             '수': 1,
             '있는': 1,
             '자녀의': 1,
             '나이는': 1,
             '만': 1,
             '6세': 1,
             '이하로': 1,
             '되어': 1,
             '있어': 1,
             '저학년인': 1,
             '돌보기': 1,
             '위해서는': 1,
             '해당': 1,
             '부모님은': 1,
             '일자리를': 1,
             '그만': 1,
             '두어야': 1,
             '하고': 1,
             '이는': 1,
             '곧': 1,
             '출산의욕을': 1,
             '저하시키는': 1,
             '문제로': 1,
             '이어질': 1,
             '있을': 1,
             '것임.': 1,
             '따라서': 1,
             '육아휴직이': 1,
             '가능한': 1,
             '연령을': 1,
             '8세': 1,
             '개정하려': 1,
             '는': 1,
             '것임(안': 1,
             '제63조제2항제4호).': 1,
             '-': 1,
             '1': 1,
             '법률': 1,
             '제': 1,
             '일부를': 1,
             '다음과': 1,
             '같이': 1,
             '개정한다.': 1,
             '제63조제2항제4호': 1,
             '중': 1,
             '“만': 1,
             '이하의': 1,
             '취학': 1,
             '전': 1,
             '자녀를”을': 1,
             '이하(취학': 1,
             '중인': 1,
             '경우에는': 1,
             '2학년': 1,
             '이하를': 1,
             '말한다)의': 1,
             '자녀를”': 1,
             '로': 1,
             '한다.': 1,
             '부': 1,
             '칙': 1,
             '이': 1,
             '법은': 1,
             '공포한': 1,
             '날부터': 1,
             '시행한다.': 1,
             '3': 1,
             '신': 1,
             '·구조문대비표': 1,
             '현': 1,
             '행': 1,
             '개': 1,
             '정': 1,
             '제63조(휴직)': 1,
             '①': 1,
             '(생': 1,
             '략)': 1,
             '(현행과': 1,
             '같음)': 1,
             '②': 1,
             '다음': 1,
             '각': 1,
             '호의': 1,
             '어': 1,
             '-------------------------': 1,
             '느': 1,
             '하나에': 1,
             '해당하는': 1,
             '사유로': 1,
             '휴': 1,
             '----------------------------': 1,
             '직을': 1,
             '원하면': 1,
             '임용권자는': 1,
             '휴직': 1,
             '을': 1,
             '명할': 1,
             '있다.': 1,
             '다만,': 1,
             '제4호': 1,
             '-------------.---------------': 1,
             '대통령령으로': 1,
             '하는': 1,
             '특별한': 1,
             '사정이': 1,
             '없으면': 1,
             '명하여야': 1,
             '--------------.': 1,
             '1.': 1,
             '∼': 1,
             '3.': 1,
             '4.': 1,
             '취': 1,
             '경우': 1,
             '학': 1,
             '위하': 1,
             '에는': 1,
             '여': 1,
             '필요하거나': 1,
             '여자공무원이': 1,
             '----------': 1,
             '임신': 1,
             '또는': 1,
             '출산하게': 1,
             '되었을': 1,
             '---------------------------': 1,
             '때': 1,
             '5.⋅6.': 1,
             '③⋅④': 1,
             '--------': 1,
             '5': 1,
             '등': 1,
             '비용추계서': 1,
             '미첨부사유서': 1,
             '재정수반요인': 1,
             '개정안에서': 1,
             '「국가공무원법」': 1,
             '제71조제2항제4호': 1,
             '국가공무원의': 1,
             '육아': 1,
             '가능': 1,
             '만6세': 1,
             '이하에서': 1,
             '만8세': 1,
             '하고,': 1,
             '「지방공': 1,
             '무원법」': 1,
             '지방공무원의': 1,
             '육아휴직': 1,
             '연': 1,
             '령을': 1,
             '「교육공무원법」': 1,
             '제44조제1항': 1,
             '제7조': 1,
             '교육공무원의': 1,
             '「남녀고용평등과': 1,
             '일․가정': 1,
             '양립지원에': 1,
             '관한': 1,
             '법률」': 1,
             '제19조제1항': 1,
             '근로자': 1,
             '자녀연령을': 1,
             '조정함에': 1,
             '따라': 1,
             '추가': 1,
             '재정소요가': 1,
             '예상됨.': 1,
             '2.': 1,
             '미첨부': 1,
             '근거': 1,
             '규정': 1,
             '「의안의': 1,
             '비용추계에': 1,
             '규칙」': 1,
             '제3조제1항': 1,
             '단서': 1,
             '제1호(예상되는': 1,
             '비용이': 1,
             '연평균': 1,
             '10억원': 1,
             '미만': 1,
             '이거나': 1,
             '한시적인': 1,
             '경비로서': 1,
             '총': 1,
             '30억원': 1,
             '미만인': 1,
             '경우)에': 1,
             '해당함.': 1,
             '사유': 1,
             '국가․지방․교육공무원': 1,
             '근로자가': 1,
             '신청할': 1,
             '상향조정함에': 1,
             '예상된다.': 1,
             '동': 1,
             '개정안이': 1,
             '2011년에': 1,
             '시행된다': 1,
             '고': 1,
             '가정한': 1,
             '경우,': 1,
             '2010년': 1,
             '연령이': 1,
             '7세이고': 1,
             '신청': 1,
             '7': 1,
             '8': 1,
             '하지': 1,
             '않은': 1,
             '대상이': 1,
             '된다.': 1,
             '대상연령의': 1,
             '확대됨에': 1,
             '육아휴직신청자의': 1,
             '수가': 1,
             '어느': 1,
             '정도': 1,
             '늘어날': 1,
             '것으로': 1,
             '발생하는': 1,
             '비용은': 1,
             '현행법에': 1,
             '따르면': 1,
             '월50만원': 1,
             '이나': 1,
             '관련법령': 1,
             '개정이': 1,
             '추진되고': 1,
             '있으며,': 1,
             '이에': 1,
             '2011년에는': 1,
             '육아휴직자가': 1,
             '지급받는': 1,
             '월급여액에': 1,
             '비례하여': 1,
             '육아휴직급여가': 1,
             '지급되': 1,
             '기': 1,
             '때문에': 1,
             '법령개정을': 1,
             '가정하고': 1,
             '추계한다.': 1,
             '이러한': 1,
             '육아휴직급여': 1,
             '액은': 1,
             '월급여의': 1,
             '40%에': 1,
             '해당한다.': 1,
             '발생한': 1,
             '대체인력': 1,
             '고용인건비와': 1,
             '받는': 1,
             '월급여액의': 1,
             '40%이다.': 1,
             '이와': 1,
             '대비하여': 1,
             '육아휴직자에게': 1,
             '지급하던': 1,
             '임금은': 1,
             '더': 1,
             '이상': 1,
             '발생하지': 1,
             '않는다.': 1,
             '실제': 1,
             '순비용은': 1,
             '육': 1,
             '아휴직자에게': 1,
             '월': 1,
             '급여액과': 1,
             '연령': 1,
             '확대에': 1,
             '비용': 1,
             '인': 1,
             '받던': 1,
             '40%와': 1,
             '고용인건비의': 1,
             '차': 1,
             '액인데': 1,
             '값이': 1,
             '0보다': 1,
             '크면': 1,
             '재정소요는': 1,
             '않는다고': 1,
             '볼': 1,
             '추가비용': 1,
             '발생여부를': 1,
             '정확하게': 1,
             '알아보기': 1,
             '비용에': 1,
             '대한': 1,
             '수리모': 1,
             '델을': 1,
             '만들고': 1,
             '비용발생': 1,
             '여부를': 1,
             '알아보기로': 1,
             '하자.': 1,
             '모델에': 1,
             '사': 1,
             '용되는': 1,
             '변수를': 1,
             '정의한다.': 1,
             '발생비용': 1,
             'N×p×X': 1,
             '+': 1,
             'N×육아휴직급여액': 1,
             'N×P': 1,
             'N': 1,
             'P': 1,
             '육아휴직대상자의': 1,
             '월급여액': 1,
             'p': 1,
             'X': 1,
             '대체': 1,
             '고용할': 1,
             '확률': 1,
             '고용한': 1,
             '인력에게': 1,
             '지급하는': 1,
             '위의': 1,
             '수식에서': 1,
             '육아휴직급여액은': 1,
             '육아휴직자': 1,
             '40%까지': 1,
             '지': 1,
             '급할': 1,
             '예정이므로': 1,
             'P×40%이다.': 1,
             'p는': 1,
             '고용노동부의': 1,
             '관련': 1,
             '자료를': 1,
             '이용': 1,
             '고용노동부에': 1,
             '2011년의': 1,
             '대상자는': 1,
             '40,923명이며,': 1,
             '육아휴직에': 1,
             '따른': 1,
             '고용': 1,
             '예상인원은': 1,
             '2,836명이': 1,
             '다.': 1,
             '2007년부터': 1,
             '2011년까지의': 1,
             '현황을': 1,
             '정리하면': 1,
             '다음의': 1,
             '[표]와': 1,
             '같다.': 1,
             '[표]': 1,
             '수급자의': 1,
             '현황:': 1,
             '2007~2011년': 1,
             '(단위:': 1,
             '명,': 1,
             '%': 1,
             '2007': 1,
             '2008': 1,
             '2009': 1,
             '2010': 1,
             '2011': 1,
             '평균': 1,
             '수급자(A)': 1,
             '21,185': 1,
             '29,145': 1,
             '35,400': 1,
             '41,291': 1,
             '43,899': 1,
             '34,184': 1,
             '채용(B)': 1,
             '796': 1,
             '1,658': 1,
             '1,957': 1,
             '2,396': 1,
             '2,836': 1,
             '1,929': 1,
             '비': 1,
             '율(B/A)': 1,
             '3.8': 1,
             '5.7': 1,
             '5.5': 1,
             '5.8': 1,
             '6.5': 1,
             '5.6': 1,
             '자료:': 1,
             '고용노동부': 1,
             '바탕으로': 1,
             '국회예산정책처': 1,
             '작성': 1,
             '[표]의': 1,
             '자료에': 1,
             'p의': 1,
             '값은': 1,
             '5.6%라고': 1,
             '가정한다.': 1,
             '그리고': 1,
             '발생한다고': 1,
             '가정하여': 1,
             '위': 1,
             '수식을': 1,
             '다시': 1,
             '작성하면': 1,
             '수식과': 1,
             '>': 1,
             '0': 1,
             '(1)': 1,
             '9': 1,
             '10': 1,
             'N×5.6%×X': 1,
             'N×P×40%': 1,
             '0.056×X': 1,
             '0.6P': 1,
             '10.7×P': 1,
             '(2)': 1,
             '(3)': 1,
             '(5)': 1,
             '수식에': 1,
             '급여액을': 1,
             '대입하여': 1,
             '대체고용인력': 1,
             '자에게': 1,
             '추정하여': 1,
             '보자.': 1,
             '200만': 1,
             '원을': 1,
             '받는다고': 1,
             '가정하면,': 1,
             '대체고용인력자에게': 1,
             '급여액의': 1,
             '10.7배에': 1,
             '달하는': 1,
             '21,428,571원': 1,
             '이상을': 1,
             '지급해야': 1,
             '발생한다.': 1,
             '육아휴직자보다': 1,
             '많은': 1,
             '월급여액을': 1,
             '주지는': 1,
             '않을': 1,
             '것이고': 1,
             '10여배': 1,
             '월급을': 1,
             '주지도': 1,
             '것이기': 1,
             '보기': 1,
             '힘들다.': 1,
             '고용확률': 1,
             'p를': 1,
             '20%로': 1,
             '가정하더라도(이': 1,
             '3×P)': 1,
             '200만원': 1,
             '대체인력에게': 1,
             '600만원': 1,
             '행정안전부의': 1,
             '통계자료(행정안전부': 1,
             '통계연감)에서는': 1,
             '아휴직': 1,
             '현황자료를': 1,
             '보여주고': 1,
             '여기서': 1,
             '대체인력을': 1,
             '주로': 1,
             '임용대기자': 1,
             '일용직을': 1,
             '활용하는': 1,
             '보인다.': 1,
             '공무원의': 1,
             '[표]에서': 1,
             '보여주는': 1,
             '일반기업체의': 1,
             '고용확률과': 1,
             '차이는': 1,
             '크지': 1,
             '이상의': 1,
             '논의를': 1,
             '육아휴직기간을': 1,
             '만6에서': 1,
             '만8세로': 1,
             '연장하더라': 1,
             '도': 1,
             '개정에': 1,
             '작성자': 1,
             '법안비용추계1팀': 1,
             '팀': 1,
             '장': 1,
             '문': 1,
             '종': 1,
             '예산분석관': 1,
             '김': 1,
             '태': 1,
             '완': 1,
             '(02-788-4649,': 1,
             'tanzania@assembly.go.kr)': 1,
             '11': 1})
In [16]:
# invertedDocument (역문헌구조, 어휘)
def invertedDocument(DTM):
    TDM = defaultdict(lambda: defaultdict(int))
    
    # Only python => Dictionary | Posting DB
    # Dictionary => term, fp (Hash in memory)
    # Posing => struct(docid, freq, next=fp) (FileDB)
    
    for docName, docVector in DTM.items():  
        for term, freq in docVector.items():
            TDM[term][docName] = freq
            
    return TDM
In [17]:
TDM = invertedDocument(docRepr)
In [18]:
TDM["국회"], TDM["의원"]
Out[18]:
(defaultdict(int, {'1809897.txt': 1, '1809898.txt': 1}),
 defaultdict(int, {'1809896.txt': 1}))
In [19]:
TDM["국회"] or TDM["의원"]
Out[19]:
defaultdict(int, {'1809897.txt': 1, '1809898.txt': 1})
In [ ]:
 


728x90
반응형