인공지능 씨앗 한글 말뭉치, 2007년 멈춰선 까닭


http://www.bloter.net/archives/260569


자연어 처리는 인공지능 기술에서 중요한 축을 담당한다. 인간의 말을 인식해 메시지를 분석하고 다시 답변을 내놓으려면 자연어를 처리할 수 있는 향상된 기술이 필요하다. 현재 많은 연구들이 인간의 눈을 대체하는 ‘비전 인식’에 몰두하고 있다. 이미지나 영상을 기계가 인식해 사물을 분별하고 나누고 예측하는 다양한 기술들이 선보이고 있다.


인간의 입과 귀를 보완하거나 대신하기 위한 연구도 한창이긴 하다. 애플이 시리나 썸리와 같은 기사 요약 서비스 등이 여기에 해당한다. 번역에서도 자연어 처리는 필수적이다. 하지만 비전 인식에 비해 더딜 수밖에 없다. 문자 언어가 깊숙이 관여돼있기 때문이다.


* 민간이 개발하기엔 너무나도 큰 비용


정부는 한글 말뭉치의 이 같은 성격 때문에 상당한 비용을 들여 프로젝트를 추진했다. 대표적인 사업이 21세기 세종 프로젝트다. 국립국어원은 1998년부터 2007년까지 150억원의 예산을 투입해 이 프로젝트를 완료했다. 여기엔 세종 말뭉치라는 한글 말뭉치 사업이 포함돼있었다. 그것도 무려 2억 어절에 해당하는 방대한 구축 작업이었다. 이는 영국이나 미국, 일본에 뒤지지 않는 규모로 평가됐다.


그렇게 탄생한 세종 말뭉치는 자연어 처리 분야에서 다양하게 활용되고 있다. 대표적으로는 서울대에서 개발한 꼬꼬마 세종 말뭉치 활용 시스템이다. 세종 말뭉치를 데이터베이스에 저장해 웹 프로그램 형태로 구현한 사례다. 말뭉치 통계 정보 조회, 말뭉치 검색, 한국어 쓰기 학습의 세 가지의 기능을 갖추고 있다.


일본어 형태소 분석기 엔진에 세종 말뭉치를 학습해 한국형 형태소 분석기로 탄생한 사례도 있다. 은전한닢 프로젝트에 따라 개발된 ‘mecab-ko’ 형태소 분석기다. ‘mecab-ko‘는 세종 말뭉치에서 2만여 문장을 가져와 분석 엔진을 학습시켰다.


자연어 처리에 광범위하게 활용되던 세종 말뭉치는 2007년 기점으로 업데이트가 사실상 중단됐다. 

더 이상 제2의 21세기 세종 프로젝트가 진행되지 않고 있는 탓이다. 


10년이 지나는 동안 수많은 인터넷 신조어가 탄생하고 있고 광범위하게 일상에 활용되고 있지만 세종 말뭉치에는 반영이 되지 않는다. 비교적 변화가 적은 언어 유형은 상관이 없지만 구어와 같은 메신저 용어 등은 세종 말뭉치에서 품사 구별조차 하지 못하는 실정이다.


세종 말뭉치 사업을 주도하고 관리하고 있는 국립국어원도 아쉬워하기는 마찬가지다. 최정도 국립국어원 학예사는 “국립국어원에서 말뭉치를 만들어서 배포하고 싶지만 지속적으로 지원이 안되는 측면이 있다”고 했다. 그는 “예산을 따서 하고 싶지만 어려운 측면이 있다”고도 했다. 그는 “최신 것들이 코퍼스에 들어와야 하고 구성면에서도 IT와 관련해서 등장하는 단어들을 찾고 싶다면 구성도 잘해야 한다”라며 “하지만 현실적으로 여의치가 않다”고 말했다.


정부가 ’한국형 알파고‘니 하며 인공지능 사업에 1조원의 예산을 투입할 기세지만 한글 말뭉치 사업과 같은 구체적인 항목은 아직 포함되지 않은 상태다.


한국 말뭉치 업그레이드가 단절되면 자연어처리 기술로 인공지능 시장에 진입하고자 하는 스타트업이 부담이 된다. 당장 IT 대기업과 이 분야에서 간극을 좁히기가 어렵다. 네이버와 같은 IT 대기업들은 이미 십수년 간 수집한 뉴스 문서, 기타 블로그와 전문 자료들을 광범위하게 확보해 정교한 말뭉치를 자체적으로 구축해왔다. 오랜 공을 들여 구축한 말뭉치이기에 공개하기도 어렵다. 반면 스타트업이 이에 준하는 수준으로 말뭉치를 구축하기는 비용 문제로 사실상 불가능하다. 말뭉치라는 디지털 커먼스가 공공에서 제공돼야 할 이유이기도 하다.


