/*******************************************************************************************************************
-- Title : [Py3.4] NLTK 및 Stanford POS Tagger를 이용한 MOP 처리
-- Key word : nlp mop nltk stanford pos tagger 자연어 처리 형태소 token tokenize tokenizing pos tagging
lemma lemmatize lemmatizing 빈도수 frequency tokenizing
*******************************************************************************************************************/
■ 내용
- 특허문헌의 Title에 대한 MOP처리
- Tokenizing, POS Tagging, Lemmatizing, Frequency 처리
- 압축 파일을 python.exe가 있는 위치에 설치
- DB문헌에서 Title 추출 → Tokenizing → POS Tagging → Lemmatizing → Frequency 순으로 처리
- Mopher.py에서 NLTK나 Stanford TOS Tagger로 선택
■ Main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#-*- coding:utf8 -*-
import Mopher
from time import time
var_seq = '33666'
print("-"*100)
strt = time()
mop_result = Mopher.fn_get_mop(var_seq) # 단일 결과 생성
print("-"*100)
end = time()
# MOP결과 및 속도 출력
print(mop_result, ', %fsecs'%(end-strt))
|
cs |
■ Mopher.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#-*- coding:utf8 -*-
from Dao import Cls_Select
from NvarFilter_nltk import fn_nvarFilter
# from NvarFilter_stanford import nvarFilter
# -- "DB -> MOP -> 결과" 순서로 처리하는 함수
def fn_get_mop(seq):
getData = Cls_Select() # dao : data access object
rawTitle = getData.fn_select_title(seq) # raw : select문을 날린 결과
if rawTitle == None: # 결과가 없을 시 예외처리
print('조회 실패. SEQ:'+seq)
exit()
else: # 결과가 잘 나오면, "pos tagging -> lemmatize" 순서로 진행
mop = fn_nvarFilter(rawTitle)
return mop
|
cs |
■ NvarFilerter_nltk.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# -*- coding:utf8 -*-
# 관련 패키지 목록. nltk 설치 필요
from nltk.tag import pos_tag
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from collections import defaultdict
from time import time
# -- lemmatize 옵션 처리함수
def fn_nvarFilt(poses, nvar):
'''
:param poses: [('the', 'DT'), ('padding', 'VBG'), .. ]
:param nvar: 'N':명사만 추출, 'J':형용사만 추출, 'NV','NVR' 등 조합가능
:return: ['단어1/품사', '단어2/품사', .. ]
'''
# -- nltk에서 n(명사),v (동사), j(형용사), r(부사) 필터링
nvjr = list(nvar)
print("nltk pos delimiter:",nvjr)
ja = lambda tag: tag if tag != 'j' else 'a'
nvars = [(p0, ja(p1[:1].lower())) for p0, p1 in poses if p1[:1] in nvjr]
print("nvars:",nvars)
# -- lemmatizing
lemmatizer = WordNetLemmatizer()
return [lemmatizer.lemmatize(nvar[0], pos=nvar[1]) + '/' + nvar[1] for nvar in nvars]
# -- "putTitle -> tokenizing -> pos tagging -> lemmatize -> 빈도수 체크" 순으로 진행하는 함수
def fn_nvarFilter(putTitle, options='NVJR'):
'''
:param putTitle: 예시문
:param nvjr: 'N':명사만 추출, 'J':형용사만 추출, 'NV','NVR' 등 조합가능
:return: ['단어1/품사', '단어2/품사', .. ]
'''
# -- tokenizing(소문자처리)
tokens = word_tokenize(putTitle.lower())
print("tokens: ", tokens)
# -- pos tagging with NLTK
poses = pos_tag(tokens)
print("pos_tag: ", poses)
# -- n,v,j,r filter
nltk_res = fn_nvarFilt(poses, options)
print("fn_nvarFilt(nltk_res): ", nltk_res)
# -- 빈도수 체크
nltk_freq = defaultdict(int)
for token in nltk_res:
nltk_freq[token] += 1
print(">>>",token, ">>>",nltk_freq[token])
return nltk_freq
|
cs |
■ Dao.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# -*- coding:utf-8 -*-
import pymssql
class Cls_Select():
SQL_SELECT_TITLE = """
SELECT left(title, 1500) "title"
FROM tempdb.dbo.title WITH (NOLOCK)
WHERE seq = %s;
"""
# -- DB Connection 설정
def __init__(self, host='localhost', id='id', pw='password', dbname='dbname'):
conn = pymssql.connect(host, id, pw, dbname)
self.cur = conn.cursor()
# -- SELECT 조회 설정
def fn_select_title(self, seq):
self.cur.execute(self.SQL_SELECT_TITLE %seq) # SQL 실행
selTitle = self.cur.fetchone()
print("selTitle:",selTitle)
return selTitle[0] if selTitle != None else exit("조회 실패. '%s'에 해당하는 데이터를 찾을 수 없습니다." %seq) # seq가 잘못되었을 경우 예외처리
|
cs |
■ Script Files