저번 글에 소개했던 것처럼, 토픽 모델링 툴인 tomoto의 Python 패키지 버전을 며칠 전에 공개했었습니다. 이번 포스팅에서는 Python에서 이를 이용해서 쉽게 토픽 모델링을 하는 예제 코드를 공유하고자 합니다.
$ pip install --upgrade tomotopy
의외로 간단합니다. 바로 보도록 하시죠.
참 쉽죠? 단 입력 파일인 input_file.txt의 모양을 잘 생각해보셔야합니다. 이 파일은 한 줄에 문헌 하나를 담고 있다고 가정합니다. 또한 각 단어들은 공백 문자로 구분되어 있어야하구요. 그게 아니라면 제대로 처리가 되지 않겠죠?
자연언어처리에서 제일 중요한 건 전처리죠. 그런데 이 코드에는 전처리 부분이 없습니다. 입력 파일이 전처리되지 않았다면 결과가 이쁘게 나오지 않을테니 nltk를 이용해 전처리하는 코드를 추가해보도록 하겠습니다.
전처리 코드를 이용하면 토픽 모델에 좀더 깔끔한 데이터를 입력할 수 있겠죠?
실행하면 다음과 같은 결과를 얻을 수 있으실 겁니다. 제가 사용한 데이터는 호텔 리뷰 데이터였습니다.
Topic #0 great, hotel, view, stay, nice, beach, locat, street, room, plaza
Topic #1 locat, hotel, great, walk, good, room, staff, close, time, distanc
Topic #2 park, hotel, not, charg, free, internet, no, room, day, fee
Topic #3 room, nice, bed, small, clean, comfort, hotel, good, bathroom, littl
Topic #4 servic, hotel, stay, not, time, wait, minut, food, check, get
Topic #5 hotel, not, check, room, book, charg, told, stay, would, us
Topic #6 room, smell, smoke, not, dirti, like, clean, carpet, bed, stay
Topic #7 good, need, hotel, room, clean, locat, staff, price, updat, nice
Topic #8 hotel, good, close, airport, nice, shuttl, stay, clean, place, breakfast
Topic #9 breakfast, no, room, coffe, not, machin, clean, ice, good, fridg
Topic #10 stay, great, staff, hotel, nice, room, friendli, clean, good, again
Topic #11 room, not, air, hotel, no, condit, night, work, sleep, ac
Topic #12 room, night, door, nois, hotel, could, next, floor, peopl, hear
Topic #13 desk, staff, front, not, hotel, servic, help, friendli, no, check
Topic #14 stay, not, hotel, place, would, get, price, again, night, look
Topic #15 room, desk, front, call, get, us, not, check, back, day
Topic #16 bathroom, shower, room, not, door, toilet, no, need, water, wall
Topic #17 pool, water, not, hot, hotel, no, shower, nice, tub, kid
Topic #18 hotel, not, stay, would, renov, inn, star, disappoint, expect, year
Topic #19 room, bed, not, hotel, book, two, one, us, doubl, king
한국어 전처리는 영어에 비해 까다롭습니다. 명사나 형용사, 동사 등에 조사나 어미가 복잡하게 결합하고, 항상 단어 단위로 띄어쓰기를 하는것도 아니기 때문이죠. 이 때문에 한국어 분석을 위해서는 형태소 분석기가 필요합니다. 다행히도 여러 한국어 형태소 분석기가 이미 개발되어 있고, 또 파이썬에서도 쉽게 이들을 사용할 수 있어서, 한국어 분석도 편하게 진행할 수 있습니다. 여기에서는 마침 '과거의 제'가 개발한 kiwi의 파이썬 버전을 이용해보도록 하겠습니다. (kiwi 설치 역시 pip install --upgrade kiwipiepy 로 쉽게 하실 수 있습니다.)
마찬가지로 위에서처럼 add_doc에 tokenize(line)을 넣어주면 되겠죠.
(추가) 불용어를 지정하여 제거하고 싶은경우 아래와 같이 조건을 하나 더 추가할 수도 있겠습니다.
용어 가중치 정책에 대해서는 이전 포스팅에서 다룬 바 있으니 해당 글(https://bab2min.tistory.com/605)을 참조하시면 되겠습니다. Step 3에서 사용한 호텔 리뷰 데이터에 IDF 가중치 정책을 사용한 결과는 다음과 같습니다.
Topic #0 coffe, breakfast, no, cereal, tv, fridg, egg, juic, shower, cup
Topic #1 need, bathroom, carpet, dirti, shower, old, wall, not, stain, smell
Topic #2 plaza, street, fremont, great, vega, casino, downtown, locat, nice, la
Topic #3 air, water, hot, shower, work, ac, no, heat, condition, condit
Topic #4 beach, great, love, view, pool, nice, beauti, food, restaur, kid
Topic #5 dirti, bed, toilet, sheet, bathroom, bug, towel, stain, hair, carpet
Topic #6 bed, doubl, king, queen, size, room, two, book, us, park
Topic #7 locat, squar, walk, central, great, hotel, good, london, station, excel
Topic #8 peopl, not, get, back, never, go, look, like, around, say
Topic #9 breakfast, good, restaur, great, conveni, food, locat, nice, hotel, comfort
Topic #10 good, need, clean, staff, friendli, great, nice, price, stay, comfort
Topic #11 check, desk, told, call, ask, us, front, said, not, get
Topic #12 nois, hear, loud, thin, wall, door, noisi, sleep, could, night
Topic #13 smoke, smell, cigarett, non-smok, non, like, room, dog, stale, odor
Topic #14 desk, front, call, us, check, told, manag, phone, not, fix
Topic #15 star, price, not, hotel, rate, qualiti, expect, it, stay, better
Topic #16 charg, fee, park, internet, per, pay, extra, day, free, hilton
Topic #17 pool, ice, machin, floor, hot, elev, door, no, water, swim
Topic #18 ever, iron, worst, i, pillow, stay, servic, not, bed, time
Topic #19 shuttl, airport, park, close, flight, walk, driver, taxi, ride, bu
입력 데이터는 같은데 전혀 다른 결과가 나왔죠? 이는 자주 등장하는 단어 hotel, room 등의 가중치를 낮게 계산하고, 적게 등장한 단어들의 가중치를 높게 계산하는 데에서 기인한 차이입니다.
내친김에 가중치를 PMI로 계산한 결과도 보시죠.
Topic #0 view, beach, walk, locat, nice, great, close, restaur, hotel, disneyland
Topic #1 good, locat, breakfast, clean, staff, price, nice, great, hotel, valu
Topic #2 pool, hot, water, cold, no, heat, swim, tub, indoor, con
Topic #3 great, nice, staff, stay, friendli, hotel, famili, good, comfort, clean
Topic #4 plaza, great, casino, fremont, vega, downtown, nice, hotel, street, stay
Topic #5 shower, water, toilet, work, door, bathroom, no, broken, hot, not
Topic #6 food, restaur, order, bar, breakfast, buffet, dinner, servic, tabl, coffe
Topic #7 check, desk, front, rude, us, card, manag, servic, ask, arriv
Topic #8 check, desk, call, front, room, us, told, back, get, went
Topic #9 internet, wifi, breakfast, free, no, access, servic, connect, slow, not
Topic #10 dog, pet, outsid, sign, secur, keep, tabl, light, open, lot
Topic #11 nois, loud, sleep, noisi, night, hear, next, room, air, sound
Topic #12 smell, smoke, room, dirti, carpet, stain, sheet, like, bathroom, cigarett
Topic #13 stay, not, place, money, noth, i, hotel, would, pictur, do
Topic #14 need, old, room, bed, not, bathroom, dirti, updat, air, carpet
Topic #15 locat, airport, hotel, shuttl, walk, great, squar, good, central, conveni
Topic #16 bed, doubl, king, size, room, queen, two, book, small, suit
Topic #17 need, inn, hotel, motel, place, price, stay, ok, holiday, night
Topic #18 no, coffe, fridg, microwav, iron, towel, tv, refriger, maker, soap
Topic #19 park, charg, fee, resort, per, extra, pay, hotel, cost, car
용어 가중치 정책은 LDAModel 뿐만 아니라 tomotopy에서 제공하는 나머지 모든 토픽 모델(DMR, HDP, MGLDA, PA, HPA)에 대해서도 적용 가능합니다.
이외에도 좀더 세세하게 토픽 모델링을 적용하고 싶으신 분들은 tomotopy 한국어 API문서를 살펴보시면 되겠습니다.
지금까지 tomotopy를 이용해 쉽게 토픽 모델링 하는 방법에 대해서 살펴보았습니다. 다음 번에는 tomotopy를 이용해 좀 더 다양한 데이터와 모델을 사용해보는 방법을 공유해보도록 하겠습니다~
[Python] tomotopy로 문헌별 토픽 비중 계산하기 (6) | 2019.12.01 |
---|---|
Chrono-gram을 이용해 라틴어 고문헌 연대 추정하기 (3) | 2019.09.16 |
[토픽 모델링] 대량의 문헌을 주제에 따라 클러스터링해보기 (3) | 2019.07.10 |
Python용 토픽 모델링 패키지 - tomotopy 개발 (12) | 2019.05.19 |
[Kiwi] 지능형 한국어 형태소 분석기 0.6버전 업데이트 (1) | 2018.12.09 |
[Tensorflow] 문자 인식용 신경망 Python3 코드 (2) | 2018.11.14 |
댓글 영역