머신러닝 & 딥러닝/자연어처리

[자연어 처리/NLP기초] 2. 단어 이해시키기(1) - 시소러스와 WordNet

by seokii 2022. 2. 19.
728x90
반응형

자연어 처리란

https://seokii.tistory.com/77

 

[자연어 처리/NLP기초] 1. 자연어 처리란?

자연어 처리를 공부하면서 기초적인 내용을 정리하고자 글을 쓰게 되었습니다. '밑바닥부터 시작하는 딥러닝2' 교재를 공부하고 내용을 정리하도록 하겠습니다. 자연어 처리 기초 용어 https://seo

seokii.tistory.com

지난 글에서 자연어 처리란 무엇인지에 대해 간단하게 정리를 했습니다.

이번 글에서는 컴퓨터에게 단어를 어떻게 이해시키는지에 대해서, 그중에서도 시소러스 방식과 WordNet에 대해서 정리해보겠습니다.

 

시소러스(thesaurus)

구글에 시소러스를 검색하면 다음과 같이 정의하고 있습니다.

1. 단어를 의미에 따라 분류/배열한 일종의 유의어 사전

2. 컴퓨터 등의 정보 검색에서 정확한 정보를 가려내기 위해 사용되는 검색어의 어휘집

말 그대로, 시소러스는 유의어 사전입니다.

'뜻이 같은 단어(동의어)'나 '뜻이 비슷한 단어(유의어)'가 한 그룹으로 분류되어 있습니다.

 

ex) 동의어의 예: "car", "auto", "automobile" 등은 "자동차"를 뜻하는 동의어다.

Car = auto, automobile, machine, motorcar

 

또한, 시소러스에서는 단어 사이의 '상위와 하위', '전체와 부분' 등 더 세세한 관계까지도 정의해둔 경우가 있습니다.

이러한 단어들의 집합을 만들어 단어 간의 관계를 그래프로 표현해 단어 사이의 연결을 정의할 수 있습니다.

이렇게 만들어진 '단어 네트워크'를 사용해 컴퓨터에게 단어의 관계를 가르치는 것입니다.

 

WordNet

NLP에서 가장 유명한 시소러스는 WordNet입니다.

위에서 말했듯이, WordNet을 사용해 유의어를 얻거나 '단어 네트워크'를 이용할 수 있습니다.

또한 이를 이용해 단어 사이의 유사도를 구할 수도 있습니다.

WordNet은 NLTK(Natural Language Toolkit) 라이브러리를 설치해 사용할 수 있습니다.

터미널에서 다음의 명령어를 통해 NLTK 라이브러리를 설치할 수 있습니다.
$ pip install nltk

 

다음은 WordNet을 불러와 "car" 단어의 동의어를 찾는 코드입니다.

import nltk
from nltk.corpus import wordnet

print(wordnet.synsets('car'))
[Synset('car.n.01'),
Synset('car.n.02'),
Synset('car.n.03'),
Synset('car.n.04'),
Synset('cable_car.n.01')]

원소가 5개짜리 리스트가 출력됐습니다. 이것은 "car" 단어에 5개의 서로 다른 동의어 그룹이 정의되어있음을 뜻합니다.

n : 속성(명사, 동사 등 n -> noun(명사)의 머릿글자)

01 : 그룹의 인덱스

 

car = wordnet.synset('car.n.01')
print(car.definition())
a motor vehicle with four wheels; usually propelled by an internal combustion engine

위의 코드를 추가적으로 입력해주면, "car.n.01"이 가리키는 동의어의 의미를 확인할 수 있습니다.

definition() 메서드는 결과와 같이 사람이 그 단어를 이해하고 싶을 때 주로 사용합니다.

 

print(car.lemma_names())
['car', 'auto', 'automobile', 'machine', 'motorcar']

lema_names() 메서드를 사용하면 "car.n.01" 표제어에 속한 동의어를 확인할 수 있습니다.

 

print(car.hypernym_paths())
[[Synset('entity.n.01'), Synset('physical_entity.n.01'),
Synset('object.n.01'), Synset('whole.n.02'), Synset('artifact.n.01'),
Synset('instrumentality.n.03'), Synset('container.n.01'), Synset('wheeled_vehicle.n.01'),
Synset('self-propelled_vehicle.n.01'), Synset('motor_vehicle.n.01'), Synset('car.n.01')],
[Synset('entity.n.01'), Synset('physical_entity.n.01'), Synset('object.n.01'),
Synset('whole.n.02'), Synset('artifact.n.01'), Synset('instrumentality.n.03'),
Synset('conveyance.n.03'), Synset('vehicle.n.01'), Synset('wheeled_vehicle.n.01'),
Synset('self-propelled_vehicle.n.01'), Synset('motor_vehicle.n.01'), Synset('car.n.01')]]

hypernym_paths() 메서를 사용하면 다른 단어와의 의미적인 상하관계를 확인할 수 있습니다.

'entity -> physical_entity -> object -> ... -> motor_vehicle -> car'의 경로

 

car = wordnet.synset('car.n.01')
cat = wordnet.synset('cat.n.01')

print(car.path_similarity(cat))
0.05555555555555555

마지막으로, path_similarity() 메서드를 사용해 단어 간의 유사도를 계산할 수도 있습니다.

 

시소러스의 문제점

이렇게 시소러스를 사용하면 단어의 의미를 간접적으로라도 컴퓨터에게 가르칠 수 있습니다.

하지만 사람이 수작업으로 레이블링 하는 방식이기에 많은 단점이 존재합니다.

단점들은 다음과 같습니다.

 

1. 시대 변화에 대응하기 어렵다.

: 말이라는 것은 때때로 새로운 단어가 생겨나고, 옛말은 잊히기도 하며, 의미가 변화하기도 합니다. 따라서, 이러한 단어의 변화에 대응하려면 사람이 수작업으로 지속적으로 갱신해야 할 필요가 있습니다.

 

2, 사람을 쓰는 비용이 크다.

: 시소러스를 만드는 데는 많은 인적 비용이 발생합니다. 현존하는 영어 단어의 수는 약 1,000만 개가 넘는데 이 모든 단어들에 대해서 관계를 정의하기가 쉽지 않습니다.

 

3. 단어의 미묘한 차이를 표현할 수 없다.

: 시소러스에서는 뜻이 비슷한 단어를 묶지만, 실제로 비슷한 단어들이라도 미묘한 차이가 있는 단어들에 대해서 표현할 수가 없습니다.

 

 

728x90
반응형

댓글