예제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

+ Recent posts