import nltk
nltk.download('averaged_perceptron_tagger')
nltk.download("gutenberg")
nltk.download('punkt')
nltk.download('reuters')
nltk.download("stopwords")
nltk.download("taggers")
nltk.download("webtext")
nltk.download("wordnet")

nltk.corpus.gutenberg.fileids()

emma_raw = nltk.corpus.gutenberg.raw("austen-emma.txt")
print(emma_raw[:1302])

"""
Explanation: NLTK 자연어 처리 패키지 소개
형태소 분석 해주는 라이브러리가 NLTK
NLTK(Natural Language Toolkit) 패키지는 교육용으로 개발된 자연어 처리 및 문서 분석용 파이썬 패키지다. 다양한 기능 및 예제를 가지고 있으며 실무 및 연구에서도 많이 사용된다.
NLTK 패키지가 제공하는 주요 기능은 다음과 같다.

샘플 corpus 및 사전
토큰 생성(tokenizing)
형태소 분석(stemming/lemmatizing)
품사 태깅(part-of-speech tagging)
구문 분석(syntax parsing)

샘플 corpus

샘플 corpus 및 사전
우리말로 말뭉치. 트레이닝 데이터
corpus는 여러 가지가 있는데 그 중의 일부만 리스트업을 해두었다.
태깅은 사람이 해야 한다. 태깅 정보가 다 들어 있다. 워낙 양이 많다보니 하나하나 직접 설치를 해보았다.

corpus는 분석 작업을 위한 샘플 문서 집합을 말한다. 단순히 소설, 신문 등의 문서를 모아놓은 것도 있지만 대부분 품사. 형태소, 등의 보조적 의미를 추가하고 쉬운 분석을 위해 구조적인 형태로 정리해 놓은 것이 많다.
NLTK 패키지의 corpus 서브패키지에서는 다음과 같은 다양한 연구용 corpus를 제공한다. 이 목록은 전체 corpus의 일부일 뿐이다.

averaged_perceptron_tagger Averaged Perceptron Tagger
book_grammars:  Grammars from NLTK Book
brown:  Brown Corpus
chat80:  Chat-80 Data Files
city_database:  City Database
comparative_sentences Comparative Sentence Dataset
dependency_treebank. Dependency Parsed Treebank
gutenberg:  Project Gutenberg Selections
hmm_treebank_pos_tagger Treebank Part of Speech Tagger (HMM)
inaugural:  C-Span Inaugural Address Corpus
large_grammars:  Large context-free and feature-based grammars for parser comparison
mac_morpho:  MAC-MORPHO: Brazilian Portuguese news text with part-of-speech tags
masc_tagged:  MASC Tagged Corpus
maxent_ne_chunker:  ACE Named Entity Chunker (Maximum entropy)
maxent_treebank_pos_tagger Treebank Part of Speech Tagger (Maximum entropy)
movie_reviews:  Sentiment Polarity Dataset Version 2.0
names:  Names Corpus, Version 1.3 (1994-03-29)
nps_chat:  NPS Chat
omw:  Open Multilingual Wordnet
opinion_lexicon:  Opinion Lexicon
pros_cons:  Pros and Cons
ptb:  Penn Treebank
punkt:  Punkt Tokenizer Models
reuters:  The Reuters-21578 benchmark corpus, ApteMod version
sample_grammars:  Sample Grammars
sentence_polarity:  Sentence Polarity Dataset v1.0
sentiwordnet:  SentiWordNet
snowball_data:  Snowball Data
stopwords:  Stopwords Corpus
subjectivity:  Subjectivity Dataset v1.0
tagsets:  Help on Tagsets
treebank:  Penn Treebank Sample
twitter_samples:  Twitter Samples
unicode_samples:  Unicode Samples
universal_tagset:  Mappings to the Universal Part-of-Speech Tagset
universal_treebanks_v20 Universal Treebanks Version 2.0
verbnet:  VerbNet Lexicon, Version 2.1
webtext:  Web Text Corpus
word2vec_sample:  Word2Vec Sample
wordnet:  WordNet
words:  Word Lists

이러한 corpus 자료는 설치시에 제공되는 것이 아니라 download 명령으로 사용자가 다운로드 받아야 한다.
End of explanation
"""


from nltk.tokenize import word_tokenize
word_tokenize(emma_raw[50:100])   #,도 별도로 token으로 만들어준다.

from nltk.tokenize import RegexpTokenizer
t = RegexpTokenizer("[\w]+")   #글자로 인식할 수 있는 거 1개 이상. ,는 생략
t.tokenize(emma_raw[50:100])

from nltk.tokenize import sent_tokenize
print(sent_tokenize(emma_raw[:1000])[3])

"""
Explanation: 토큰 생성(tokenizing)
문장을 쪼개는 것. 전체 텍스트를 쪼개는 과정. 어떻게 쪼개느냐? 그건 다 다르다. 자기가 원하는 방식으로
문서를 분석하기 위해서는 우선 긴 문자열을 분석을 위한 작은 단위로 나누어야 한다. 이 문자열 단위를 토큰(token)이라고 한다.
End of explanation
"""


from nltk.stem import PorterStemmer
st = PorterStemmer()
st.stem("eating")

from nltk.stem import LancasterStemmer
st = LancasterStemmer()
st.stem("shopping")

from nltk.stem import RegexpStemmer
st = RegexpStemmer("ing")
st.stem("cooking")

from nltk.stem import WordNetLemmatizer
lm = WordNetLemmatizer()
print(lm.lemmatize("cooking"))
print(lm.lemmatize("cooking", pos="v"))
print(lm.lemmatize("cookbooks"))

print(WordNetLemmatizer().lemmatize("believes"))
print(LancasterStemmer().stem("believes"))

"""
Explanation: 형태소 분석
형태소 분석이란 어근, 접두사/접미사, 품사(POS, part-of-speech) 등 다양한 언어적 속성의 구조를 파악하는 작업이다. 구체적으로는 다음과 같은 작업으로 나뉜다.

stemming (어근 추출)
lemmatizing (원형 복원)
POS tagging (품사 태깅)

### Stemming and lemmatizing
End of explanation
"""


from nltk.tag import pos_tag
tagged_list = pos_tag(word_tokenize(emma_raw[:100]))
tagged_list

from nltk.tag import untag
untag(tagged_list)

"""
Explanation: POS tagging
POS(part-of-speech)는 품사를 말한다. 

Part-of-Speech Tagset
https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.htm
http://www.ibm.com/support/knowledgecenter/ko/SS5RWK_3.5.0/com.ibm.discovery.es.ta.doc/iiysspostagset.htm
End of explanation
"""


