<jupyter_start><jupyter_text>TEXT MINING for BEGINNER- 본 자료는 텍스트 마이닝을 활용한 연구 및 강의를 위한 목적으로 제작되었습니다.- 본 자료를 강의 목적으로 활용하고자 하시는 경우 꼭 아래 메일주소로 연락주세요.- 본 자료에 대한 허가되지 않은 배포를 금지합니다.- 강의, 저작권, 출판, 특허, 공동저자에 관련해서는 문의 바랍니다.- **Contact : ADMIN(<EMAIL>)**---  DAY 10. 영어 텍스트 전처리 실습하기: NLTK- Python의 NLTK 패키지를 활용해 텍스트 데이터를 전처리하는 방법에 대해 다룹니다.---  1. 영어 텍스트 데이터를 전처리하는 방법 알아보기: NLTK---  1.1. NLTK 패키지 설치하기---<jupyter_code># 한국어 텍스트 전처리를 도와주는 NLTK 패키지를 설치합니다.

#!pip install nltk<jupyter_output><empty_output><jupyter_text>1.2. 단어의 원형을 복원하는 첫 번째 방법 알아보기: Stemming---<jupyter_code># NLTK 패키지에서는 세 가지 Stemming 도구를 제공합니다.
# 각 Stemmeer는 Stemming을 하는 방법과 기준이 서로 다릅니다.
# 각각의 Stemmer 마다 특성이 다르니 사용해보고 알맞은 Stemmer를 골라 사용해야합니다
# 일반적으로 Porter Stemmer가 가장 많이 활용됩니다

# 1) Porter Stemmer

# Porter Stemmer를 불러옵니다.
from nltk.stem import PorterStemmer
ps = PorterStemmer()

print("1. cooking :", ps.stem("cooking"))
print("2. cookery :", ps.stem("cookery"))
print("3. believes :", ps.stem("believes"))
print("4. using :", ps.stem("using"))
# 2) Lancaster Stemmer

# Lancaster Stemmer를 불러옵니다.
from nltk.stem import LancasterStemmer
ls = LancasterStemmer()

print("1. cooking :", ls.stem("cooking"))
print("2. cookery :", ls.stem("cookery"))
print("3. believes :", ps.stem("believes"))
print("4. using :", ls.stem("using"))
# 2) Regexp Stemmer

# Regexp Stemmer를 불러옵니다.
from nltk.stem import RegexpStemmer
rs = RegexpStemmer('ing')

print("1. cooking :", rs.stem("cooking"))
print("2. cookery :", rs.stem("cookery"))
print("3. believes :", rs.stem("inglesidie"))
print("4. using :", rs.stem("using"))<jupyter_output>1. cooking : cook
2. cookery : cookery
3. believes : lesidie
4. using : us<jupyter_text>1.3. 단어의 원형을 복원하는 두 번째 방법 알아보기: Lemmatizing---<jupyter_code># Lemmatizing은 사전을 기반으로 단어의 원형을 찾아 복원합니다.
# NLTK의 Lemmatizing 기능을 활용하기 위해서는 별도로 사전을 다운로드 받아야 합니다.

#import nltk
#nltk.download('wordnet')
# Lemmatizer를 불러옵니다.
from nltk.stem import WordNetLemmatizer
import nltk
lemmatizer = WordNetLemmatizer()

# Lemmatizer는 lemmatize(WORD, pos=POS) 함수로 호출합니다.
# pos 변수에는 v, n, a 세 가지 품사를 입력할 수 있습니다. (필수는 아님)
print("1-1. cooking :", lemmatizer.lemmatize("cooking"))
print("1-2. cooking(pos=\"v\") :", lemmatizer.lemmatize("cooking", pos="v"))
print("1-3. cooking(pos=\"n\") :", lemmatizer.lemmatize("cooking", pos="n"))
print("2. cookbooks :", lemmatizer.lemmatize("cookbooks"))
print("3. believes :", lemmatizer.lemmatize("believes", pos="v"))
print("4. buses :", lemmatizer.lemmatize("buses"))
print("5. using :", lemmatizer.lemmatize("using", pos="v"))<jupyter_output>1-1. cooking : cooking
1-2. cooking(pos="v") : cook
1-3. cooking(pos="n") : cooking
2. cookbooks : cookbook
3. believes : believe
4. buses : bus
5. using : use<jupyter_text>1.4. 단어의 원형을 복원하는 세 번째 방법 알아보기: Replacer---<jupyter_code># Replacer를 불러옵니다.
from replacers import RegexpReplacer
replacer = RegexpReplacer()

# replace(SENTENCE) 함수는 문장 내 줄임말을 원래의 형태로 복원합니다.
sentence = "I should've done that thing I didn't do."
new_sentence = replacer.replace(sentence)
print(new_sentence)<jupyter_output>I should have done that thing I did not do.<jupyter_text>1.5. 문단을 문장 단위로, 문장을 단어 단위로 분리하기---<jupyter_code># 1) Sentence Tokenizer
# Sentence Tokenizer를 불러옵니다.
from nltk.tokenize import sent_tokenize

