#!/usr/bin/env python # coding: utf-8 # # **NER 사전 만들기** # https://pypi.org/project/mdict-utils/ # 1. **MDX 사전파일을** 활용하여 객체에 구분하기 # # ## **1 Sqlite3 데이터 불러오기** # sqlite3 데이터 불러오기 # In[ ]: # import sqlite3 # import pandas as pd # conn = sqlite3.connect('backup/kordict.db') # resp = conn.execute("SELECT name FROM sqlite_master WHERE type='table';") # tableNames = [name[0] for name in resp] # tableNames # In[ ]: # %%time # df = pd.read_sql_query("SELECT * FROM {}".format(tableNames[1]), conn) # itemIndex = df.entry.values.tolist() # itemData = df.paraphrase.values.tolist() # print(len(itemIndex), itemIndex[:10], df.shape) # df.head() # ## **2 자료 전처리** # 1. regex 를 활용하여 가치있는 **명사내용** 추출하기 # 1. "「1」" 내용은 동일한 개념의 단어를 정리한 것 # 1. sentence 별로 내용의 확인 및 구분이 필요 # # ```html # 대상행동 #

# 대상^행동(代償行動) # 『심리』
자기가 요구하는 바를 얻지 못할 때 그와 비슷한 다른 대상으로 만족을 채우려는 행동. ≒보상 작용 #
「1」ㆍ보상 행동.\r\n' # ``` # In[ ]: # # 색인정보 : 51만개의 단어사전 데이터 # itemIndex = df.entry.values.tolist() # itemData = df.paraphrase.values.tolist() # len(itemIndex), itemIndex[:10] # In[ ]: import pickle with open('../data/nerDict.pk', 'rb') as handle: nerDict = pickle.load(handle) itemIndex = list(nerDict.Text) itemData = list(nerDict.Data) len(itemIndex), len(itemData) # ## **3 HTML 태그 제거 및 본문선별** # 1. **/font** 태그가 제목 이외에, 세부내용에도 포함됩니다. # 1. 때문에 이를 무조건 적용하기엔 문제가 있어서 Tag 구조를 명확하게 파악하기 # 1. 우선 구조에 대한 형태를 몇가지로 확인한 뒤 작업을 진행하기 # # ```python # '(.+?)' # 특정태그 # "<[^>]+>|[^<]+" # html 태그 내부의 한글 추출 # '<.*?>' # 모든 태그 # ``` # In[ ]: search_query = "대리인" num = [no for no, _ in enumerate(itemIndex) if _ == search_query][0] num # In[ ]: item_sample = """대상행동

