wisdomify / storyteller-deprecated

Forward dictionary of Korean Proverbs
2 stars 0 forks source link

속담 형태소 분석 #2

Closed ArtemisDicoTiar closed 3 years ago

ArtemisDicoTiar commented 3 years ago

형태소 품사 태그 표 참고

Screenshot 2021-07-08 at 0 42 56

방법

KoNLPy 패키지를 사용하면 될것같다.

계획

ArtemisDicoTiar commented 3 years ago

예시 결과

from konlpy.tag import Kkma
from konlpy.utils import pprint
kkma = Kkma()

pprint(kkma.pos(u'가는 날이 장날이다'))
[('갈', 'VV'),
 ('는', 'ETD'),
 ('날', 'NNG'),
 ('이', 'JKS'),
 ('장날', 'NNG'),
 ('이', 'VCP'),
 ('다', 'EFN')]
ArtemisDicoTiar commented 3 years ago

위에 나온 결과에서 "갈"이 아니라 "가"가 나왔으면 좋겠는데 원형으로 결과 출력 안하는 방법 없나?

ArtemisDicoTiar commented 3 years ago

1차 속담 10개 분석 결과

[('갈', 'VV'), ('는', 'ETD'), ('날', 'NNG'), ('이', 'JKS'), ('장날', 'NNG'), ('이', 'VCP'), ('다', 'EFN')]
[('갈', 'VV'), ('는', 'ETD'), ('날', 'NNG'), ('이', 'JKS'), ('장날', 'NNG')]
[('갈수록', 'MAG'), ('태산', 'NNG')]
[('꿩', 'NNG'), ('대신', 'NNP'), ('닭', 'NNG')]
[('등잔', 'NNG'), ('밑', 'NNG'), ('이', 'JKS'), ('어둡', 'VA'), ('다', 'EFN')]
[('산', 'NNG'), ('넘', 'VV'), ('어', 'ECD'), ('산', 'NNG')]
[('소문나', 'VV'), ('ㄴ', 'ETD'), ('잔치', 'NNG'), ('에', 'JKM'), ('먹', 'VV'), ('을', 'ETD'), ('것', 'NNB'), ('없', 'VA'), ('다', 'EFN')]
[('원숭이', 'NNG'), ('도', 'JX'), ('나무', 'NNG'), ('에서', 'JKM'), ('떨어지', 'VV'), ('ㄴ다', 'EFN')]
[('핑계', 'NNG'), ('없', 'VA'), ('는', 'ETD'), ('무덤', 'NNG'), ('없', 'VA'), ('다', 'EFN')]
ArtemisDicoTiar commented 3 years ago

분석기별 결과

kkma:
[('갈', 'VV'), ('는', 'ETD'), ('날', 'NNG'), ('이', 'JKS'), ('장날', 'NNG'), ('이', 'VCP'), ('다', 'EFN')]
hannanum:
['가', '는', '날', '이', '장날', '이', '다']
[('가', 'PV'), ('는', 'ET'), ('날', 'NC'), ('이', 'JC'), ('장날', 'NC'), ('이', 'JP'), ('다', 'EF')]
komoran:
['가', '는', '날', '이', '장날', '이', '다']
[('가', 'VV'), ('는', 'ETM'), ('날', 'NNG'), ('이', 'JKS'), ('장날', 'NNG'), ('이', 'VCP'), ('다', 'EC')]
okt:
['가는', '날', '이', '장날', '이다']
[('가는', 'Verb'), ('날', 'Noun'), ('이', 'Josa'), ('장날', 'Noun'), ('이다', 'Josa')]

kkma:
[('갈', 'VV'), ('는', 'ETD'), ('날', 'NNG'), ('이', 'JKS'), ('장날', 'NNG')]
hannanum:
['가', '는', '날', '이', '장날']
[('가', 'PV'), ('는', 'ET'), ('날', 'NC'), ('이', 'JC'), ('장날', 'NC')]
komoran:
['가', '는', '날', '이', '장날']
[('가', 'VV'), ('는', 'ETM'), ('날', 'NNG'), ('이', 'JKS'), ('장날', 'NNG')]
okt:
['가는', '날', '이', '장날']
[('가는', 'Verb'), ('날', 'Noun'), ('이', 'Josa'), ('장날', 'Noun')]

kkma:
[('갈수록', 'MAG'), ('태산', 'NNG')]
hannanum:
['가', 'ㄹ수록', '태산']
[('가', 'PX'), ('ㄹ수록', 'EC'), ('태산', 'NC')]
komoran:
['갈수록', '태산']
[('갈수록', 'MAG'), ('태산', 'NNP')]
okt:
['갈수록', '태산']
[('갈수록', 'Noun'), ('태산', 'Noun')]

kkma:
[('꿩', 'NNG'), ('대신', 'NNP'), ('닭', 'NNG')]
hannanum:
['꿩', '대', '이', '시ㄴ', '닭']
[('꿩', 'NC'), ('대', 'NB'), ('이', 'JP'), ('시', 'EP'), ('ㄴ', 'ET'), ('닭', 'NC')]
komoran:
['꿩', '대신', '닭']
[('꿩', 'NNG'), ('대신', 'NNG'), ('닭', 'NNG')]
okt:
['꿩', '대신', '닭']
[('꿩', 'Noun'), ('대신', 'Noun'), ('닭', 'Noun')]

