단어문서행렬과 형태소 분석

Python을 통한 단어문서행렬과 형태소 분석


수강중

14. 단어와 품사 태그 짝짓기

형태소 분석에서 원하는 품사를 추출하는 방법을 알아보자. 이는 출력 결과에서 lemmaxpos 를 짝지은 쌍이 된다.

import stanza
nlp = stanza.Pipeline('ko')
2020-04-01 15:21:53 INFO: Loading these models for language: ko (Korean):
=======================
| Processor | Package |
-----------------------
| tokenize  | kaist   |
| pos       | kaist   |
| lemma     | kaist   |
| depparse  | kaist   |
=======================

2020-04-01 15:21:53 INFO: Use device: gpu
2020-04-01 15:21:53 INFO: Loading: tokenize
2020-04-01 15:21:56 INFO: Loading: pos
2020-04-01 15:21:57 INFO: Loading: lemma
2020-04-01 15:21:58 INFO: Loading: depparse
2020-04-01 15:21:59 INFO: Done loading processors!

먼저 텍스트를 처리해보자.

text = '오늘은 자연어 처리를 공부하기 좋은 날이다.'
doc = nlp(text)

'오늘은'의 분석 결과를 보자.

word = doc.sentences[0].words[0]
word
{
  "id": "1",
  "text": "오늘은",
  "lemma": "오늘+은",
  "upos": "NOUN",
  "xpos": "ncn+jxt",
  "head": 5,
  "deprel": "dislocated",
  "misc": "start_char=0|end_char=3"
}

'오늘은'은 '오늘'과 '은'이 합쳐진 형태이다.

word.lemma
'오늘+은'

이들의 품사는 다음과 같다. 명사는 n으로 시작하고, 조사는 j로 시작한다.

word.xpos
'ncn+jxt'

형태소들은 + 기호로 구분되어 있으므로 .split 를 분리한다.

word.lemma.split('+')
['오늘', '은']
word.xpos.split('+')
['ncn', 'jxt']

zip 함수로 lemma와 xpos의 각 원소를 짝짓을 수 있다.

list(zip(word.lemma.split('+'), word.xpos.split('+')))
[('오늘', 'ncn'), ('은', 'jxt')]

doc의 첫 문장에서 모든 형태소와 그 품사를 짝지어 출력해본다.

for word in doc.sentences[0].words:
    lemma = word.lemma.split('+')
    xpos = word.xpos.split('+')
    for token, pos in zip(lemma, xpos):
        print(token, pos)
오늘 ncn
은 jxt
자연어 ncn
처리 ncpa
를 jco
공부 ncpa
하 xsv
기 etn
좋 paa
ㄴ etm
날 ncn
이 jp
다 ef