대상^행동(代償行動) 『심리』
자기가 요구하는 바를 얻지 못할 때 그와 비슷한 다른 대상으로 만족을 채우려는 행동. ≒보상 작용
「1」ㆍ보상 행동.\r\n""" # In[ ]: tempXml = itemData[num] # tempXml = " ".join(tempXml)# .lower() tempXml = item_sample.lower() from bs4 import BeautifulSoup html_source = BeautifulSoup(tempXml, 'html.parser').prettify() html_source # print(html_source) # In[ ]: import re # regex_html = '<.*>' # html 태그내용만 추출 (탐욕적 수량자) regex_html = '<.*?>' # html 태그내용만 추출 (게으른 수량자) regex_text = "<[^>]+>|[^<]+" # html 태그 내부의 한글 추출 regex_font = '(.+?)' # html 추출 : font 태그 내용만 추출 # html 태그의 추출 f_html = re.findall(regex_html, tempXml) # HTML 태그내용 ", ".join(f_html) # In[ ]: # 특정 font 태그 내부의 text 를 추출 f_font = re.findall(regex_font, tempXml) ["{}".format(_) for _ in f_font] [_ for _ in f_font] # In[ ]: # f_font 의 태그를 제거한 나머지 f_txt = [re.sub(regex_html,"", _) for _ in f_font] f_txt # In[ ]: f_full = re.findall(regex_text, tempXml) ", ".join(f_full) # In[ ]: # 「1」', '「2」 개념설명 1, 2 # ¶ 문장의 예시 [_ for _ in f_full if _ not in f_html] # In[ ]: # font 태그 내용을 제거한 나머지 [_ for _ in f_full if _ not in f_html if _ not in f_txt] # In[ ]: result = [] # for _ in itemData: # result += re.findall(regex_html, _) # HTML 태그내용 result = list(set(result)) result_tags = [] # 결과 중 사진포함 내용을 제거한 나머지 regex_img = '' # html 추출 : font 태그 내용만 추출 for _ in result: _ = re.sub(regex_img, "", _) if len(_) > 2: result_tags.append(_.lower()) len(set(result_tags)), sorted(set(result_tags)) # ## **4 분류 작업용 함수 만들기** # 3개의 분류를 활용하여 List 만들기, 이후 대표적인 대상만 남기고 줄이기 # 1. 타이들 # 1. 대분류 # 1. 소분류 1, 2 # In[ ]: search_query = "대리인" num = [no for no, _ in enumerate(itemIndex) if _ == search_query][0] tempXml = itemData[num].lower() tempXml # In[ ]: import re regex_html = '<.*?>' # html 태그내용만 추출 regex_text = "<[^>]+>|[^<]+" # html 태그 내부의 한글 추출 regex_font = '(.+?)' # html 추출 : font 태그 내용만 추출 f_full = re.findall(regex_text, tempXml) f_html = re.findall(regex_html, tempXml) # HTML 태그내용 f_test = [_ for _ in f_full if _ not in f_html] f_test # In[ ]: # (?<=\$) test = "「명사」「1」「동-사」" t_txt = re.compile(r"「[·가-힣]+」") t_txt = re.compile(r"「([·가-힣]+)」") t_num = re.compile(r"「\d+」") t_box = re.compile(r"「.*?」") # t_box = re.compile(r"(?<=\「).*?(?<=\」)$") # t_num.findall(test) # t_txt.findall(test) t_box.findall(test) # In[ ]: search_query = "대리인" num = [no for no, _ in enumerate(itemIndex) if _ == search_query][0] tempXml = itemData[num].lower() tempXml # In[ ]: result, result_len = [], [] for _ in itemData: temp = t_txt.findall(_) temp_num = len(temp) result_len.append(temp_num) if temp_num > 1: result += temp result =list(set(result)) len(result) # ## **4 분류 작업용 함수 만들기 2** # 1. "「.*?」" 를 기준으로 객체들을 구분 분류하기 # 1. 추후 숫자와 개념어를 구분하여 분류 재정의 하기 # In[ ]: # 텍스트 인덱스값 찾기 search_query = "가결" search_query = "대리인" search_query = "서버" num = [no for no, _ in enumerate(itemIndex) if _ == search_query][0] tempXml = itemData[num].lower() tempXml # In[ ]: import re regex_html = '<.*?>' # html 태그내용만 추출 regex_text = "<[^>]+>|[^<]+" # html 태그 내부의 한글 추출 f_txt = [re.sub(regex_html,"", _) for _ in f_font] f_full = re.findall(regex_text, tempXml) t_temp = [_ for _ in f_full if _ not in f_html] t_temp # In[ ]: result = [] for _ in itemData: temp = '' tok = re.compile(r"(「.*」)") for t in tok.findall(_): if len(t) < 10: t = t.replace("「","") temp += ","+ t.replace("」","") result.append(temp) len(result) # In[ ]: result_html = " ".join(list(set(result))) # In[ ]: test = " 테스트 추출" # ## **3 HTML 태그 제거 및 본문선별** # 1. **/font** 태그가 제목 이외에, 세부내용에도 포함됩니다. # 1. 때문에 이를 무조건 적용하기엔 문제가 있어서 Tag 구조를 명확하게 파악하기 # 1. 우선 구조에 대한 형태를 몇가지로 확인한 뒤 작업을 진행하기 # # ```python # '(.+?)' # 특정태그 # '<.*?>' # 모든 태그 # ``` # In[ ]: tokenizer = re.compile("<*h4[^>]*>(.*?)<\s*/\s*h4>/g") # In[ ]: tokenizer.findall('

And more ...

') # In[ ]: re.findall # In[ ]: regex = re.compile("/<(.|\n)*?>/") # In[ ]: regex.finditer("

test

") # In[ ]: idxNo = 12004 itemTemp = itemData[idxNo].lower() toknizer = re.compile('<.*?>') toknizer_class = re.compile('class="[a-zA-Z0-9:;\.\s\(\)\-\,]*"') # re.sub(toknizer, '', itemTemp) re.findall(toknizer, itemTemp)[6] # ## **3 Regex를 활용하여 구분하기** # 본문에 "\" 내용이 많아서 "//text()" 를 사용하면 컬럼갯수가 꼬여버린다 # regex, lxml 을 사용하면 좋겠지만 경우의 수가 많아서 모두 처리하지 않으면 안됨.. # In[ ]: data = itemData[2945] data = data.lower() # html Tag 전처리 data # In[ ]: import re re.findall(r'', data, re.DOTALL) # In[ ]: import re # 강결합으로 정치큰 부분 제거하기 re.sub('
', "",data) # In[ ]: _ = re.sub('
', "",data).split("
") _[0], _[1].replace("\r\n", "") # In[ ]: import re from lxml.html import fromstring def exportMdx(data): data = data.lower() # html Tag 전처리 _ = re.sub('
', "",data).split("
") return fromstring(data).xpath('//font//text()'), (_[0], _[1].replace("\r\n", ""))