kkma:
[('등잔', 'NNG'), ('밑', 'NNG'), ('이', 'JKS'), ('어둡', 'VA'), ('다', 'EFN')]
hannanum:
['등잔', '밑', '이', '어둡', '다']
[('등잔', 'NC'), ('밑', 'NC'), ('이', 'JC'), ('어둡', 'PA'), ('다', 'EF')]
komoran:
['등잔', '밑', '이', '어둡', '다']
[('등잔', 'NNG'), ('밑', 'NNG'), ('이', 'JKS'), ('어둡', 'VA'), ('다', 'EC')]
okt:
['등잔', '밑', '이', '어둡다']
[('등잔', 'Noun'), ('밑', 'Noun'), ('이', 'Josa'), ('어둡다', 'Adjective')]

kkma:
[('산', 'NNG'), ('넘', 'VV'), ('어', 'ECD'), ('산', 'NNG')]
hannanum:
['사', 'ㄴ', '넘', '어', '산']
[('사', 'PV'), ('ㄴ', 'ET'), ('넘', 'PV'), ('어', 'EC'), ('산', 'NC')]
komoran:
['살', 'ㄴ', '넘', '어', '살', 'ㄴ']
[('살', 'VV'), ('ㄴ', 'ETM'), ('넘', 'VV'), ('어', 'EC'), ('살', 'VV'), ('ㄴ', 'ETM')]
okt:
['산', '넘어', '산']
[('산', 'Noun'), ('넘어', 'Verb'), ('산', 'Noun')]

kkma:
[('소문나', 'VV'), ('ㄴ', 'ETD'), ('잔치', 'NNG'), ('에', 'JKM'), ('먹', 'VV'), ('을', 'ETD'), ('것', 'NNB'), ('없', 'VA'), ('다', 'EFN')]
hannanum:
['소문나', 'ㄴ', '자', 'ㄴ', '치', '에', '먹', '을', '것', '없', '다']
[('소문나', 'PV'), ('ㄴ', 'ET'), ('자', 'PV'), ('ㄴ', 'ET'), ('치', 'NB'), ('에', 'JC'), ('먹', 'PV'), ('을', 'ET'), ('것', 'NB'), ('없', 'PA'), ('다', 'EF')]
komoran:
['소문나', 'ㄴ', '잔치', '에', '먹', '을', '것', '없', '다']
[('소문나', 'VV'), ('ㄴ', 'ETM'), ('잔치', 'NNG'), ('에', 'JKB'), ('먹', 'VV'), ('을', 'ETM'), ('것', 'NNB'), ('없', 'VA'), ('다', 'EC')]
okt:
['소문난', '잔치', '에', '먹을', '것', '없다']
[('소문난', 'Verb'), ('잔치', 'Noun'), ('에', 'Josa'), ('먹을', 'Verb'), ('것', 'Noun'), ('없다', 'Adjective')]

kkma:
[('원숭이', 'NNG'), ('도', 'JX'), ('나무', 'NNG'), ('에서', 'JKM'), ('떨어지', 'VV'), ('ㄴ다', 'EFN')]
hannanum:
['원숭이', '도', '나무', '에서', '떨', '어', '지', 'ㄴ다']
[('원숭이', 'NC'), ('도', 'JX'), ('나무', 'NC'), ('에서', 'JC'), ('떨', 'PV'), ('어', 'EC'), ('지', 'PX'), ('ㄴ다', 'EF')]
komoran:
['원숭이', '도', '나무', '에서', '떨어지', 'ㄴ다']
[('원숭이', 'NNP'), ('도', 'JX'), ('나무', 'NNG'), ('에서', 'JKB'), ('떨어지', 'VV'), ('ㄴ다', 'EC')]
okt:
['원숭이', '도', '나무', '에서', '떨어진다']
[('원숭이', 'Noun'), ('도', 'Josa'), ('나무', 'Noun'), ('에서', 'Josa'), ('떨어진다', 'Verb')]

kkma:
[('핑계', 'NNG'), ('없', 'VA'), ('는', 'ETD'), ('무덤', 'NNG'), ('없', 'VA'), ('다', 'EFN')]
hannanum:
['핑계', '없', '는', '무덤', '없', '다']
[('핑계', 'NC'), ('없', 'PA'), ('는', 'ET'), ('무덤', 'NC'), ('없', 'PA'), ('다', 'EF')]
komoran:
['핑계', '없', '는', '무덤', '없', '다']
[('핑계', 'NNG'), ('없', 'VA'), ('는', 'ETM'), ('무덤', 'NNP'), ('없', 'VA'), ('다', 'EC')]
okt:
['핑계', '없는', '무덤', '없다']
[('핑계', 'Noun'), ('없는', 'Adjective'), ('무덤', 'Noun'), ('없다', 'Adjective')]
ArtemisDicoTiar commented 3 years ago

kkma(꼬고마) 분석기가 제일 정확하고, 태그도 맞게 붙이는 데... 원형으로 복원시킨다 ㅠㅠ

komoran이 변형된 형태를 사용하기 때문에 이것으로 진행해보자.

ArtemisDicoTiar commented 3 years ago

코모란 문제

ArtemisDicoTiar commented 3 years ago

꼬꼬마 문제

그냥 NNP를 모두 NNG로 변경해야겠다. 속담에서 고유명사가 나오는 빈도가 낮을 것으로 생각된다.

ArtemisDicoTiar commented 3 years ago

일단 고려대 코퍼스 쿼리가 가능하게끔 형태소 분석결과, 쿼리 제작 두 기능을 메소드로 하는 MorphAnalyzer 클래스를 추가함. 클래스로 만들게 된 이유는 형태소 분석기 Kkma, Kormoran 두개의 인스턴스를 생성하는 데에 필요한 비용이 큰 것으로 보여서 하나의 클래스 내에서 최초 선언시에 인스턴스 생성후 가져다 사용하게끔 만듦.

ArtemisDicoTiar commented 3 years ago

추후에 해당 분석기 로직 문제 발생시 새로 이슈 파서 이슈 핸들링하자.