EXCELSIOR

Chap01-2 : WordNet, Part-Of-Speech(POS) 본문

NLP/NLTK

Chap01-2 : WordNet, Part-Of-Speech(POS)

Excelsior-JH 2016. 12. 14. 17:20

1. Looking up Synsets for a word in WordNet

WordNet(워드넷)은 영어의 의미 어휘목록이다. WordNet은 영어 단어를 'synset'이라는 유의어 집단(동의어 집합)으로 분류하여 간략하고 일반적인 정의를 제공하고, 이러한 어휘목록 사이의 다양한 의미 관계를 기록한다. 워드넷은 자연어 처리(NLP, Natural Language Processing)를 위한 특화된 사전이라고 볼 수 있다.


NLTK의 wordnet을 사용하기 위해서는 nltk_data/corpora/wordnet에 wordnet이 압축이 풀려있어야 한다.

다음과 같이 'cookbook'의 synset을 알아보자. wordnet.synsets(word)를 통해 확인할 수 있다. definition( ) 함수는 해당 단어의 간략한 정의를 출력해준다. 

from nltk.corpus import wordnet
syn = wordnet.synsets('cookbook')[0]
print(syn.name())
print(syn.definition())
#결과
cookbook.n.01
a book of recipes and cooking directions

1) Hypernyms(상의어) & Hyponyms(하의어)

상의어는 낱말들 중에서 낱말이 다른 낱말을 포함하는 경우를 말한다. 하의어는 상의어에 포함되는 낱말을 하의어라고 말한다.

        • 상의어(hypernym): X가 Y의 한 종류이면 Y는 X의 상의어이다. (예: 악기)
        • 하의어(hyponym): Y가 X의 한 종류이면 Y는 X의 하의어이다. (예: 피아노)
from nltk.corpus import wordnet
syn = wordnet.synsets('cookbook')[0]
print(syn.hypernyms())
print(syn.hypernyms()[0].hyponyms())
print(syn.root_hypernyms())
#결과
[Synset('reference_book.n.01')]
[Synset('annual.n.02'), Synset('atlas.n.02'), Synset('cookbook.n.01'), Synset('directory.n.01'), Synset('encyclopedia.n.01'), 
Synset('handbook.n.01'), Synset('instruction_book.n.01'), Synset('source_book.n.01'), Synset('wordbook.n.01')]
[Synset('entity.n.01')]

위의 코드에서 'cookbook'이라는 단어의 상의어(hypernym)는 'reference_book'이 된다. 'reference_book'의 하의어(hyponym)는 위와 같다.


2) Part-Of-Speech(POS)

Part-Of-Speech(POS)는 품사를 의미하며 단어를 문법적 기능, 형태, 의미에 따라 나눈것을 말한다. 명사, 대명사, 조사, 동사, 부사 등이 있다. 

NLTK의 WordNet에는 POS tag는 아래의 표와 같다.

Part Of Speech 

Tag 

 Noun

 Adjective

Adverb

Verb 



2. Looking up lemmas and synonyms in WordNet

Lemma는 단어의 원형을 의미한다. 예를 들어, cooking, cooked의 lemma는 'work'가 된다.

from nltk.corpus import wordnet
syn = wordnet.synsets('cooked')[0]
print(syn.lemmas())
#결과
[Lemma('cook.v.01.cook')]


3. Calculating WordNet Synset similarity

WordNet의 Synsets은 상의어(hypernym)트리로 구성되어 있다. 이 상의어 트리는 단어간의 유사도(similarity)를 계산하는데 사용할 수 있다.

from nltk.corpus import wordnet
cb = wordnet.synset('cookbook.n.01')
ib = wordnet.synset('instruction_book.n.01')
print(cb.wup_similarity(ib))
#결과
0.9166666666666666
dog = wordnet.synsets('dog')[0]
print(dog.wup_similarity(cb))
#결과
0.38095238095238093

위의 코드는 Wu-Palmer Similarity를 가지고 계산한 유사도 결과다. wup_similarity( )는 비교 단어들의 hypernym tree를 기반으로 유사도를 계산한다.

1 Comments
  • 프로필사진 kdhsimplepro@gmail.com 2020.08.13 15:06 안녕하세요 Excelsior 님 덕분에 지금 진행하고 있는 프로젝트에 많은 도움이 되고 있습니다.
    질문할 사항이 있어서 댓글 남깁니다.
    상의어, 하의어를 여러개 뽑을 때 결과가
    [Synset('annual.n.02'), Synset('atlas.n.02'), Synset('cookbook.n.01'), Synset('directory.n.01'), Synset('encyclopedia.n.01'), Synset('handbook.n.01'), Synset('instruction_book.n.01'), Synset('source_book.n.01'), Synset('wordbook.n.01')]
    이렇게 나옵니다. 아예 리스트에 ['annual.n.02', 'atlas.n.02', 'cookbook.n.01', 'directory.n.01' ...] 이런식으로 뽑고 싶은데 어떻게 해야할까요?
댓글쓰기 폼
Prev 1 2 3 4 5 6 7 8 9 Next