반응형

 

/*******************************************************************************************************************
-- 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[:1in nvjr]
 
    print("nvars:",nvars)
 
    # -- lemmatizing
    lemmatizer = WordNetLemmatizer()
    return [lemmatizer.lemmatize(nvar[0], pos=nvar[1]) + '/' + nvar[1for 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[0if selTitle != None else exit("조회 실패. '%s'에 해당하는 데이터를 찾을 수 없습니다." %seq)    # seq가 잘못되었을 경우 예외처리
cs


■ Script Files

 

Title_Mopher.zip
다운로드

 

 

반응형

+ Recent posts