paragraph = "Hello World. How are you? It's good to see you. Thanks for buying this book."
# sent_tokenize(PARAGRAPH) 함수는 다수의 문장이 포함된 문단을 문장 단위로 잘라 리스트로 만듭니다.
sentences_list = sent_tokenize(paragraph)
print(sentences_list)
# 2) Word Tokenizer
# Word Tokenizer를 불러옵니다.
from nltk.tokenize import word_tokenize

sentence = "It's good to see you"
# word_tokenize(SENTENCE) 함수는 문장을 단어 단위로 잘라 리스트로 만듭니다.
word_list = word_tokenize(sentence)
print(word_list)<jupyter_output>['It', "'s", 'good', 'to', 'see', 'you']<jupyter_text>1.6. 영문 형태소분석하기---<jupyter_code># NLTK의 형태소분석 기능을 활용하기 위해서는 별도의 다운로드가 필요합니다.

#import nltk
#nltk.download('averaged_perceptron_tagger')
import nltk

word_list = word_tokenize("Text mining is difficult but very valuable.")
# NLTK 형태소분석기의 pos_tag(WORD_LIST) 함수의 WORD_LIST에는 문자열(문장)이 아닌 단어단위로 구분된 리스트를 넣어줍니다.
word_tagging_list = nltk.tag.pos_tag(word_list)
print(word_tagging_list)<jupyter_output>[('Text', 'NN'), ('mining', 'NN'), ('is', 'VBZ'), ('difficult', 'JJ'), ('but', 'CC'), ('very', 'RB'), ('valuable', 'JJ'), ('.', '.')]<jupyter_text>1.7. 단어 리스트에서 불필요한 단어 제거하기: 불용어 제거---<jupyter_code># NLTK의 불용어 제거 기능을 활용하기 위해서는 별도로 불용어 사전을 다운로드 받아야 합니다.

#import nltk
#nltk.download('stopwords')
from nltk.tokenize import word_tokenize
from replacers import RegexpReplacer
# 불용어 리스트를 불러옵니다.
from nltk.corpus import stopwords

# 불용어 리스트를 확인합니다.
# 불용어 리스트에 포함된 단어는 불용어로 취급하여 제거합니다.
english_stop_list = list(stopwords.words('english'))
print(english_stop_list)<jupyter_output>['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'no[...]<jupyter_text>1.8. [1.1 ~ 1.7] 과정 활용하기---<jupyter_code># 1.1 ~ 1.5 과정을 순서대로 수행합니다.

# 1. 원본문단
paragraph = "Hello World. It's good to see you. Thanks for buying this book."
print(paragraph)
# 2. 문자열을 모두 소문자로 변경
paragraph = paragraph.lower()
print(paragraph)
# 3. 문장의 줄임말을 원래의 형태로 복원
paragraph = replacer.replace(paragraph)
print(paragraph)
# 4. 여러개 문장이 포함된 문단을 문장 단위로 구분
sentence_list = sent_tokenize(paragraph)
print(sentence_list)
# 5. 문장을 단어 단위로 구분
token_sentence_list = []

for sentence in sentence_list:
    word_list = word_tokenize(sentence)
    token_sentence_list.append(word_list)
    print(word_list)
# 6-1. 단어 단위로 구분된 문장에서 불용어 제거
for token_sentence in token_sentence_list:
    for token in token_sentence:
        if token in english_stop_list:
            token_sentence.remove(token)
    print(token_sentence)
# 6-2. 기본으로 제공되는 불용어 외의 단어는 임의로 추가해주면 더 좋을 결과를 얻을 수 있습니다.
english_stop_list += [".", "is"]

for token_sentence in token_sentence_list:
    for token in token_sentence:
        if token in english_stop_list:
            token_sentence.remove(token)
    print(token_sentence)
# 7. 형태소태깅
tag_sentence_list = []

for token_sentence in token_sentence_list:        
    tag_list = nltk.tag.pos_tag(token_sentence)
    tag_sentence_list.append(tag_list)
    print(tag_list)
# 8-1. 원형복원: Stemming
from nltk.stem import PorterStemmer
ps = PorterStemmer()

for tag_sentence in tag_sentence_list:
    print([ps.stem(word) for word, pos in tag_sentence])
# 8-1. 원형복원: Lemmatizing
from nltk.stem import WordNetLemmatizer
import nltk
lemmatizer = WordNetLemmatizer()

for tag_sentence in tag_sentence_list:
    lemma_sentence = []
    for word, pos in tag_sentence:
        # 품사가 형용사(a), 동사(v), 명사(n)인 경우에만 품사를 옵션으로 넣어줍니다.
        if pos.lower()[0] in ["a", "v", "n"]:
            lemma_sentence.append(lemmatizer.lemmatize(word, pos=pos.lower()[0]))
        else:
            lemma_sentence.append(lemmatizer.lemmatize(word))
    print(lemma_sentence)<jupyter_output>['hello', 'world']
['good', 'see']
['thanks', 'buy', 'book']
{'fraction_non_alphanumeric': 0.16675257731958762, 'fraction_numerical': 0.010824742268041237, 'mean_word_length': 4.800448430493273, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '389724', 'license': 'Apache-2.0', 'n_tokens_mistral': 3892, 'n_tokens_neox': 4324, 'n_words': 850, 'path': 'practice-note/10_text-mining-for-beginner_python-english-nlp.ipynb', 'repo_name': 'fingeredman/text-mining-for-beginner', 'size': '7770'}