🖥️ IT, 컴퓨터/🐍 Python

[Mecab] 일본어 형태소 분석하기 :: Mecab

김 홍시 2024. 4. 3. 12:32
반응형

 

Mecab으로 일반 텍스트 일본어 형태소 분석하기

 

 

! pip install mecab-python3
! pip install unidic

 

 

!python -m unidic download

 

 

import MeCab
import unidic

tagger = MeCab.Tagger()  # "tagger = MeCab.Tagger('-d ' + unidic.DICDIR)"
sample_txt = 'くるまでまつ'
result = tagger.parse(sample_txt)
print (result)

 

sample_txt에 원하는 문장을 입력하면

 

くる 動詞,非自立可能,,,カ行変格,連体形-一般,クル,来る,くる,クル,くる,クル,和,"","","","","","",用,クル,クル,クル,クル,"1","C1","",2891174448865985,10518
まで 助詞,副助詞,,,,,マデ,まで,まで,マデ,まで,マデ,和,"","","","","","",副助,マデ,マデ,マデ,マデ,"","名詞%F2@1,形容詞%F2@1,動詞%F2@1","",9865651581755904,35891
まつ 動詞,一般,,,五段-タ行,連体形-一般,マツ,待つ,まつ,マツ,まつ,マツ,和,"","","","","","",用,マツ,マツ,マツ,マツ,"1","C1","",9848884029432513,35830
EOS

 

이러한 결과가 나온다.

 

 

만약 데이터프레임 자체를 넣어서 돌리고 싶다면 아래의 코드 사용

 

 

Mecab으로 데이터 프레임 텍스트 일본어 형태소 분석하기 

 

import pandas as pd
df = pd.read_csv('exit.csv', encoding = 'utf-8')

import MeCab
import unidic

# MeCab Tagger 초기화
tagger = MeCab.Tagger()

# 결과를 저장할 리스트
parsed_results = []

# df의 'input' 열을 순회하며 MeCab으로 파싱
for text in df['input']:
    parsed_result = tagger.parse(text)
    parsed_results.append(parsed_result)

# 파싱 결과를 새 컬럼으로 추가
df['parsed'] = parsed_results

 

 

 

그러면 이렇게 파싱된 결과가 나온다. 

 

 

df.to_csv('exit_parsed.csv')

 

 

Mecab으로 데이터 프레임 텍스트 일본어 형태소 분석한 후 명사만 남기기

 

 

 

이제 이 중에서 명사에 해당하는 것만 남겨보자.

 

1) 명사라는 말을 포함한 행만 남기기


# 각 라인을 검사하여 두 번째 필드가 '名詞'인 라인만 필터링하는 함수
def filter_nouns(text):
    lines = text.split('\n')  # 행을 라인으로 분리
    noun_lines = [line for line in lines if '\t名詞' in line]  # '\t名詞'를 포함하는 라인만 필터링
    return '\n'.join(noun_lines)  # 필터링된 라인들을 다시 하나의 문자열로 결합

# 'parsed' 열에서 각 행을 필터링하여 '名詞'만 남기기
df['nouns_only'] = df['parsed'].apply(filter_nouns)

# 결과 확인
print(df['nouns_only'])

 

그러면 이렇게 파싱된 결과 중 명사를 포함한 행만 남는다.

 

2) 단어만 남기는 코드

우리에게 필요한 건 \t명사 앞에 있는 명사에 해당하는 '단어'이니,

명사 단어만 남기는 코드를 적용해야 한다.

 

# '名詞' 앞의 단어만 추출하는 함수
def extract_noun_word(text):
    return [line.split('\t')[0] for line in text.split('\n') if line]  # 빈 라인은 무시

# 'nouns_only' 열의 각 행에 대해 명사 앞의 단어만 추출하여 'nouns' 열에 저장
df['nouns'] = df['nouns_only'].apply(extract_noun_word)

# 리스트 형태가 아닌 문자열 형태로 저장하고 싶을 경우, join을 사용할 수 있습니다.
df['nouns'] = df['nouns_only'].apply(lambda text: ' '.join(extract_noun_word(text)))

# 결과 확인
print(df['nouns'])

 

명사만 남았다.

 

 

df.to_csv('exit_parsed_noun.csv')

 

csv로 내보내기 

 

 

참고자료 

https://atmarkit.itmedia.co.jp/ait/articles/2102/05/news027.html

 

https://atmarkit.itmedia.co.jp/ait/articles/2102/05/news027.html

 

atmarkit.itmedia.co.jp

 

 

 

반응형