제목 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습(문서 분류)
분류 Etc 조회수 394
작성일자 2015.05.06 출처 마이크로소프트웨어 1월호
첨부파일   작성자 dbguide
 
 

◎ 연재기사 ◎

기계 학습의 A to Z : scikit-learn을 활용한 기계 학습(모델 평가)
기계 학습의 A to Z : scikit-learn을 활용한 기계 학습 (차원 축소)
기계 학습의 A to Z : scikit-learn을 활용한 기계 학습 (군집화, Clustering)
기계 학습의 A to Z : IPython notebook과 scikit-learn을 활용한 기계 학습
기계 학습의 A to Z : scikit-learn을 활용한 기계 학습(문서 분류)
기계 학습의 A to Z : 인구 변화 시각화와 예측

기계 학습의 A to Z

scikit-learn을 활용한 기계 학습(문서 분류)

 

얼마 전 인류의 최고의 발명으로 쿠텐베르크의 인쇄기가 꼽혔다. 인류의 다른 최고 발명품을 보아도, 문자나 종이가 들어있다. 인류가 지금까지 발전할 수 있었던 이유 중 하나는 문자로 기록을 남기고 그 기록으로 후세가 문명을 좀 더 발전시켰기 때문일 것이다. 인터넷 시대에 접어들면서, 수많은 문서들이 생겨나고 이들 문서를 잘 분류해 지식화해야 하는 문제가 생겼다. 구글 검색 엔진은 페이지랭크(PageRank) 알고리즘으로 기계가 문서를 보고 문서들을 연결해 사용자가 적절한 정보를 찾도록 했다.

 

인터넷 시대에 정보는 더 이상 홍수라는 말로는 포함할 수 없을 정도로 많다. 2009년 이후 전 세계 데이터 생성량은 매년 두 배 가량 증가하고 있으며 2012년 데이터 총량은 2.8제타바이트(ZB, 1ZB=1조GB)이었지만 2020년에는 40제타바이트로 늘어난 전망이다(The Digital Universe in 2020, IDC, 2012). 소셜 네트워크(SNS)에서 올라오는 글을 봐도, 하루에 우리 주변에서 얼마나 많은 정보(데이터)가 생겨나고 있는지 알 수 있다. SNS를 통해 올라오는 글을 볼 때 친구들이나 지인이 선별한 글을 보기 때문에 내 관심에 맞는 글들이 많지만 어떤 경우에는 글을 선별해야 하는 경우도 있다. 이를 테면 이메일을 받을 때, 시스메이 스팸 메일인지 업무 메일인지 개인 메일인지 선별만 해 준다 해도 이메일에 신경을 덜 쓰게 된다. 더 나아가 어떤 문서가 긍정적인지 부정적인지 구별할 수 있다면, SNS에서 관심 영역에 대해 긍정적이거나 부정적인 효과가 있는지 실시간으로 알 수 있게 된다. 지금부터 파이썬 기계 학습 라이브러리인 scikit learn을 활용해 문서를 분류한다.

 

요리 조리법 분류

저녁 시간대 TV을 보면 매일 어김없이 맛집 소개가 나온다. 때로는 맛집들이 숨기고 있던 특별 조리법을 공개하기도 한다. 좀 특별한 날이나 집에서 맛있게 음식을 해 먹으려고 할 때, 조리법을 인터넷에서 찾는다. 이렇게 조리법은 많은 사람들에게 사랑 받는 주제다. 다음과 같은 가정을 해본다. 이런 추세에 맞춰 사용자가 요리 조리법을 시스템에 올리고 다른 사용자들이 평가해 최고의 요리를 추천하는 시스템을 만들고자 한다. 이를 위해 기본적으로 사용자가 조리법을 올리면 자동으로 음식에 대한 분류를 해 주었으면 한다. 이 분류를 할 수 있는 시스템을 만들어 보자.

 

데이터 구하기