학계는 웹 서비스화 돼 있는 전문 말뭉치를 사용하면 된다. 고려대 민족문화연구원이 구축한 ’물결 21‘은 대학연구소가 개발한 최대 규모의 디지털 말뭉치다. 국내 4대 일간지의 14년치(2001년~2014년) 6억 어절의 문서가 분석돼있다. 이 서비스를 이용하면 언어 연구에 필요한 결과를 다양한 형태로 받아갈 수 있다(최재웅&이도길. 2014).


그러나 이 말뭉치는 한계도 있다. 외부 형태소 분석기과 결합해 사용하기 어렵다는 점이다. 세종 말뭉치와 달리 소스 파일이 공개돼있지 않아서다. 일반적으로 기분석 사전과 형태소 분석기를 통합하면 높은 정확도와 효율성을 만들어낼 수 있다. 곽수정(2013) 등은 “기분석 사전은 대용량의 품사 부착 말뭉치의 고빈도 어절로 구축되어 형태소 분석기의 속도를 향상시키기 위해 사용돼왔다”고 적고 있다. 기분석 사전을 구축하려면 기존 말뭉치가 필요한데, 소스 파일이 공개되지 않아 두 시스템을 결합하기 어려운 것이다.


연세대 말뭉치, 카이스트 코퍼스 등 공개된 말뭉치가 없지는 않지만 규모로 따지면 세종 말뭉치나 물결21에 비할 바는 못된다. 말뭉치는 공공이 개입해 커먼스로 구축하기에 적합한 모델이라고 할 수 있다.


* 디지털 커먼스로서 한글 말뭉치와 공공의 역할


언어는 끊임없이 변화한다. 신조어 탄생하는가 하면 일부 어휘는 사멸하기도 한다. 예전 단어에 새로운 의미가 부여되는가 하면 단어와 단어의 새로운 결합이 나타나 전혀 다른 용례로 쓰이기도 한다. 말뭉치는 이처럼 역동적인 언어의 변동에 대응할 수 있어야 한다. 자연어 처리를 기반으로 하는 인공지능 기술은 역동성에 대응하는 말뭉치의 힘에 의존할 수밖에 없다.


문제는 막대한 비용이 투입되는 말뭉치를 누가 구축할 것이냐이다. 말뭉치 구축은 따지면 기초연구에 해당한다. 비용은 많이 들지만 곧장 수익이 나지 않는 사업이다. 그것의 공적 가치는 무한하지만 그 자체의 상업적 가치는 제한적일 수밖에 없다. 2007년 이후로 멈춰버린 세종 한글 말뭉치, 인공지능 기술이 부상하는 현재 국면에서 여전히 외면받고 있는 현실이 안타까울 수밖에 없다.


...

Posted by 홍반장水 홍반장水

gensim + word2vec 모델 만들어서 사용하기 



참고 : https://www.lucypark.kr/courses/2015-ba/text-mining.html



#Load data

from konlpy.corpus import kobill

docs_ko = [kobill.open(i).read() for i in kobill.fileids()]


#Tokenize

from konlpy.tag import Twitter; t = Twitter()

pos = lambda d: ['/'.join(p) for p in t.pos(d)]

texts_ko = [pos(doc) for doc in docs_ko]


#Train

from gensim.models import word2vec

wv_model_ko = word2vec.Word2Vec(texts_ko)

wv_model_ko.init_sims(replace=True)

wv_model_ko.save('ko_word2vec.model')    #model create


#Test - 유사도 분석

wv_model_ko.most_similar(pos('정부'))

wv_model_ko.most_similar(pos('초등학교'))





  * 저장된 model 사용하기 : https://radimrehurek.com/gensim/models/word2vec.html


Initialize a model with e.g.:

>>> model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)

Persist a model to disk with:

>>> model.save(fname)
>>> model = Word2Vec.load(fname)  # you can continue training with the loaded model!

The word vectors are stored in a KeyedVectors instance in model.wv. This separates the read-only word vector lookup operations in KeyedVectors from the training code in Word2Vec.

>>> model.wv['computer']  # numpy vector of a word
array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)


model 이 잘 불러와졌는지 확인하려면 model의 내용을 보자. 

model.vocab 하며 내용을 볼 수 있다. 

most_similar 에서 vocaburary에 단어가 없다고 에러나오면 내용을 확인 후 다시 검색해보면 된다. 

저장된 vocab이 '국어' 인지, '국어/Noun' 인지 확인 바람요! 


>>>len(model.vocab)

9867

>>>model.vocab 



Code for the word2vec HTTP server running at https://rare-technologies.com/word2vec-tutorial/#bonus_app



