[빅데이터 python] 형태소 분석기 만들기 – 2. MorphemeParser 클래스 만들기

안녕하세요. 언제나휴일입니다.

이번에는 형태소 분석기 클래스(MorphemeParser)를 정의합시다.

형태소 분석기는 소스 내용을 형태소 별로 구분하는 부분과 같은 형태소를 하나로 합치는 부분으로 구성할 거예요.

1. 사용할 라이브러리 포함

형태소를 나타낸 Morpheme 클래스를 사용합니다.

문자열 내용 중에 태그나 Html 특수 문자, 심볼 등을 없애기 위해 EHHelper도 사용합니다.

from Morpheme import Morpheme 
from EHHelper import EHHelper

2. Merge – 같은 형태소를 하나로 합치는 메서드

입력인자로 원본 컬렉션을 전달받습니다.

class MorphemeParser:
    @staticmethod
    def Merge(morphes):

병합할 컬렉션을 생성합니다.

        remoes = list()#병합한 형태소를 보관할 컬렉션

원본 컬렉션에 있는 각각의 형태소에 대해 병합할 컬렉션에 이미 있는지 판별하는 작업을 반복합니다.

        for morph in morphes:#원본 컬렉션에 있는 각각의 형태소를

일단 없다고 flag를 False로 설정합니다.

            rcnt = len(remoes)#병합한 컬렉션에 형태소 개수 구하기
            flag = False #morph와 같은 단어가 remoes에 없다고 가정

병합할 컬렉션에 각 형태소와 비교하여 같은 것이 있다면 병합하고 falg를 True로 지정하고 for문을 탈출합니다.

            for index in range(0,rcnt):
                if remoes[index].word == morph.word:
                    remoes[index].Merge(morph)
                    flag = True#병합하였음을 마킹
                    break

병합할 컬렉션에 있는지 확인하는 for문이 끝나면 flag 값을 확인합니다.

만약 flag가 False라면 병합할 컬렉션에 없는 것이므로 추가합니다.

            if flag == False:#morph와 같은 단어는 remoes에 없음
                remoes.append(morph)

원본 컬렉션에 모든 형태소를 판별하는 for문이 끝났다면 모든 작업이 끝난 것입니다.

병합한 컬렉션을 반환합니다.

        return remoes

3. Parse – 분석 메서드

입력 인자로 원본 문자열을 받습니다.

    @staticmethod
    def Parse(src):

분석한 결과를 반환할 컬렉션을 생성합니다.

        morphes = list()

원본 문자열에 태그 및 특수 기호를 제거하고 공백 기준으로 분리합니다.

        src = EHHelper.EmitTagAndSpecialCh(src)
        msrc = src.split(' ')

분리한 각 원소가 알파벳으로 구성된 것이라면 형태소 컬렉션에 추가합니다.

        for elem in msrc:
            if str.isalpha(elem):
                morphes.append(Morpheme(elem))

같은 형태소를 포함하고 있다면 병합 작업을 수행합니다.

분석한 형태소 컬렉션을 반환합니다.

        morphes = MorphemeParser.Merge(morphes)
        return morphes

4. 전체 코드

#MorphemeParser.py - 형태소 분석기
from Morpheme import Morpheme
from EHHelper import EHHelper
class MorphemeParser:
    @staticmethod
    def Merge(morphes):
        remoes = list()#병합한 형태소를 보관할 컬렉션
        for morph in morphes:#원본 컬렉션에 있는 각각의 형태소를
            rcnt = len(remoes)#병합한 컬렉션에 형태소 개수 구하기
            flag = False #morph와 같은 단어가 remoes에 없다고 가정
            #morph가 remoes컬렉션에 있다면 병합
            for index in range(0,rcnt):
                if remoes[index].word == morph.word:
                    remoes[index].Merge(morph)
                    flag = True#병합하였음을 마킹
                    break            
            if flag == False:#morph와 같은 단어는 remoes에 없음
                remoes.append(morph)
        return remoes
    @staticmethod
    def Parse(src):
        morphes = list() 
        #원본 문자열에 특수 기호를 제거 및 공백 기준으로 분리
        src = EHHelper.EmitTagAndSpecialCh(src)
        msrc = src.split(' ')
        #각 단어를 형태소 컬렉션에 추가
        for elem in msrc:
            if str.isalpha(elem):
                morphes.append(Morpheme(elem))
        #중복 형태소를 합치는 공정
        morphes = MorphemeParser.Merge(morphes)
        return morphes