이번 시간에는 형태소 분석기를 제작해 보겠습니다.
형태소 뜻을 다시 집어보면, '어떤 대상 어절을 최소의 의미 단위'라는 뜻합니다.
- 사용할 형태소 분석기 불러오기(import)
- 텍스트 전처리 하기(작업에 따라 다름)
- 형태서 / POS tagging하기
import MeCab
import re
mecab = MeCab.Tagger()
이전에 포스팅 했던 형태소 분석기 코드를 가져오겠습니다.
def mecab_nouns(text):
nouns = []
# 우리가 원하는 TOKEN\tPOS의 형태를 추출하는 정규표현식.
pattern = re.compile(".*\t[A-Z]+")
# 패턴에 맞는 문자열을 추출하여 konlpy의 mecab 결과와 같아지도록 수정.
temp = [tuple(pattern.match(token).group(0).split("\t")) for token in mecab.parse(text).splitlines()[:-1]]
# 추출한 token중에 POS가 명사 분류에 속하는 토큰만 선택.
for token in temp:
if token[1] == "NNG" or token[1] == "NNP" or token[1] == "NNB" or token[1] == "NNBC" or token[1] == "NP" or token[1] == "NR":
nouns.append(token[0])
return nouns
def mecab_morphs(text):
morphs = []
# 우리가 원하는 TOKEN\tPOS의 형태를 추출하는 정규표현식.
pattern = re.compile(".*\t[A-Z]+")
# 패턴에 맞는 문자열을 추출하여 konlpy의 mecab 결과와 같아지도록 수정.
temp = [tuple(pattern.match(token).group(0).split("\t")) for token in mecab.parse(text).splitlines()[:-1]]
# 추출한 token중에 문자열만 선택.
for token in temp:
morphs.append(token[0])
return morphs
def mecab_pos(text):
pos = []
# 우리가 원하는 TOKEN\tPOS의 형태를 추출하는 정규표현식.
pattern = re.compile(".*\t[A-Z]+")
# 패턴에 맞는 문자열을 추출하여 konlpy의 mecab 결과와 같아지도록 수정.
pos = [tuple(pattern.match(token).group(0).split("\t")) for token in mecab.parse(text).splitlines()[:-1]]
return pos
텍스트 정제하는 함수를 만들어 보겠습니다.
텍스트 정제하기 위해서 영어와 특수문자를 제거해야 합니다.
즉, 한국어만 나타나게 만들어야 한다.
def text_cleansing(doc): # 텍스트 정제
# 한국어를 제외한 글자를 제거하는 함수.
doc = re.sub("[^ㄱ-ㅎㅏ-ㅣ가-힇 ]", "", doc)
return doc
re.sub을 사용하였는데, 파라미터를 살펴보면 첫 번째는 규칙(한국어를 제외한 나머지), 두 번째는 어떻게 바꿀지 ("", 아무것도 없도록 바꿈), 세 번째는 해당 문서(doc)를 의미합니다.
그 다음 불용어 정의 함수를 만들어 보겠습니다. 보통 집합으로 정의합니다.
불용어는 데이터에서 의미있는 단어 토큰만 고르기 위해서 큰 의미 없는 단어 토큰을 제거하는 작업을 말합니다.
def define_stopwords(path):
SW = set()
# 불용어를 추가하는 방법 1.
# SW.add("있다")
# 불용어를 추가하는 방법 2.
# stopwords-ko.txt 파일 마지막 줄에 직접 추가하기
with open(path, encoding='utf-8') as f: # 파일 경로, 파일을 자동으로 open, 함수 끌나면 자동으로 close
for word in f: # 각 줄을 져와 집합에 추가
SW.add(word)
return SW
우선 빈 집합셋을 만들어주고, 일일이 불용어 단어를 add 해주는 방법이 있습니다.
그리고 또 하나는 한국어 불용어 텍스트 파일을 만들고, 파일의 각 줄을 for문을 통하여 빈 집합셋에 add 해주는 방법이 있습니다.
텍스트 토큰화 작업을 진행해 보겠습니다.
텍스트 토큰화(Text Tokenization)은 말뭉치에서 토큰을 분리하는 작업을 말합니다.
예를 들어 "You are so beautiful"이라는 말뭉치가 있는데 이를 토큰화 하면, "You", "are", "so", "beautiful"로 나뉠 수 있습니다. 텍스트 토큰화 작업을 수행하는 함수를 만들어 보겠습니다.
def text_tokenizing(doc):
# list comprehension을 풀어서 쓴 코드
tokenized_doc = []
return [word for word in mecab_morphs(doc) if word not in SW and len(word) > 1]
이 전에 포스팅했던 형태소 분석기 코드에서 mecab_morphs 함수를 사용하여, 위에 불용어 정의 함수에서 SW집합에 포함되지 않는 토큰과 토큰 길이가 1보다 큰 경우만 리스트에 추가하도록 하였습니다.
이제 만든 형태소 추출기들이 제대로 만들어졌는지 확인해 보겠습니다,
먼저 text3를 전처리(정제)하고, 텍스트 토큰화를 하겠습니다.
text3 = """5G 이동통신망을 빌려 사용하는 ‘5G 알뜰폰’이 올해 도입되고, 내년부터는 의무화된다.
정부는 알뜰폰 사업자(MNVO)가 통신사(MNO)에 통신망을 빌리는 비용(도매대가)을 지난해보다 큰 폭으로 낮춰, 알뜰폰 요금 인하를 유도하기로 했다. 하지만 줄어드는 알뜰폰 시장을 살릴 수 있을지는 지켜봐야 하는 상황이다.
과학기술정보통신부는 알뜰폰 활성화 추진대책을 25일 발표했다. 알뜰폰 가입자는 800만명으로 이동통신 시장의 12%를 차지한다. 2011년 출시 뒤 저렴한 요금제로 통신비 부담을 낮춰왔다. 하지만 지난해 5월 통신 3사가 준보편제 요금을 내놓은 이후 알뜰폰 이탈 현상이 지속되고 있다.
우선 올해 안에 3개 이상의 5G 알뜰폰이 시장에 나온다. 통신사가 5G망을 알뜰폰 사업자에게 도매 제공할지 여부는 통신사 자율로 정한다. 앞서 LG유플러스는 오는 10월 알뜰폰 사업을 시작하는 KB국민은행에 5G망을 제공한다고 밝힌 바 있다. SK텔레콤와 KT도 특정 제휴사를 선택해 올해 안에 5G 알뜰폰을 내놓기로 했다.
내년부터는 5G 알뜰폰 제공이 의무화된다. 지난 22일자로 종료된 도매제공 의무제도의 유효기간을 2022년 9월22일까지 연장하는 전기통신사업법 개정안이 국회에서 통과되면, 관련 고시를 개정해 SK텔레콤의 5G망 도매제공을 의무화하겠다는 것이다.
과기정통부 관계자는 “SK텔레콤이 자사와 계약을 맺은 13개 알뜰폰 사업자에게 5G망을 의무 제공하면, 그 외 31개의 알뜰폰 사업자들이 경쟁에서 밀릴 것을 우려해 KT와 LG유플러스도 5G망을 제공하게 될 것”이라고 내다봤다.
알뜰폰 사업자가 상품을 만드는 방식 크게 2가지다. 하나는 통신사로부터 음성·문자·데이터를 도매로 사들인 뒤 이를 바탕으로 통신사보다 저렴한 요금제를 내놓는 방식(종량제 도매제공)이다. 이를 위해 정부는 도매대가 인하율을 음성 17.8%, 데이터 19.2%, 단문메시지 1.15%로, 지난해 음성 15.1%, 데이터 19.1%, 단문메시지 1.13%에 비해 높여 잡았다.
또 다른 방식은 일정비용을 통신사에 내고 통신사의 정액 요금제를 그대로 판매하면서, 그 차액의 범위에서 저렴한 요금제를 내놓는 방식(수익배분 도매제공)이다. 정부는 SK텔레콤의 준보편 요금제인 ‘T플랜 요금제’를 알뜰폰 사업자가 재판매할 수 있게 했다. 기존에 SK텔레콤이 도매제공했던 ‘밴드데이터 요금제’의 최고구간의 대가도 1.5%포인트 낮췄다.
알뜰폰 업계는 대체로 반기는 분위기지만, 알뜰폰 시장을 살릴 수 있을지에는 의구심을 갖고 있다. 업계 관계자는 “도매대가 인하율이 크고, 5G망을 제공하는 것은 긍정적”이라면서도 “수익배분 도매제공의 의무화, 설비를 가진 업체에 대한 접속료 정산 도입 등의 제도적 개선이 필요하다”고 말했다."""
SW = define_stopwords("stopwords-ko.txt")
cleaned_text = text_cleansing(text3)
print("전처리 : ", cleaned_text)
전처리 : 이동통신망을 빌려 사용하는 알뜰폰이 올해 도입되고 내년부터는 의무화된다정부는 알뜰폰
사업자가 통신사에 통신망을 빌리는 비용도매대가을 지난해보다 큰 폭으로 낮춰 알뜰폰 요금 인하를
유도하기로 했다 하지만 줄어드는 알뜰폰 시장을 살릴 수 있을지는 지켜봐야 하는
상황이다과학기술정보통신부는 알뜰폰 활성화 추진대책을 일 발표했다 알뜰폰 가입자는 만명으로
이동통신 시장의 를 차지한다 년 출시 뒤 저렴한 요금제로 통신비 부담을 낮춰왔다 하지만 지난해
월 통신 사가 준보편제 요금을 내놓은 이후 알뜰폰 이탈 현상이 지속되고 있다우선 올해 안에 개
이상의 알뜰폰이 시장에 나온다 통신사가 망을 알뜰폰 사업자에게 도매 제공할지 여부는 통신사
자율로 정한다 앞서 유플러스는 오는 월 알뜰폰 사업을 시작하는 국민은행에 망을 제공한다고
밝 바 있다 텔레콤와 도 특정 제휴사를 선택해 올해 안에 알뜰폰을 내놓기로 했다내년부터는
알뜰폰 제공이 의무화된다 지난 일자로 종료된 도매제공 의무제도의 유효기간을 년 월일까지
연장하는 전기통신사업법 개정안이 국회에서 통과되면 관련 고시를 개정해 텔레콤의 망 도매제공을
의무화하겠다는 것이다과기정통부 관계자는 텔레콤이 자사와 계약을 맺은 개 알뜰폰 사업자에게
망을 의무 제공하면 그 외 개의 알뜰폰 사업자들이 경쟁에서 밀릴 것을 우려해 와 유플러스도 망을
제공하게 될 것이라고 내다봤다알뜰폰 사업자가 상품을 만드는 방식 크게 가지다 하나는 통신사로부터
음성문자데이터를 도매로 사들인 뒤 이를 바탕으로 통신사보다 저렴한 요금제를 내놓는 방식종량제
도매제공이다 이를 위해 정부는 도매대가 인하율을 음성 데이터 단문메시지 로 지난해 음성 데이터
단문메시지 에 비해 높여 잡았다또 다른 방식은 일정비용을 통신사에 내고 통신사의 정액 요금제를
그대로 판매하면서 그 차액의 범위에서 저렴한 요금제를 내놓는 방식수익배분 도매제공이다 정부는
텔레콤의 준보편 요금제인 플랜 요금제를 알뜰폰 사업자가 재판매할 수 있게 했다 기존에 텔레콤이
도매제공했던 밴드데이터 요금제의 최고구간의 대가도 포인트 낮췄다알뜰폰 업계는 대체로 반기는
분위기지만 알뜰폰 시장을 살릴 수 있을지에는 의구심을 갖고 있다 업계 관계자는 도매대가 인하율이
크고 망을 제공하는 것은 긍정적이라면서도 수익배분 도매제공의 의무화 설비를 가진 업체에 대한
접속료 정산 도입 등의 제도적 개선이 필요하다고 말했다
텍스트 정제 결과 5G(숫자, 영어), "(특수문자) 등이 다 지워졌습니다. 한국어만 남아있고 다 지워진걸 확인할 수 있습니다.
여기서 띄어쓰기는 제외입니다.
tokenized_text = text_tokenizing(cleaned_text)
print("\n형태소 분석 : ", tokenized_text)
형태소 분석 : ['이동', '통신망', '빌려', '사용', '알뜰', '올해', '도입', '내년', '부터', '의무',
'된다', '정부', '알뜰', '사업자', '통신사', '통신망', '빌리', '비용', '매대', '가을', '지난해',
'보다', '으로', '낮춰', '알뜰', '요금', '인하', '유도', '지만', '줄어드', '알뜰', '시장',
'살릴', '을지', '지켜봐야', '상황', '과학', '기술', '정보', '통신부', '알뜰', '활성', '추진',
'대책', '발표', '알뜰', '가입자', '으로', '이동', '통신', '시장', '차지', '한다', '출시',
'저렴', '요금제', '통신비', '부담', '낮춰', '하지만', '지난해', '통신', '준보', '편제', '요금',
'내놓', '이후', '알뜰', '이탈', '현상', '지속', '우선', '올해', '이상', '알뜰', '시장', '나온다',
'통신사', '알뜰', '사업자', '에게', '도매', '제공', '할지', '여부', '통신사', '자율', '정한다',
'앞서', '플러스', '알뜰', '사업', '시작', '국민은행', '제공', '한다고', '텔레콤', '특정', '휴사',
'선택', '올해', '알뜰', '내놓', '내년', '부터', '알뜰', '제공', '의무', '된다', '지난', '일자',
'종료', '도매', '제공', '의무', '제도', '유효', '기간', '월일', '까지', '연장', '전기', '통신',
'사업', '개정안', '국회', '에서', '통과', '관련', '고시', '개정', '텔레콤', '도매', '제공',
'의무', '다는', '과기', '정통부', '관계자', '텔레콤', '자사', '계약', '알뜰', '사업자', '에게',
'의무', '제공', '알뜰', '사업자', '경쟁', '에서', '밀릴', '우려', '플러스', '제공', '라고',
'알뜰', '사업자', '상품', '만드', '방식', '가지', '하나', '통신사', '로부터', '음성', '문자',
'데이터', '도매', '사들인', '바탕', '으로', '통신사', '보다', '저렴', '요금제', '내놓', '방식',
'종량제', '도매', '제공', '위해', '정부', '도매', '대가', '인하', '음성', '데이터', '단문',
'메시지', '지난해', '음성', '데이터', '단문', '메시지', '비해', '높여', '다른', '방식', '일정',
'비용', '통신사', '통신사', '정액', '요금제', '그대로', '판매', '면서', '차액', '범위', '에서',
'저렴', '요금제', '내놓', '방식', '수익', '배분', '도매', '제공', '정부', '텔레콤', '보편',
'요금제', '플랜', '요금제', '알뜰', '사업자', '판매', '기존', '텔레콤', '도매', '제공', '밴드',
'데이터', '요금제', '최고', '구간', '대가', '포인트', '낮췄', '알뜰', '업계', '대체로', '반기',
'분위기', '지만', '알뜰', '시장', '살릴', '을지', '의구심', '업계', '관계자', '도매', '대가',
'인하', '제공', '긍정', '라면서', '수익', '배분', '도매', '제공', '의무', '설비', '가진', '업체',
'대한', '속료', '정산', '도입', '제도', '개선', '필요', '다고']
텍스트 토큰화도 잘 된것을 확인할 수 있다.
여기서 mecab_pos와 mecab_morphs의 차이를 알려드리겠습니다.
한국어 사과는 "사과를 먹다"의 사과 뜻과 "남에게 잘못했을 때 사과하다"의 사과 뜻으로 구분됩니다.
전자는 명사, 후자는 동사를 뜻합니다. 즉, 같은 말이지만 뜻이 다를 때 구분하기 위해서는 mecab_pos(part_of_speech)를 사용하면 두 뜻을 구분할 수 있습니다. 보통 한국어는 pos를 사용합니다.
'텍스트 마이닝을 활용하여 문자 대화내용 분석' 카테고리의 다른 글
Gensim을 활용하여 토픽모델링 분석하기 (0) | 2023.04.05 |
---|---|
토픽 모델링 정의 (0) | 2023.03.28 |
konlpy 형태소 분석기 성능비교 (0) | 2023.03.27 |
기사 텍스트 정제 - konlpy 설치 (WINDOWS) (0) | 2023.03.24 |
네이버 기사 크롤러 만들기 (0) | 2023.03.22 |