nltk에서 제공하는 word_tokenize 는 띄어쓰기 기준으로 토큰화를 진행한다. 왜냐하면 영어는 띄어쓰기로 토큰화가 되기 때문.
all_words = set(
word for sentence in train for word in word_tokenize(sentence[0])
)
all_words

-> 말뭉치 만들었는데 메리가 메리는 다 다른 단어로 인식
t = [({word : (word in word_tokenize(x[0])) for word in all_words}, x[1]) for x in train]
clf = nltk.NaiveBayesClassifier.train(t)
clf.show_most_informative_features()

-> 뭔가 이상하다.
test_sentence = '난 수업이 마치면 메리랑 놀거야'
test_sen_feature = {
word.lower() : (word in word_tokenize(test_sentence.lower())) for word in all_words
}
clf.classify(test_sen_feature)

-> 긍정의 문장이였으나 부정의 결과가 나와버렸다. 이유는 형태소 분석을 안했기때문이다. 한글은 형태소에서 의미가 완전히 달라져서 토큰단위로 하면 안된다.
def tokenize(doc):
return ['/'.join(t) for t in pos_tagger.pos(doc, norm=True, stem=True)]
train_docs = [(tokenize(row[0]), row[1]) for row in train]
train_docs

-> 형태소별로 나눠져있는 것을 확인
각 문장 다시 새롭게 분류

분류된 문장을 훈련

새로운 문장 테스트


-> 매우 잘나오는 것을 확인 할 수 있다.
한글은 형태소별로 분류하여서 나이브 베이즈 분류로 감성분석을 할 수 있다.
어떤 문장든, 음성이든, 무엇이든 벡터로 표시할 수 있으면 무엇이든 거리를 측정할 수 있다.
어떤 방식으로 벡터화 할 수 있다면, 서로간에 거리를 재서 유사도를 측정할 수 있다.
형태소별 등장 횟수가 벡터의 요소가 되어서 벡터공간에 올릴 수 있다는 아이디어!
from sklearn.feature_extraction.text import CountVectorizer # 글자들을 세는 것
vectorizer = CountVectorizer()
비교할 문장 설정 후 문장의 형태소 분석
한글이기때문에 형태소 분석 필수 -> Okt의 morphs를 사용한다.

nltk 패키지를 사용하기 위해서 띄어쓰기로 구분된 문장으로 다시 만들기
nltk는 영어 기준이기에 띄어쓰기별로 형태소를 구분한다. 이것을 이용하기 위해, 한글도 형태소별로 띄어쓰기가 된 형태의 문장을 만들고, nltk에 넣고 분석!

-> contents_for_vectorize 에 새롭게 문장을 만듬
CountVectorizer 에 새로운 문장을 훈련 및 변환
X = vectorizer.fit_transform(contents_for_vectorize)
만들어진 것을 배열로 만들고 비교해보자

-> 형태소별 어느 문장에 몇번 등장했는지 확인 할 수 있다.
테스트용 문장을 입력 후 벡터로 변환
새로운 문장 형태소로 분리하였다가 다시 문장으로 만들어준다.
new_post = ['상처받기 싫어 괜찮아']
new_post_tokens = [t.morphs(row) for row in new_post]
new_post_for_vectorize = []
for content in new_post_tokens:
sentence = ''
for word in content:
sentence = sentence + ' ' + word
new_post_for_vectorize.append(sentence)
new_post_for_vectorize


TF : 단어 빈도. 특정 단어가 한 문서 내에 얼마나 자주 등장하는지
DF : 문서 빈도. 특정 단어를 포함한 여러 문서가 몇개인지
이런 요소들은 수치화가 되고 이것을 이용해서 벡터공간에 올리는 아이디어
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(min_df=1, decode_error='ignore')

X = vectorizer.fit_transform(contents_for_vectorize)-> 사용 법은 CountVectorizer과 완전히 똑같다.X.toarray().transpose()

new_post_vec = vectorizer.transform(new_post_for_vectorize)
new_post_vec.toarray()
-> 사용법은 CountVectorizer과 완전히 똑같다.

