๋๋ ์ต๊ทผ์ NLTK์ Porter ํํ์ ๋ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ๊ทธ ์ถ๋ ฅ๊ณผ ๋ด๊ฐ ์ฌ์ฉํ ๋ค๋ฅธ ๋ฒ์ ์ Porter ํํ์ ๋ถ์๊ธฐ์ ์ถ๋ ฅ ์ฌ์ด์ ์ฝ๊ฐ์ ๋ถ์ผ์น๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๋ฌํ ๋ถ์ผ์น์ ๋ํ ํ์ ์กฐ์น๋ก NLTK ๊ตฌํ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ ์ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
Martin Porter๊ฐ ์ง์ ์์งํ Porter ํํ์ ๋ถ์๊ธฐ์ ๋ค์ํ ์ฐธ์กฐ ๊ตฌํ์ด ์์ต๋๋ค.
http://tartarus.org/~martin/PorterStemmer/
Ruby๊ฐ NLTK๋ฅผ ์จ์ ํ ์ํ๋ก ํ์ธํ๊ธฐ ์ํด ์๋ํ์ต๋๋ค(ํ์ค ์ถ๋ ฅ์์ โโ๋จ์ด๋ฅผ ๊ฐ์ ธ์ค๊ณ ํ์ค ์ถ๋ ฅ์์๋ ์ฆ์ ํํ์ ํํ๋ฅผ ๋ฑ์ด๋).
์คํฌ๋ฆฝํธ $ ruby โโporter_stemmer.rb
๋น๋๋
์ค์ด๋
NLTK์ ๋ํด ์ด๊ฒ์ ํ์ธํ์ต๋๋ค.
์คํฌ๋ฆฝํธ $ ํ์ด์ฌ
ํ์ด์ฌ 2.6.1(r261:67515, 2010๋
6์ 24์ผ, 21:47:49)
[GCC 4.2.1(Apple Inc. ๋น๋ 5646)] darwin
์์ธํ ๋ด์ฉ์ ๋ณด๋ ค๋ฉด "๋์๋ง", "์ ์๊ถ", "ํฌ๋ ๋ง" ๋๋ "๋ผ์ด์ผ์ค"๋ฅผ ์
๋ ฅํ์ญ์์ค.
import nltk
nltk.stem.porter.PorterStemmer().stem_word('shiny')
'์๋'
์ฌํ๊น์ง๋ ๊ทธ๋ฐ๋๋ก ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฐ๊ณผ๋ฅผ ์ํ ์ฌ์ฉ์ dict ํ์ผ(voc.txt)์ ๋ํด ๋์ผํ ํ์ด์ง์ ์ ๊ณต๋ ์์ ๊ฒฐ๊ณผ(output.txt)์ ๋น๊ตํ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๋ณด์ ๋๋ค.
์คํฌ๋ฆฝํธ $ egrep -n '^shiny$' voc.txt
18333:๋น๋๋ค
์คํฌ๋ฆฝํธ $ egrep -n '^shini$' output.txt
18333:์ค์ด๋
๊ทธ๋ฌ๋ NLTK ๊ฒฐ๊ณผ๋ฅผ ์์ ๊ฒฐ๊ณผ ํ์ผ์ ๊ฒฐ๊ณผ์ ์ฒด๊ณ์ ์ผ๋ก ๋น๊ตํ๋ฉด ๋ถ์ผ์น๊ฐ ๋ง์ด ๋ํ๋ฉ๋๋ค(ํ์: ๋จ์ด, ์ ์ ํ ์์ ํํ์ ๋ถ์, ๋ณํ๋ก ํ์๋ ์๋ชป๋ NLTK ํํ์ ๋ถ์).
์คํฌ๋ฆฝํธ $ ./show_bad_stemming_in_nltk.py voc.txt output.txt
์๋์ ์๋์ * ์๋์
์๋์ ์๋์ * ์๋์
์๋ฒ ab *์๋ฒ
Absey Absei *absey
[...]
์์์์ *์์
์ด์ ์ด์ *์ด์
์ด์ ์ด์ ๋ค์ด *์ด์
yongrey yongre * yongrey
Ruby ์ฐธ์กฐ ๊ตฌํ์ ๋ํ ์คํ ๊ฒ์ฌ๋ NLTK ๊ฒฐ๊ณผ๊ฐ ์ค์ ๋ก ๋ฌธ์ ์์ ํ์ธํฉ๋๋ค.
์คํฌ๋ฆฝํธ $ ruby โโporter_stemmer.rb
๋์ฌ์
์๋ฒ ์ด
์๋์
์๋ฒ ์ด
์นจ๋
ab
์๋์
์ฑ์ธ์ด
์ธ๊ณ
์ฐก๊ทธ๋ฆฐ
์ด์
์ด์
์ด์ ์
์ด์
์ฉ๋ฆฌ
์ฉ๋ ์ด
NLTK์ Porter ํํ์ ๋ถ์๊ธฐ๊ฐ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ์ ์ฒด ๋จ์ด ๋ชฉ๋ก์ ์ฒจ๋ถํ์ต๋๋ค.
(์ด ๋ฒ๊ทธ๋ ๋ฒ์ 2.0b9์ ํด๋นํฉ๋๋ค. ๋ชจ๋ ์ด์ ๋ฒ์ ์ ์กด์ฌํ๋ ๊ฒ์ผ๋ก ์์ฌ๋์ง๋ง ํ์ธํ์ง๋ ์์์ต๋๋ค.)
http://code.google.com/p/nltk/issues/detail?id=625์์ ์ด์ ๋จ
gregg.lind๋ 2011-02-09T20:22:57.000Z์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
์๋ฌด๋ ์ํ์ง ์๋๋ค๋ฉด (๊ธ์์ผ๊น์ง) ์ด๊ฒ์ ๊ฐ์ ธ๊ฐ ์ ์์ด ๊ธฐ์ฉ๋๋ค. ์ด ๋ชจ๋์ ๋ง์ด ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ ๋ฆฐ๋
StevenBird1์ 2011-02-14T07:14:49.000Z์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
์ฒจ๋ถ ํ์ผ์ nltk-dev๋ก ์ ์ก๋ Stuart Robinson์ ์์ ์ฌํญ์ ๋๋ค. ์ด๊ฒ์ ์๋ ๋ ผ์๋ Ruby ๋ฒ์ ์ ์๋ก์ด ํฌํธ๊ฐ ์๋ ์ด์ ๋ฒ์ ์ ๋ํ ์ถ๊ฐ ํธ์ง์ผ๋ก ๋ณด์ ๋๋ค. ์ด ์ ๋ฒ์ ์ ํตํฉํ๊ธฐ ์ ์ test/stem.doctest์ ์ถ๊ฐ๋ ํ ์คํธ ์ผ์ด์ค ์ธํธ๊ฐ ํ์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ "goodfirstbug"๋ผ๋ฒจ์ ๋ถ์๋ค. "์ข์ ์ฒซ ๋ฒ์งธ ๋ฒ๊ทธ"๋ stem.doctest (https://github.com/nltk/nltk/blob/master/nltk/test/stem.doctest)์ ๋ง์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค -- ๋ณํฉํ๊ณ ์ถ๋ค๋ฉด ์คํ์ดํธ์ ์์ ์์๋ ํ๋ฅญํ ๊ฒ์ ๋๋ค!
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ, ํนํ @alexrudnick , ์ง๊ธ ํด๊ฒฐ๋ ๊ฒ์ผ๋ก ํ์๋์ด์ผ ํฉ๋๊น?
๋์ถฉ ๋ณด๋ฉด ์๋์ค, ์์ง ํด๊ฒฐ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ง ๋ณด์์ ๋ง์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
@paulproteus โ ๋ง์นจ๋ด ํด๊ฒฐ
Steven์ด ๋ฐฉ๊ธ ๋ณํฉํ ๋ด PR์ _default_ ํํ์ ๋ถ์๊ธฐ ๋์์ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค. Martin์ ์ฐธ์กฐ ๊ตฌํ๊ณผ ์ผ์นํ๋ ๋์์ ์ป์ผ๋ ค๋ฉด mode=PorterStemmer.MARTIN_EXTENSIONS
๋ฅผ PorterStemmer
์์ฑ์์ ๋ช
์์ ์ผ๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค(์ด ์์ฒด๊ฐ Martin์ ์๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ผ์นํ์ง ์์).
ํ๋ฆผ์์ด MARTIN_EXTENSIONS
๋ฅผ ๊ธฐ๋ณธ ๋ชจ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด (์ฐธ์กฐ ๊ตฌํ๊ณผ์ ์ผ๊ด์ฑ์ ์ํด) ๋ ์ข์ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ์ฌ์ฉ์๋ PorterStemmer
๋ผ๋ ๊ฒ์ด Martin์ ์ฐธ์กฐ ๊ตฌํ์ฒ๋ผ ์ฆ์ ์๋ํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ๊นจ์ง ๊ฒ์ด๋ผ๋ ์ ์
๋๋ค. NLTK๋ฅผ ์
๊ทธ๋ ์ด๋ํ๋ NLTK์ ์ด์ ๊ตฌํ์ ์ฌ์ฉํ๋ ์ฌ๋์ ์ค๊ธฐ์ ์ผ๋ถ๋ง ๋ณ๊ฒฝ๋์ด ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ๋ฏธ๋ฌํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์์ ์ค๋ซ๋์ ์์์ฐจ๋ฆฌ์ง ๋ชปํ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ์ต์
์ ๊ธฐ๋ณธ๊ฐ์ ์ ํ ์ฌ์ฉํ์ง ์๊ณ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋ชจ๋์์ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ฌ์ฉํ ๊ฒ์ ๋ช
์์ ์ผ๋ก ์ ํํ๋๋ก ์๊ตฌํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ๋ ๊นจ๋จ๋ฆด ์ ์์ง๋ง _๋ช
๋ฐฑํ_ ๋ฐฉ์์ผ๋ก ๊ทธ๋ ๊ฒ ํ ๊ฒ์ด๋ฏ๋ก(๊ทธ๋ฅ ํํ์ ๋ถ์๊ธฐ๋ฅผ ์ธ์คํด์คํํ๋ ค๊ณ ํ๋ฉด ์ด์ ๋ฐฉ์์ด ํญ๋ฐํ ๊ฒ์
๋๋ค) ๋ฆด๋ฆฌ์ค ๋
ธํธ๋ฅผ ์ฝ์ง ์๊ณ ์
๊ทธ๋ ์ด๋๋ฅผ ์ํํ๋ ์ฌ๋๋ค์ด ์กํ์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ์์ ๋์ ์๋๋ฆฌ์ค ์ค ํ๋๋ฅผ ํผํ ์ ์์ง๋ง ๋ชจ๋ ์๋ก์ด ํํ์ ๋ถ์๊ธฐ ์ฌ์ฉ์์๊ฒ ๋ ๋ง์ ์ ํ ์์
์ ์๊ตฌํ๋ ๋๊ฐ๋ฅผ ์น๋ฅด๊ฒ ๋ฉ๋๋ค.
์ด๋ค ์ต์
๋ ์๋ฒฝํ์ง ์์ต๋๋ค. NLTK_EXTENSIONS
๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ํํ์ง๋ง ๋์ํ์ง ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ์๊ฒฌ์ด ์์ผ์ ๊ฐ์?
@ExplodingCabbage : ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๋ง์ง๋ง ์ต์ ์ ์ ํธํ๋ฉฐ ๋ฆด๋ฆฌ์ค ์ ๋ณด์ ์ ์ ํ ๊ฒฝ๊ณ ์ ํจ๊ป ๋ค์ ์ฃผ์ ๋ฆด๋ฆฌ์ค(์์ ์ด ์ฒ์ ํ์๋๋ ๋ง์ด๋ ๋ฆด๋ฆฌ์ค๊ฐ ์๋)์์ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ๋๋ค์ด ๊ฐ์ ๋ก ๋ฌธ์๋ฅผ ์ฝ๊ณ ๋น์ ์ ์์ ์์ ์ด์ต์ ์ป๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ๋ถ๋ค์ ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
๋๋ nltk์ ๊ธฐ๋ณธ PorterStemmer๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์์ง ๋ฐฑ์๋๋ฅผ ์์ฑํด ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ง์ Porter ํํ์ ๋ถ์๊ธฐ ๊ตฌํ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ์์ง ๋ชปํ์ต๋๋ค. ์ด์ Javascript๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก ํธ์๋์์ ์์ ํ๊ณ ์์ผ๋ฏ๋ก ํ๋ก ํธ์๋์ ๋ฐฑ์๋๊ฐ ๋จ์ด์ ์ด๊ฐ์ ๋ค๋ฅด๊ฒ ๋ง๋๋ ๋ฒ๊ทธ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๋๋ก Javascript์์ nltk์ ๊ธฐ๋ณธ PorterStemmer ๋์์ ๋ค์ ๋ง๋ค์ด์ผ ํ๋ ๊ฒฝ์ฐ ๋ฌด์์ ์ดํด๋ด์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ๋๊ตฐ๊ฐ(์ด์ฉ๋ฉด @ExplodingCabbage ?)๊ฐ ๋๋ฅผ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฆฌํฌ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋ค.
MARTIN_EXTENSIONS ๋ชจ๋๋ก ๋ชจ๋ ๊ฒ์ ๋ค์ ์ธ๋ฑ์ฑํ ์๊ฐ์ด ์์ต๋๋ค. ํ๋ ๋ฐ ๋ช ์ฃผ๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค...
@josephcc porter.py ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ข
์์ฑ์ด ์์ผ๋ฉฐ ์ฌ์คํ๊ฑฐ๋ ๋ง๋ฒ ๊ฐ์ ์์
์ ์ํํ์ง ์์ผ๋ฉฐ ์ผ๋ จ์ ๋ฌธ์์ด ์กฐ์๋ง ์ํํฉ๋๋ค. PorterStemmer
ํด๋์ค๋ฅผ JavaScript๋ก ์ด์ํ๊ณ if self.mode == self.NLTK_EXTENSIONS
๋ถ๊ธฐ๋ง ์ ์งํ๊ณ ๋ค๋ฅธ ๋ถ๊ธฐ์ ๋
ผ๋ฆฌ๋ ๋ฒ๋ฆฌ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
๋ฌผ๋ก 5๋ถ์ง๋ฆฌ ์์
์ด๋ ์๋ฒฝํ ์์
์ ์๋์ง๋ง ์คํ ๊ฐ๋ฅํ ์์
์
๋๋ค. ๋ํ https://github.com/nltk/nltk/blob/develop/nltk/test/unit/test_stem.py ์์ PorterTest
๋ฅผ ํ์ธํ๊ณ ์ ํ์ฑ์ ํ์ธํ๊ธฐ ์ํด JavaScript ๊ตฌํ์ ๋ํด ํ
์คํธ ์ผ์ด์ค๋ฅผ ์คํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๋น์ ์ ์ผ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@paulproteus โ ๋ง์นจ๋ด ํด๊ฒฐ