*** 대화 형 word2vec 데모 용 전체 HTTP 서버 코드 : 

     https://github.com/RaRe-Technologies/w2v_server_googlenews



모델 저장 및로드

표준 gensim 메소드를 사용하여 모델을 저장 /로드 할 수 있습니다.

1
2
model.save('/tmp/mymodel')
new_model = gensim.models.Word2Vec.load('/tmp/mymodel')

내부적으로 피클을 사용하는 선택적 mmap를 프로세스 간 메모리 공유 디스크 파일에서 직접 가상 메모리에 모델의 내부 큰 NumPy와 행렬을 보내고 '.

또한 텍스트 및 이진 형식을 사용하여 원본 C 도구로 만든 모델을로드 할 수 있습니다.

1
2
model = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False)
# using gzipped/bz2 input works too, no need to unzip:
model = Word2Vec.load_word2vec_format('/tmp/vectors.bin.gz', binary=True)

온라인 교육 / 훈련 재개

고급 사용자는 모델을로드하고 더 많은 문장으로 계속 교육 할 수 있습니다.

1
2
model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)

시뮬레이트 할 학습 속도 감소에 따라 total_words 매개 변수를 train ()에 맞게 조정해야 할 수도 있습니다 .

C 도구 load_word2vec_format ()에 의해 생성 된 모델로는 교육을 재개 할 수 없습니다 당신은 여전히 ​​그것들을 질의 / 유사성을 위해 사용할 수 있지만, 훈련에 필수적인 정보 (보캐 트리)가 거기에 없습니다.

모델 사용

Word2vec는 여러 단어 유사 작업을 즉시 지원합니다.

1
2
4
5
6
model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
[('queen', 0.50882536)]
model.doesnt_match("breakfast cereal dinner lunch";.split())
'cereal'
model.similarity('woman', 'man')
0.73723527

응용 프로그램에서 원시 출력 벡터가 필요한 경우에는 단어 단위로 이들에 액세스 할 수 있습니다

1
2
model['computer'# raw NumPy vector of a word
array([-0.00449447, -0.003100970.02421786, ...], dtype=float32)

... 또는 en-masse를 model.syn0 의 2D NumPy 행렬로 사용 하십시오 .



...

Posted by 홍반장水 홍반장水

문서탐색하기 테스트 중 오류 발생 http://konlpy.org/ko/latest/examples/explore/


Traceback (most recent call last):

  File "doc_find.py", line 6, in <module>

    from konlpy.corpus import kolaw

  File "/anaconda/lib/python3.6/site-packages/konlpy/__init__.py", line 15, in <module>

    from . import tag

  File "/anaconda/lib/python3.6/site-packages/konlpy/tag/__init__.py", line 4, in <module>

    from ._hannanum import Hannanum

  File "/anaconda/lib/python3.6/site-packages/konlpy/tag/_hannanum.py", line 7, in <module>

    import jpype

ModuleNotFoundError: No module named 'jpype'



깃허브에서 해답 찾음. https://github.com/konlpy/konlpy/issues/122


anaconda python을 이용하여 konlpy를 사용시 발생합니다.
우선 시스템 기본 python에 있는 jpype와 anaconda의 jpype를 삭제 합니다.

sudo pip uninstall jpype
/usr/local/anaconda/bin/pip uninstall jpype

그리고 jpype를 apt-get으로 설치 합니다.

sudo apt-get install python-jpype

그리고 난후 jpype를 테스트 합니다.

sudo python -c "import jpype"
위의 코드가 오류 없이 넘어 가면 시스템의 python은 정상입니다.

그리고 anaconda python에 jpype를 설치 합니다.
/usr/local/anaconda/bin/pip install jpype1

그리고 anacoda python에서 테스트 합니다.
/usr/local/anaconda/bin/python -c "import jpype"
위 코드에서 임포트 오류가 발생하면

anaconda에서 설치한 jpype 라이브러리에서 오류가 발생한것입니다.

시스템 python에 설치된 라이브러리 파일을 덮어 쓰면 오류가 해결 됩니다.

시스템에서 라이버러리를 찾으면

sudo find / -name _jpype.so
[sudo] password for nuri:
/usr/lib/python2.7/dist-packages/_jpype.so
/usr/lib/pyshared/python2.7/_jpype.so
/usr/local/anaconda2/lib/python2.7/site-packages/_jpype.so

위와 같이 세개가 나오는데(사용자 환경에 따라 다릅니다.)
/usr/lib/python2.7/dist-packages/_jpype.so <- 이 파일을
/usr/local/anaconda2/lib/python2.7/site-packages/_jpype.so <- 여기에 덮어 쓰면
해결 됩니다.










.

Posted by 홍반장水 홍반장水