뮤지컬 추천 사이트3(FINAL_PROJECT)

ppippi·2023년 11월 9일
0
post-thumbnail

텍스트 전처리된 파일을 저장한 csv을 이용하여 줄거리 텍스트를 추출 할 것이다.

b. 피처 벡터화/추출
1. TF-IDF : 단어를 형태소 단위로 분리하고 단어의 빈도수에 따라 유사도 측정
2. word2vec : 단어를 벡터로 변환하여 유사도 측정


  • konlpy를 사용하여 형태소별로 분리하기
# 형태소 분리를 위한 Konlpy 객체 초기화
twitter = Okt()
  • 텍스트를 단어와 품사로 나누어 품사인 단어만 문자열형태로 리스트에 저장 (+ 전처리)
#텍스트를 전처리 하는 함수
#BOOK_INTRCN_CN: 전처리할 도서 줄거리
def preprocessingText(BOOK_INTRCN_CN):
    #전처리한 결과를 저장 할 리스트
    stems = []
    #text 를 단어로 나누고 품사를 붙여서 리턴
    #stem=True : 단어의 기본형으로 변환  ex) 같습니다,같았습니다 -> 같다.  
    tagged_review = twitter.pos(BOOK_INTRCN_CN,stem=True)

    #tagged에서 하나를 꺼내서 word,pos에 대입
    #단어는 word, 품사는 pos에 대입
    for word,pos in tagged_review:
        #len(word) : 단어의 글자수가 2글자 이상이면
        #품사가 Noun(명사) 또는 Adjective(형용사) 일경우에만 word(단어) 를 stems에 추가
        if pos=="Noun" or pos=='Adjective':
            stems.append(word)

    #리스트인 stems를 문자열로 만들어서 ( "".join(stems) ) 리턴       
    return " ".join(stems)

  • Word2Vec 모델 훈련을 위한 데이터 준비
# 줄거리 데이터를 리스트형태로 변환
sentences = book_data['BOOK_INTRCN_CN'].tolist()

# 데이터프레임의 'BOOK_INTRCN_CN' 열에 NaN 값이 있을 때 빈 문자열로 대체
tokenized_data = book_data['BOOK_INTRCN_CN'].apply(lambda x: preprocessingText(str(x))).fillna('')

tokenized_data

#BOOK_INTRCN_CN_clear의 마지막에 " " 추가
book_data["BOOK_INTRCN_CN_clear"] = book_data['BOOK_INTRCN_CN_clear'].astype(str) + " "

#data.split(" ") : 문자열을 공백기준으로 잘라서 리스트로 변환
book_data["tokenized_data"]=book_data["BOOK_INTRCN_CN_clear"].apply(lambda data : data.split(" "))

book_data


  • Word2vec모델학습 및 유사도 측정
    특정 줄거리와 다른 모든 줄거리 간의 유사도를 측정
# 학습용 Word2Vec 모델 훈련(벡터화)
model = Word2Vec(book_data["tokenized_data"], 
                 vector_size=100, #WordVector의 열의 수
                 window=3, # 고려할 앞뒤 폭(앞뒤 3단어)
                 min_count=2, # 사용할 단어의 최소 빈도(2회 이하 단어 무시)
                 sg=1) # 0: CBOW, 1: Skip-gram

벡터를 문자열로 변환해서 string_array에 저장한 후 csv파일로 저장

doc2vec 값을 문자열로 변환
doc2vec_str = doc2vec.tostring()

데이터프레임에 추가
book_data['doc2vec_str'] = doc2vec_str

[ 추가된 컬럼 ]
BOOK_INTRCN_CN_clear : 텍스트를 전처리한 컬럼, 조사를 제거하고 단어의 기본형으로 변환
tokenized_data : BOOK_INTRCN_CN_clear 컬럼을 공백을 기준으로 단어별로 분리
doc2vec_vector : 벡터를 문자열로 변환한 것

[알아두기]
CBOW: 주변 단어를 통해 주어진 단어를 예측
Skip-gram: CBOW와는 반대로 하나의 단어에서 여러 단어를 예측하는 방법으로 중심단어에서 주변단어를 예측하는 방식 -> CBOW보다 성능이 좋다.

이렇게 학습한 모델을 이후에도 사용할 것으므로 아래와 같이 저장한다.

model.save("word2vec_model.bin")

branch: 0.0.3/work2vec에 내용에 해당하는 코드파일이 포함되어있으니 참고바랍니다.


tmi: branch명을 word2vec로 한다는걸 너무 자연스럼게 work2vec로 하고 너무 많은일들을 해서 그냥..흐린눈하기로 했다..^^ 다음부터는 정신차리고 제대로 생성하기!!


프로젝트 관련 코드는 아래의 주소에서 확인할 수 있습니다
i-Five

0개의 댓글