아직 사용자에게 받은 조리법이 없기 때문에 조리법을 먼저 구해 기계를 학습한다. 조리법의 범주는 다음과 같이 한식과 제빵 조리법으로 크게 2개로 나눈다. 데이터를 크롤링하기 위해 scrapy(http://scrapy.org/)를 사용하겠다. scrapy는 빠르고 쉽게 확장할 수 있으며 다양한 형태로 결과물을 출력할 수 있는 장점이 있다. 다음과 같이 설치한다(윈도우에서는 다음을 참고한다. http://doc.scrapy.org/en/latest/intro/install.html#platform-specific-installation-notes) pip install scrapy 사용법을 간단히 소개하자면, 다음 순서와 같다(http://doc.scrapy.org/en/latest/intro/tutorial.html#intro-tutorial) 1. 새로운 scrapy 프로젝트를 만든다. 2. 추출할 데이터를 저장할 Item를 정의한다. 3. 데이터를 가져올(crawl) 페이지와 데이터를 추출할 spider를 작성한다. 4. 데이터를 다른 형태로 저장한다. 이러한 순서에 따라 데이터를 추출해 보겠다. 간단한 명령어로 프로젝트를 만든 후, Item를 정의한다. 저장할 데이터는 조리법이다.

 

 

<리스트 1> Item 정의 import scrapy class CookItem(scrapy.Item): receipe = scrapy.Field()

 

Item은 scrapy.Item를 상속받는다. 조리법만 저장한다. 웹페이지에서 추출할 부분을 정의해야 하는데 이때, XPath나 CSS로 사용할 수 있다. 사용하는 웹 브라우저의 개발자 도구로 이를 찾을 수 있다. machine_learning401.png

 



<그림 1> 파이어폭스의 파이어버그를 이용한 추출 영역 정의 추출하고자 하는 영역을 선택한 후 xpath를 복사한다. 이와 더불어, scrapy는 명령어 쉘(shell)를 지원한다. 찾고자 하는 주소와 함께 다음 명령어를 실행한다.

 

 

<리스트 2> scrapy 쉘 scrapy shell 'http://scrapy.org' --nolog

 

명령어를 터미널에 넣은 후, 복사한 xpath를 넣으면 <리스트 3>과 같은 데이터를 구할 수 있다.

 

 

<리스트 3> scrapy 쉘 명령어 예제 >>> sel.xpath("//h2/text()").extract()[0] u'Welcome to Scrapy' >>> sel.xpath('//title/text()').extract() [u'Slashdot: News for nerds, stuff that matters']

 

몇 번에 시도를 통해 추출할 내용을 찾았으면, 다음은 spider를 작성할 차례다.

 

 

<리스트 4> scrapy의 spider 작성(일부) class Cookpider(CrawlSpider): name = "cook" allowed_domains = ["navercast.naver.com"] start_urls = [ "http://navercast.naver.com/magazine_contents. nhn?attrId=&contents_id=71980&leafId=2212", .. "http://navercast.naver.com/magazine_contents. nhn?attrId=&contents_id=71970&leafId=2212"] def parse(self, response): receipe = [] for sel in response.xpath('/html/body/div[1]/ div[4]/dl/dd/ul/li/span'): receipe.extend(sel.xpath('text()'). extract()) item = CookItem() item['recipe'] = clean(''.join(recipe)) yield item

 

<리스트 4>는 완전히 실행되지는 않은 코드다. 일부 코드지만 주요한 코드는 그대로 들어 가 있다. 변수 name은 spider의 이름이다. scrapy 명령어를 사용할 때 이 이름을 사용한다. 변수 start_urls은 크롤링 할 페이지 주소이다. 여기에 있는 주소는 모두 크롤링해 대상 데이터를 추출한다. parse 메소드는 데이터를 추출하고 정의한 CookItem의 객체에 넣는다. 추출한 정보를 다음 명령어로 CSV 형태의 파일로 저장한다. scrapy crawl cook -o items.csv 이 과정으로 사용할 100개의 한식 조리법과 82개의 제빵 조리법 데이터를 구했다. <리스트 5>는 데이터의 일부 내용이다.

 

 

<리스트 5> 데이터 일부 내용 "미니사이즈의 가래떡핫도그는 눈으로만 봐도 앙증맞아요. 계피향이 은은한 팥고물에 겉은 바삭하고 속은 쫄깃해 따뜻할 때 먹으면 아이들 건강 간식으로 최고예요. 냄비에 팥 두른 팬에 약한 불로 노릇해질 때까지 굽고, 칼집을 깊게 내면 떡이 익으면서 자연스레 벌어져 공간이 생겨요. 칼집 속에 앙금을 짜 넣고 다진 호두와 피칸을 뿌려 마무리. 앙금에 꿀을 살짝 발라 다진 견과류를 뿌리면 잘 붙어요." "늘 먹던 밑반찬이 지겨울 때 뚝딱 만들기 좋은 메뉴예요. 달달하면서도 부드러운 단호박과 고소하면서 바삭한 호두 식감이 어우러져 계속 먹어도 물리지 않아요. 단호박은 껍질째 깨끗이 씻어 씨를 파내고 먹기 좋게 사각 썰고, 호두는 반으로 가르고, 식용유을 넣고 한 번 더 조려 마무리." ...

 

필요한 데이터를 추출했더라도 다양한 이유로 좀 더 손질을 해야 할 필요가 생긴다.

 

문서를 벡터로 변환

조리법을 종류별로 분류하려면 어떻게 해야 할까. 어떻게 어떤 조리법은 한식 조리법이고 어떤 조리법은 제빵 조리법으로 나눌 수 있을까. 좀 더 확대하면, 한 문서가 다른 문서와 유사하다고 할 수 있을까. 쉽게 생각할 수 있는 것이 조리법 즉, 문서를 구성하는 단어이다. 한식 조리법에는 “고추장”, “간장”이라는 단어가 자주 나올 테고, 제빵 조리법에는 “빵”, “오븐”과 같은 단어가 자주 나올 테다. 각 조리법의 종류에 따른 자주 나오는 단어가 있을 테고 이 단어들로 구별이 가능하다. 다음 표는 임의의 조리법에 대한 단어표이다. 실제 데이터는 아니지만 이해를 돕는데 좋을 것이다. machine_learning402.png

 



<표 1> 조리법에 사용된 단어 조리법 1은 조리법 2와 공통 단어가 없고 조리법 3과는 하나의 단어가 있다. 이에 반해 조리법 2는 조리법 3가 2개의 공통 단어가 있다. 이렇게 볼 때, 조리법의 단어는 조리법의 종류를 구별할 수 있는 토대이며 조리법간의 유사한 어휘를 많이 갖을수록 유사한 조리법이라 할 수 있다. 일반적으로, 이렇게 문서를 단어의 빈도수로 나타내는 방법을 단어 주머니(bag of words)라 한다. scikit learn 라이브러리는 CountVecorizer 클래스가 있어 각 문서에 단어를 세어준다.(<리스트 6> 참조)

 

 

<리스트 6> 조리법을 CountVecorizer로 변환 rawdata = pd.read_csv(get_fullpath(fileaname), sep=sep) vectorizer = CountVectorizer(max_df=10, min_df=1) X = vectorizer.fit_transform(np. array(rawdata['receipt word']))

 

편의상 pandas를 이용해 CSV 파일에서 읽은 문자열을 배열로 변환해 CountVectorizer의 메소드인 fit_transform에 입력값으로 넣는다. 너무 빈도가 높은 단어나 낮은 단어는 분류하는데 도움이 되지 않는다. 이와 관련된 min_df, max_df 매개 변수를 적당하게 조절해야 한다.

 

나이브 베이즈(Naive Bayes) 기법

토마스 베이즈(Thomas Bayes)는 1701년에 영국(잉글랜드) 남서부의 부유한 집안에서 태어났다. 베이즈 정리로 알려진 공식은 프랑스의 수학자이자 천문학자인 피에르 시몽 라플라스(Pierre-Simon Laplace)가 완성했다.

베이즈 정리는 조건부 확률(conditional probability)을 바탕으로, 새로운 데이터의 범주(종류)를 정할 때 각 범주에서 관찰된 속성을 기반으로 범주에 대한 확률을 구한다. 베이즈의 장점은 빠르고 단순하며 훈련 데이터 크기에 별 상관없이 효과적이다. 다음은 베이즈 정리이다. 이 정리를 이해하려면 사건(event), 확률(probability), 독립 사건(independent events)등을 미리 학습해야 한다.

machine_learning403.jpeg

 



<그림 2> 베이즈 정리

베이즈 정리를 다음과 같이 변경할 수 있다.

 

machine_learning407.jpeg

 



<그림 3> B을 , 로 변경한 베이즈 정리

단어 , 일 때, C가 될 확률은 C일 때, 단어 , 가 있을 확률인 우도(likelihood)와 사전(prior) 확률인 P(C)을 곱하고 P(, )으로 나눈 값이다. 그럼 왜 “순박한(naive)" 베이즈인가? 사실, 우도인 를 계산하기 쉽지 않다. 이 때, , 가 서로 독립이라고 순박하게(naive) 가정하면 P(|C)P(|C)가 돼 계산하기가 매우 쉬워진다.

machine_learning404.jpeg

<그림 4>나이브 베이즈 정리

하지만 문서에서 단어과 단어는 독립적이지 않다. 다시 말해, 문서에서 각 단어들은 서로 연관돼 질 수 있다. 이렇게 변경된 식은 엄격한 의미에서는 잘못된 가정을 가지고 있지만 실제 문제에서 좋은 결과를 얻는다.

machine_learning405.jpeg

 



<표 2> 가상 훈련 데이터 단어의 각 확률

<표 2>는 가상 훈련 데이터에서 나온 단어에 대한 분류를 나타낸 표이다. 총 조리법은 30개이고 단어 3개에 대한 분류이다. 좀 더 자세하게 말하면, 한식 조리법은 총 20개이고 이 중 고추장이 나온 조리법은 18개 나오지 않은 조리법은 2개 이다. 제빵 조리법은 총 10에서 고추장이 1개의 조리법에서 나왔고 9개의 조리법에서 나오지 않았다. 파우더와 오븐도 마찬가지이다. 새로운 조리법의 단어를 보니, 고추장은 나오지 않고, 파우더와 오븐은 나왔고 하자. 이 조리법은 한식일까, 제빵일까? 나이브 베이즈 정리에 넣어보자.

machine_learning406.jpeg

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 



두 개의 확률을 구해 보자. 두 식에서 부모는 같기 때문에 계산량을 줄이기 위해 생략하자.

machine_learning409.jpeg

 

 



주어진 새로운 조리법은 한식 조리법일 확률보다 제빵 조리법일 확률이 매우 높다. 백분율로 나타내면 다음과 같다.

한식 조리법 : 0.00025 / (0.336+0.00025) = 0.00074349442
제빵 조리법 : 0.336 / (0.336+0.00025) = 0.99925650557

scikit learn은 다양한 나이브 베이즈를 지원한다http://scikit-learn.org/stable/modules/naive_bayes.html).

 

 

<리스트 9> CountVecorizer로 변환해 나이브 베이즈 MultinomialNB에 적용 y = np.array(rawdata['category']) nb = MultinomialNB() nb.fit(X, y) print('score {}'.format(nb.score(X, y)))

 

결과로 score 1.0 값은 나왔다. 이는 훈련 데이터에 대해서 모두 정확하게 예측했다는 의미이다. scikit learn에서 지원하는 KFold와 cross_val_score를 사용해 5개의 훈련 데이터와 테스트를 만들어 교차 검증을 해 보자.

 

 

<리스트 10> 교차 검증 kf = KFold(len(y), n_folds=5) scores = cross_val_score(nb, X, y, cv=kf) print('cross val score {}'.format(sum(scores)/5))

 

출력은 다음과 같다.

cross val score 0.966816816817

정확도는 96%로 꽤 높다. 좀 더 정확도를 높일 수는 없을까?

 

전처리1 - POS 태거 추가

위에서 단어를 세는 방법의 문제점은 단어를 그대로 사용하기 때문에 생긴다. 이를테면, “고추장을”과 “고추장과”를 구별하지 못해 다른 단어로 인식한다는 점이다. 이를 해결하기 위해 자연어 처리 기법을 사용하겠다. 쉬운 방법을 고려해 보면, 명사만으로 단어를 줄여 조리법을 비교해 보면 좀 더 나은 결과를 얻을 수도 있다.

동사도 좋은 어휘가 될 수 있지만 우선적으로 명사만을 적용해 보겠다. POS 태거(POS tagger)를 수행해야 한다http://ko.wikipedia.org/wiki/자연_언어_처리 참고). 이 작업을 하기 한국어 형태소 분석기를 사용해야 한다. 인터넷에 다양한 KOMORAN, HAM, 꼬꼬마, 한나눔과 같은 공개된 형태소 분석기가 있다. 이들 중 관심있는 형태소 분석기를 사용한다. 다음은 한나눔을 사용해 명사을 추출했다.

 

 

<리스트 11> 명사만 추출한 조리법 미니 사이즈 가래떡핫도그 계피 은은 팥고물 바삭하 쫄깃해 따뜻 아이 건강 최고 냄비 노릇해질 칼집 공간 칼집 앙금 호두 피칸 마무리 앙금 견과류 뿌리 밑반찬 뚝딱 메뉴 달달하면서 단호 고소 바삭한 호두 식감 단호 껍질째 깨끗 사각 호두 식용유 마무리 빼빼로데 아이 친구 달라 외면 아이 유치원 학교 따뜻 초콜릿 중탕 전자레인지 초콜릿 과자 스틱 초콜릿 유산지 상자 구멍 초콜렛 스프링클 장식 초콜릿 마무리 기호 아몬드 땅콩 ..

 

정확하게 명사형만 추출하지 못할 수 있다. 이 과정에서 정확도를 높이는 것도 주요한 연구 주제이기 때문에 어느 정도 만족하고 넘어가야 한다. 명사만으로 추출한 조리법으로 다시 훈련해 보고 정확도를 측정해 보자. <리스트 6>에서 입력하는 문서만 변경하면 된다. all_morph_n.tsv로 변경하고 위의 과정을 다시 실행한다. <리스트 12>는 결과다.

 

 

<리스트 12> 명사 조리법을 나이브 베이즈에 적용 score 1.0 cross val score 0.918018018018

 

예상했던 것과 달리 오히려 정확도가 떨어졌다. 왜일까? 일반적인 경우 POS 태거 후 좀 더 나은 결과를 예상하는데 이번 경우에는 결과가 좋지 않다. 아마 단어수가 많이 적어 정보력도 떨어질 것으로 생각된다. 그러면 이번에는 동사도 추가해 명사와 동사로 데이터를 변경해 보자.

 

 

<리스트 13> 명사 동사만 추출한 조리법 미니 사이즈 가래떡핫도그 앙증맞 계피 팥고물 바삭하 쫄깃해 아이 최고 냄비 두르 노릇해질 칼집 공간 생기 칼집 앙금 다지 호두 피칸 뿌리 마무리 앙금 바르 다지 견과류 뿌리 밑반찬 뚝딱 만들 메뉴 달달하면서 단호 고소 바삭한 호두 식감 어우러지 물리 단호 껍질째 파내 사각 호두 가르 식용유 마무리 빼빼로데 아이 친구 외면 아이 만들 유치원 학교 들리 보내 따뜻 초콜릿 중탕 전자레인지 돌리 초콜릿 씌우 과자 스틱 초콜릿 묻히 유산지 상자 구멍 초콜렛 굳히 스프링클 뿌리 장식 초콜릿 굳히 마무리 기호 따르 다지 아몬드 땅콩 뿌리 ...

 

명사만을 추출한 데이터보다 데이터량이 많아졌다. 입력 파일을 all_morph_nv.tsv로 변경해 다시 실행한다.

 

 

<리스트 14> 명사 동사 조리법을 나이브 베이즈에 적용 score 1.0 cross val score 0.923573573574

 

명사만으로 이루어진 데이터보다 동사를 추가해 약 0.05%가 좋아졌다. 어쨌든 데이터를 좀 더 추가해 나은 결과를 얻었지만 최초 원시 데이터로 실행했을 때보다 좋지 않다. 아마도 원시 데이터에 좀 더 많은 정보력이 더 좋은 결과를 얻을 수 있게 한 듯하다. 이번 경우에는 좋은 경과가 없었지만 일반적인 경우에는 자연어 처리로 더 나은 결과를 얻을 수 있다.

 

전처리2 - 추가

지금까지 작업 한 것을 정리하면, 가장 먼저, 조리법에서 나온 단어를 세어 문서를 벡터화했고 그 다음, 전처리1 단계에서 같은 단어가 될 수 있도록 POS 태거를 사용했다. 이번에는 단어 빈도를 생각해 보자. 각 단어는 문서마다 중요도가 다를 수 있다. 예를 들어, 10개의 문서가 있는데 각 문서마다 ‘집’이라는 단어가 동일한 빈도로 있다고 하자. 그러면 이 단어로 각 문서를 구별할 수 있는 없다. 반면, ‘강아지’라는 단어는 10개의 문서 중 5개의 문서에만 나오고 특히, 2개의 문서에서 많이 나온다면 10개의 문서에서 5개의 문서를 구별할 수 있는 단어가 된다. 따라서 각 단어는 단어나 나타나는 문서의 빈도와 문서내의 단어가 나타날 빈도를 통해 중요한지를 수치화된다. 이를 용어 빈도-역 문서 빈도(TF-IDF, Term frequency-inverse document frequency)라고 한다. scikit learn는 TfidfTransformer 클래스를 제공한다.

 

k평균(k-means) 기법 적용

지금부터는 다른 기법들을 알아보자. 지난번에 다루었던 군집화 기법인 k평균으로 조리법을 군집화할 수 있다. k평균 기법을 다시 상기해 보면, 임의로 정해지는 초기 중앙점에 영향을 크게 받고 k값을 정하는 것도 중요한 선택이라는 점이다. 지금은 분류할 조리법이 2가지이므로 k=2로 정한다. 알고리즘은 비교적 단순하며 여러 영역에 적용할 수 있다는 장점도 있다.

 

 

<리스트 15> 조리법에 k평균 기법 적용 kmeans = KMeans() kmeans.fit(X) print('homogeneity {}'.format(metrics.homogeneity_ score(y, kmeans.labels_))) print('completeness {}'.format(metrics.completeness_ score(y, kmeans.labels_))) print('v_measure {}'.format(metrics.v_measure_ score(y, kmeans.labels_)))

 

비교적 간단하게 적용할 수 있다. 매개 변수를 변경해 성능 개선을 할 수도 있지만 무작위 초기 중앙점이 큰 영향을 미치는 것을 평가값으로 알 수 있다. 다음은 여러 번 실행해 좋은 결과를 출력했다.

 

 

<리스트 16> 조리법에 k평균 기법 적용 KMeans metric for raw =============================== homogeneity 0.506666197624 completeness 0.16944386127 v_measure 0.253957105862 KMeans metric for noun and verb ===================== ============ homogeneity 0.366464824452 completeness 0.123222819866 v_measure 0.184431155552

 

v-measure는 Homogeneity와 Completeness의 조합 평균으로 이번에도 원시 데이터로 좀 더 나은 결과 얻었다. 매개 변수를 변경하면 좀 더 나은 결과를 얻을 수도 있다.
비음수 행렬 인수분해(NMF, Non-negative matrix factorization)
비음수 행렬 인수분해(NMF, Non-negative matrix factorization)는 다변향 분석(multivariate analysis) 알고리즘으로 음수가 없는 하나의 행렬을 두 개의 음수가 없는 행렬로 분해한다. PCA(Principle Component Analysis)와 유사하지만 음수가 없다는 점이 가장 큰 차이점이다. 이 차이점으로 분해된 두 행렬 중에 기저 행렬의 원소들을 더해 원래의 행렬과 유사하게 표현할 수 있다. NMF는 이미지 등의 패턴 학습과 패턴 인식에 우수한 성능을 보인다. 특히 다차원 입력 데이터에서 최적의 기초 패턴을 분리해 이들의 선형 조합으로 전체 데이터를 근사할 수 있기 때문에 데이터 특징 추출에 유용하다. scikit learn은 NMF을 지원하다. 사용법도 매우 간단하다. 그럼, 2개의 조리법에 대해 NMF를 적용해 주제어를 추출해 보자.

 

 

<리스트 17> 조리법에 NMF로 적용해 주제어를 추출하기 위한 일부 코드 nmf = decomposition.NMF(n_components=2).fit(X) feature_names = vectorizer.get_feature_names() for topic_idx, topic in enumerate(nmf.components_): print "Topic #%d:" % topic_idx print " ".join([feature_names[i] for i in topic. argsort()[:-50:-1]])

 

결과는 <리스트 18>과 같다.

 

 

<리스트 18> 조리법에 NMF로 적용해 주제어 추출하기 위한 일부 코드 Topic #0:반죽 핸드 단계 믹서 거품 상태 버터 달걀 오븐 쿠키 다음 실리콘 설탕 180 냉장고 주걱 손거품기 박력 실온 예열한다 바닐라설탕 유산지 케이크 소금 초콜릿 준비 휴지 휘핑한다 크림 생크림 이상 우유 예열한 완성 냄비 무스 시트 노른자 치즈 디저트 만들 가루 내리 따뜻 필링 베이킹파우더 실온상태 베리 철판이형제 Topic #1:마무리 만들 끓이 버무리 올리 두르 양념장 양념 껍질 곁들이 뿌리 대파 재료 국물 익히 데치 벗기 불리 열무 제거 헹구 소스 식용유 건지 오징어 토마토 양파 바르 수박 반찬 부추 즐기 비비 식히 소금 달걀 달구 장어 버섯 한입 냄비 어울리 마늘 중약 단호 다지 요리 어슷 Topic #1은 제빵 조리법의 주제어이고 Topic #2는 한식 조리법에 주제어인 듯하다. 주제어를 활용해 다른 여러 작업을 할 수 있기 때문에 매우 유용한 기법이라 할 수 있다.

 

Topic #1은 제빵 조리법의 주제어이고 Topic #2는 한식 조리법에 주제어인 듯하다. 주제어를 다른 여러 작업을 할 수 있기 때문에 매우 유용한 기법이라 할 수 있다.

 

결론

지금까지 문서 분류의 한 예제로 요리 조리법을 분류했다. 먼저, 훈련 데이터룰 구하기 위해 웹페이지에서 크롤링했다.. 한식 조리법과 제빵 조리법에서 단어를 벡터화했다. 이 벡터화된 조리법에 나이브 베이즈를 적용해 조리법을 구분했다. 좀 더 정확도를 높이기 위해 자연어처리를 했지만 결과는 별로였다. 이와 더불어, k평균 기법을 적용해 군집화했고 마지막으로 NMF 적용해 주제어를 추출했다.

 

출처 : 마이크로소프트웨어 1월호

제공 : 데이터전문가 지식포털 DBguide.net

 

[출처] http://www.dbguide.net/knowledge.db?cmd=view&boardUid=185431&boardConfigUid=20&boardStep=&categoryUid=574

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
17 PyCLIPS Python Module file 졸리운_곰 2017.05.31 1481
16 A Flask API for serving scikit-learn models file 졸리운_곰 2017.05.31 589
15 tensorflow-kr.pdf [텐서플로우 튜토리얼] 한글 번역본 file 졸리운_곰 2016.11.25 4476
14 TensorFlow의 기본 사용법 졸리운_곰 2016.11.25 604
13 텐서플로우 시작하기 file 졸리운_곰 2016.11.25 773
12 Integrating Python and R Part III: An Extended Example file 졸리운_곰 2016.11.16 527
11 Integrating Python and R Part II – Executing R from Python and Vice Versa 졸리운_곰 2016.11.16 1543
10 Integrating Python and R into a Data Analysis Pipeline – Part 1 졸리운_곰 2016.11.16 635
9 Calling R from Python file 졸리운_곰 2016.11.16 450
8 TensorFlow의 기본 사용법 졸리운_곰 2016.06.11 725
7 텐서플로우 시작하기 file 졸리운_곰 2016.06.11 774
6 기계 학습의 A to Z : 인구 변화 시각화와 예측 file 졸리운_곰 2015.05.21 1736
» 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습(문서 분류) file 졸리운_곰 2015.05.21 2402
4 기계 학습의 A to Z : IPython notebook과 scikit-learn을 활용한 기계 학습 file 졸리운_곰 2015.05.21 2006
3 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습 (군집화, Clustering) file 졸리운_곰 2015.05.21 2084
2 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습 (차원 축소) file 졸리운_곰 2015.05.21 2182
1 기계 학습의 A to Z : scikit-learn을 활용한 기계 학습(모델 평가) [1] file 졸리운_곰 2015.05.21 1411
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED