nltk/tag/__init__.py์ ์๋ pos_tag_sents()์ lang
๋งค๊ฐ๋ณ์๊ฐ ์ ๋ฌ๋์ง ์์ต๋๋ค.
์ปค๋ฐ 69583ceaaaff7e51dd9f07f4f226d3a2b75bea69(nltk/tag/__init__.py์ 110-116ํ)์ ์์ธ ์์ ๋ณ๊ฒฝ๊ณผ ๊ฒฐํฉ๋์ด ์ด์ "NotImplementedError('Currently, NLTK=' eng' ๋๋ lang='rus')'" ๋ฌธ์ฅ์ ํ๊ทธํ ๋.
ํ ๋ฆฌํ์คํธ: https://github.com/nltk/nltk/pull/2186
@ezhangsfl ๊ฐ์ฌ
์ต์ ํ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ lang='eng'
๋งค๊ฐ๋ณ์๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง ์ด ์ค๋ฅ๊ฐ ๊ณ์ ํ์๋์ง๋ง ์๋ํ์ง ์์ต๋๋ค. @ezhangsflll @stevenbird
๋ง์ง๋ง ๋ฆด๋ฆฌ์ค๋ 17 ๋ฒ์งธ์ด์ง๋ง ๋์ค์ ๋ณํฉ๋์์ต๋๋ค.
์ต์ ํ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ
lang='eng'
๋งค๊ฐ๋ณ์๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง ์ด ์ค๋ฅ๊ฐ ๊ณ์ ํ์๋์ง๋ง ์๋ํ์ง ์์ต๋๋ค. @ezhangsflll @stevenbird
(__init__.py) ํ์ผ์ ๋ด์ฉ์ ๋ค์์ผ๋ก ๋ฐ๊ฟ๋๋ค.
#
""
NLTK ํ๊ฑฐ
์ด ํจํค์ง์๋ ํ์ฌ์ ๋ํ ํด๋์ค์ ์ธํฐํ์ด์ค๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
ํ๊น
, ๋๋ ๋จ์ํ "ํ๊น
".
"ํ๊ทธ"๋ ํ ํฐ์ ์ผ๋ถ ์์ฑ์ ์ง์ ํ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ๋ฌธ์์ด์
๋๋ค.
๊ทธ๊ฒ์ ํ์ฌ์ ๊ฐ์. ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํฐ์ ํํ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
(tag, token)
. ์๋ฅผ ๋ค์ด ๋ค์ ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํฐ์
๋ช
์ฌ ํ์ฌ ํ๊ทธ๊ฐ ์๋ 'fly'
๋จ์ด( 'NN'
):
>>> tagged_tok = ('fly', 'NN')
๊ธฐ์ฑํ ํ๊ฑฐ๋ ์์ด๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. Penn Treebank ํ๊ทธ ์ธํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
>>> from nltk import pos_tag, word_tokenize
>>> pos_tag(word_tokenize("John's big idea isn't all that bad."))
[('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 'VBZ'),
("n't", 'RB'), ('all', 'PDT'), ('that', 'DT'), ('bad', 'JJ'), ('.', '.')]
lang="rus"๋ฅผ ์ง์ ํ๋ฉด ๋ฌ์์์ด ํ๊ฑฐ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ฉ
๋ฌ์์ ๊ตญ๋ฆฝ ์ฝํผ์ค ํ๊ทธ ์ธํธ:
>>> pos_tag(word_tokenize("ะะปัั ะพัะพัะพะฟะตะป ะธ ะดะฒะฐะถะดั ะฟะตัะตัะธัะฐะป ะฑัะผะฐะถะบั."), lang='rus') # doctest: +SKIP
[('ะะปัั', 'S'), ('ะพัะพัะพะฟะตะป', 'V'), ('ะธ', 'CONJ'), ('ะดะฒะฐะถะดั', 'ADV'), ('ะฟะตัะตัะธัะฐะป', 'V'),
('ะฑัะผะฐะถะบั', 'S'), ('.', 'NONLEX')]
์ด ํจํค์ง๋ ํ ํฐ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ์ฌ๋ฌ ํ๊ฑฐ๋ฅผ ์ ์ํฉ๋๋ค.
๊ฐ๊ฐ์ ํ๊ทธ๋ฅผ ํ ๋นํ๊ณ ํ๊ทธ๊ฐ ์ง์ ๋ ํ ํฐ์ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค.
๋๋ถ๋ถ์ ํ๊ฑฐ๋ ํ๋ จ ์ฝํผ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋์ผ๋ก ๊ตฌ์ถ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, unigram ํ๊ฑฐ๋ ๋ค์์ ํ์ธํ์ฌ ๊ฐ ๋จ์ด w ์ ํ๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
w ์ ๋ํ ๊ฐ์ฅ ๋น๋ฒํ ํ๊ทธ๋ ํ๋ จ ๋ง๋ญ์น์ ์์์ต๋๋ค.
>>> from nltk.corpus import brown
>>> from nltk.tag import UnigramTagger
>>> tagger = UnigramTagger(brown.tagged_sents(categories='news')[:500])
>>> sent = ['Mitchell', 'decried', 'the', 'high', 'rate', 'of', 'unemployment']
>>> for word, tag in tagger.tag(sent):
... print(word, '->', tag)
Mitchell -> NP
decried -> None
the -> AT
high -> JJ
rate -> NN
of -> IN
unemployment -> None
ํ์ต ์ค์ ํ๊ทธ๊ฐ ํ์๋์ง ์์ ๋จ์ด๋ ํ๊ทธ๋ฅผ ๋ฐ์ต๋๋ค.
None
.
ํ๋ จ ์ค์ ๋ณผ ์ ์์๋ ๋ฐ์ดํฐ์ ๋ํ ํ๊ฑฐ๋ฅผ ํ๊ฐํฉ๋๋ค.
>>> tagger.evaluate(brown.tagged_sents(categories='news')[500:600])
0.73...
์์ธํ ๋ด์ฉ์ NLTK ์ฑ
์ 5์ฅ์ ์ฐธ์กฐํ์ญ์์ค.
""
__future__์์ print_function ๊ฐ์ ธ์ค๊ธฐ
nltk.tag.api์์ ๊ฐ์ ธ์ค๊ธฐ TaggerI
nltk.tag.util์์ ๊ฐ์ ธ์ค๊ธฐ str2tuple, tuple2str, ํ๊ทธ ํด์
nltk.tag.sequential์์ ๊ฐ์ ธ์ค๊ธฐ(
์์ฐจ ๋ฐฑ์คํ ํ๊ฑฐ,
์ปจํ
์คํธ ํ๊ฑฐ,
๊ธฐ๋ณธ ํ๊ฑฐ,
์๊ทธ๋จํ๊ฑฐ,
์ ๋๊ทธ๋จ ํ๊ฑฐ,
๋น
๊ทธ๋จ ํ๊ฑฐ,
ํธ๋ผ์ด๊ทธ๋จ ํ๊ฑฐ,
์ ๋ฏธ์ฌ ํ๊ฑฐ,
์ ๊ท์ ํ๊ฑฐ,
๋ถ๋ฅ๊ธฐ ๊ธฐ๋ฐ ํ๊ฑฐ,
๋ถ๋ฅ์ ๊ธฐ๋ฐPOSTagger,
)
nltk.tag.brill์์ BrillTagger ๊ฐ์ ธ์ค๊ธฐ
nltk.tag.brill_trainer์์ BrillTaggerTrainer ๊ฐ์ ธ์ค๊ธฐ
nltk.tag.tnt์์ ๊ฐ์ ธ์ค๊ธฐ TnT
nltk.tag.hunpos์์ ๊ฐ์ ธ์ค๊ธฐ HunposTagger
nltk.tag.stanford์์ ๊ฐ์ ธ์ค๊ธฐ StanfordTagger, StanfordPOSTagger, StanfordNERTagger
nltk.tag.hmm์์ HiddenMarkovModelTagger, HiddenMarkovModelTrainer ๊ฐ์ ธ์ค๊ธฐ
nltk.tag.senna์์ SennaTagger, SennaChunkTagger, SennaNERTagger ๊ฐ์ ธ์ค๊ธฐ
nltk.tag.mapping์์ import tagset_mapping, map_tag
nltk.tag.crf์์ CRFTagger ๊ฐ์ ธ์ค๊ธฐ
nltk.tag.perceptron์์ PerceptronTagger ๊ฐ์ ธ์ค๊ธฐ
nltk.data ๊ฐ์ ธ์ค๊ธฐ ๋ก๋์์ ์ฐพ๊ธฐ
RUS_PICKLE = (
'taggers/averaged_perceptron_tagger_ru/averaged_perceptron_tagger_ru.pickle'
)
def _get_tagger(lang=์์):
lang == 'rus'์ธ ๊ฒฝ์ฐ:
tagger = PerceptronTagger(๊ฑฐ์ง)
ap_russian_model_loc = 'ํ์ผ:' + str(์ฐพ๊ธฐ(RUS_PICKLE))
tagger.load(ap_russian_model_loc)
๋ ๋ค๋ฅธ:
ํ๊ฑฐ = PerceptronTagger()
๋ฆฌํด ํ๊ฑฐ
def _pos_tag(ํ ํฐ, tagset=์์, tagger=์์, lang=์์):
# ํ์ฌ ์์ด์ ๋ฌ์์์ด๋ง ์ง์ํฉ๋๋ค.
lang์ด ['eng', 'rus']์ ์๋ ๊ฒฝ์ฐ:
NotImplementedError(
"ํ์ฌ NLTK pos_tag๋ ์์ด์ ๋ฌ์์์ด๋ง ์ง์ํฉ๋๋ค."
"(์: lang='eng' ๋๋ lang='rus')"
)
๋ ๋ค๋ฅธ:
tags_tokens = tagger.tag(ํ ํฐ)
if tagset: # ์ง์ ๋ tagset์ ๋งคํํฉ๋๋ค.
lang == 'eng'์ธ ๊ฒฝ์ฐ:
taged_tokens = [
(ํ ํฐ, map_tag('en-ptb', tagset, tag))
tags_tokens์ (ํ ํฐ, ํ๊ทธ)
]
elif lang == '๋ฃจ์ค':
# ๋ชจ๋ธ์ ์๋ก์ด Russion pos ํ๊ทธ์๋ ์ ๋ฏธ์ฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
# https://github.com/nltk/nltk/issues/2151#issuecomment -430709018 ์ฐธ์กฐ
taged_tokens = [
(ํ ํฐ, map_tag('ru-rnc-new', tagset, tag.partition('=')[0]))
tags_tokens์ (ํ ํฐ, ํ๊ทธ)
]
ํ๊ทธ๋_ํ ํฐ ๋ฐํ
def pos_tag(ํ ํฐ, tagset=์์, lang='eng'):
""
NLTK์์ ํ์ฌ ๊ถ์ฅํ๋ ํ์ฌ ํ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ฌ
์ฃผ์ด์ง ํ ํฐ ๋ชฉ๋ก์ ํ๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
>>> from nltk.tag import pos_tag
>>> from nltk.tokenize import word_tokenize
>>> pos_tag(word_tokenize("John's big idea isn't all that bad."))
[('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 'VBZ'),
("n't", 'RB'), ('all', 'PDT'), ('that', 'DT'), ('bad', 'JJ'), ('.', '.')]
>>> pos_tag(word_tokenize("John's big idea isn't all that bad."), tagset='universal')
[('John', 'NOUN'), ("'s", 'PRT'), ('big', 'ADJ'), ('idea', 'NOUN'), ('is', 'VERB'),
("n't", 'ADV'), ('all', 'DET'), ('that', 'DET'), ('bad', 'ADJ'), ('.', '.')]
NB. Use `pos_tag_sents()` for efficient tagging of more than one sentence.
:param tokens: Sequence of tokens to be tagged
:type tokens: list(str)
:param tagset: the tagset to be used, e.g. universal, wsj, brown
:type tagset: str
:param lang: the ISO 639 code of the language, e.g. 'eng' for English, 'rus' for Russian
:type lang: str
:return: The tagged tokens
:rtype: list(tuple(str, str))
"""
tagger = _get_tagger(lang)
return _pos_tag(tokens, tagset, tagger, lang)
def pos_tag_sents(๋ฌธ์ฅ, tagset=์์, lang='eng'):
""
NLTK์์ ํ์ฌ ๊ถ์ฅํ๋ ํ์ฌ ํ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
์ฃผ์ด์ง ๋ฌธ์ฅ ๋ชฉ๋ก, ๊ฐ๊ฐ์ ํ ํฐ ๋ชฉ๋ก์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
:param tokens: List of sentences to be tagged
:type tokens: list(list(str))
:param tagset: the tagset to be used, e.g. universal, wsj, brown
:type tagset: str
:param lang: the ISO 639 code of the language, e.g. 'eng' for English, 'rus' for Russian
:type lang: str
:return: The list of tagged sentences
:rtype: list(list(tuple(str, str)))
"""
tagger = _get_tagger(lang)
return [_pos_tag(sent, tagset, tagger, lang) for sent in sentences]
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ง์ง๋ง ๋ฆด๋ฆฌ์ค๋ 17 ๋ฒ์งธ์ด์ง๋ง ๋์ค์ ๋ณํฉ๋์์ต๋๋ค.