예제1) [ One-hot encoding ] 토큰화된 아래 단어를 원-핫 벡터화하여 출력하기
조건)
- 단어 : '나 는 자연어 처리 를 배운다'
결과)
코드)
tokens = '나 는 자연어 처리 를 배운다'
tokens = tokens.split()
tokens
#형태소별 인덱스로 번호 부여
word_to_index = {word : index for index, word in enumerate(tokens)} #딕셔너리 형태
print('정수 인코딩 :', word_to_index)
#원 - 핫 벡터 생성 함수 정의
def one_hot_encoding(word, word_to_index):
one_hot_vector = [0]*(len(word_to_index))
index = word_to_index[word]
one_hot_vector[index] = 1
return one_hot_vector
#형태소별 원-핫 베터 출력
for word in tokens:
print(word, '\t', one_hot_encoding(word,word_to_index))
예제2) [ BoW ] 아래 문장에 불용어를 제거하여 BoW를 만들기
조건)
- 문장 : If you do not walk today, you will have to run Tomorrow
- 사용함수 : sklearn.feature_extraction.text 모듈의 CountVectorizer
- 불용어 처리를 할것.
결과)
코드)
# Bag of Words (BoW, 등장하는 단어들의 숫자를 세서 넣어두는 주머니) 만들기
corpus = ['If you do not walk today, you will have to run Tomorrow']
from sklearn.feature_extraction.text import CountVectorizer #CountVectorizer는 class
vector = CountVectorizer(stop_words='english')
bow = vector.fit_transform(corpus) #Type : scipy.sparse._csr.csr_matrix (희소행렬)
print(vector.get_feature_names_out()) #토큰화 된 단어 목록을 알파벳순으로 확인 (0~10)
print(bow.toarray()) #bow의 빈도수를 배열형태로 알파벳으로 나열하고 빈도수를 표시 , you가 10번이고 2번 나왔기 때문에 맨끝이 '2'임
print(vector.vocabulary_) #단어 토큰과 인덱스를 확인가능
# bow와 빈도수를 데이터프레임으로 만들기
#import pandas as pd
#df = pd.DataFrame(bow.toarray(), columns=vector.get_feature_names_out())
예제3-1) [ DTM ] 여러 문장을 토큰화하고 토큰을 가나다 순서대로 인덱스화하기
조건)
- 문장모음 : '사고 싶은 스마트폰', '사고 싶은 스마트워치', '성능 좋은 스마트폰 스마트폰', '나는 스마트폰이 좋아요'
- 사용함수 : sklearn.feature_extraction.text 모듈의 CountVectorizer
결과)
코드)
docs = [
'사고 싶은 스마트폰',
'사고 싶은 스마트워치',
'성능 좋은 스마트폰 스마트폰',
'나는 스마트폰이 좋아요']
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
bow = vector.fit_transform(docs)
#lambda 함수를 이용해서 인덱스별로 정렬하기
s=sorted(vector.vocabulary_.items(), key=lambda item:item[1]) # tuple이 list안에 들어가있는 형태
s
예제3-2 ) [ DTM ] 여러 문장을 토큰화해서 문장별로 빈도수를 표시하는 DTM(Doocument -Term MTX)을 만들기
조건)
- 문장모음 : '사고 싶은 스마트폰', '사고 싶은 스마트워치', '성능 좋은 스마트폰 스마트폰', '나는 스마트폰이 좋아요'
- 사용함수 : sklearn.feature_extraction.text 모듈의 CountVectorizer
결과)
코드)
docs = [
'사고 싶은 스마트폰',
'사고 싶은 스마트워치',
'성능 좋은 스마트폰 스마트폰',
'나는 스마트폰이 좋아요']
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
bow = vector.fit_transform(docs)
#이미 bow가 list의 인덱스별로 구분해서 row속성을 가지고 있음.-> 행렬로 쉽게 변환 가능
#lambda 함수를 이용해서 인덱스별로 정렬하기
s=sorted(vector.vocabulary_.items(), key=lambda item:item[1]) # tuple이 list안에 들어가있는 형태
columns = []
for k, v in s: # 인덱스로 정렬이 안되어있으면 for문이 제대로 안돌아감
columns.append(k)
import pandas as pd
df = pd.DataFrame(bow.toarray(), columns=columns)
df
예제4) [ TF-IDF ] 여러문장내의 단어를 토큰화하고 TF-IDF 값을 구해서 데이터프레임으로 나타내기
조건)
- 어떤 단어가 특정 문서 내에서 빈도가 높을 수록, 그리고 전체 문서중 그 단어를 포함시키는 문서가 적을 수록, 즉 흔하지 않을 경우에 TF-IDF값이 높아지고 TF-IDF값이 높으면 그 단어는 해당 문서에 중요하다는 뜻이 된다
- TF (문장별 빈도수, Term Frequency) = Document Term Matrix (DTM)
- IDF (역빈도/다른문장에서 안나오는 정도, Inverse Document Frequency)
= log(n/(1+df(t)) , n : 문장수 , df(t) : 특정단어 t가 등장한 문서의 수
- TF-IDF = TF * IDF
- 문장모음 : '사고 싶은 스마트폰', '사고 싶은 스마트워치', '성능 좋은 스마트폰 스마트폰', '나는 스마트폰이 좋아요'
- 사용함수 : sklearn.feature_extraction.text 모듈의 TfidfVectorizer
결과)
코드)
docs = [
'사고 싶은 스마트폰',
'사고 싶은 스마트워치',
'성능 좋은 스마트폰 스마트폰',
'나는 스마트폰이 좋아요']
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer().fit(docs) #학습하는 기능이 있음
s = sorted(tfidf.vocabulary_.items(), key=lambda item:item[1])
columns = [] #tuple에서 값만 불러오는 구문
for k, v in s:
columns.append(k)
df1 = pd.DataFrame(tfidf.transform(docs).toarray(), columns = columns)
df1
'New Collar Level 2' 카테고리의 다른 글
군집 분석 - 텍스트 유사도 (자카드, 코사인) (0) | 2024.06.21 |
---|---|
텍스트 벡터화(단어 임베딩) (0) | 2024.06.21 |
비정형 데이터의 전처리, 형태소 분석(빈도 계산, wordcloud) (0) | 2024.06.18 |
비정형 데이터의 불용어 제거하기 (0) | 2024.06.18 |
비정형 데이터의 단어 토큰화 (0) | 2024.06.17 |