TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 데이터 분석>

[파이썬] 자연어 처리(NLP) - 여자친구 선물 고르기 : 3(진행불가)

by 기록자_Recordian 2024. 5. 15.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

지난 챕터
 

[파이썬] 자연어 처리(NLP) - 여자친구 선물 고르기 : 2(재도전)

시작에 앞서해당 내용은 -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.지난 챕터  [파이썬] 자연어 처리(NLP) - 여자친

puppy-foot-it.tistory.com


gensim 사용해보기

 

gensim은 Python에서 자연어 처리를 위한 라이브러리 중 하나로, 토픽 모델링 및 자연어 처리 작업을 위한 도구를 제공한다. 이 라이브러리는 텍스트 문서를 분석하고 이를 벡터 형태로 변환하여 다양한 자연어 처리 작업에 활용할 수 있다. 

 

[주요 기능]

1. 토픽 모델링: gensim은 Latent Dirichlet Allocation (LDA) 및 Latent Semantic Analysis (LSA)와 같은 토픽 모델링 기법을 제공하고, 이를 통해 문서 집합에서 토픽을 추출하고 이를 기반으로 문서 간 유사성을 계산할 수 있다.

2. 워드 임베딩: gensim은 Word2Vec과 Doc2Vec과 같은 워드 임베딩 기법을 구현한다. 이를 사용하여 단어나 문서를 고차원 벡터로 표현할 수 있으며, 이를 활용하여 유사한 단어나 문서를 검색하거나 분류 작업에 활용할 수 있다.

3. 토큰화 및 벡터화: gensim은 텍스트 데이터를 토큰화하고, TF-IDF, LSI 등을 사용하여 문서를 벡터 형태로 변환하는 기능을 제공한다.

4. 유사도 계산: gensim을 사용하여 문서 간의 유사도를 계산할 수 있다. 이를 통해 검색 시스템이나 추천 시스템 등에서 활용할 수 있다.

5. 분산 처리: gensim은 대용량의 텍스트 데이터를 처리하기 위한 분산 처리 기능을 제공다. 이를 통해 대규모 데이터셋에 대한 효율적인 처리가 가능하다.

gensim은 사용하기 쉬운 API를 제공하며, 많은 자연어 처리 작업에 유용하게 활용될 수 있는 강력한 도구이다.


조사, 어미 등 제거

 

먼저 조사나 어미 등을 제거하는 과정을 거친 후

okt = Okt() # Okt 객체를 생성하여 한국어 형태소 분석기를 초기화
results = []  # 결과를 저장할 빈 리스트 생성
lines = present_candi_text # 분석할 텍스트 데이터를 lines 변수에 할당

for line in lines: # lines에 있는 각각의 텍스트에 대해 반복
# 한국어 형태소 분석기(Okt)를 사용하여 형태소 분석을 수행하고, 각 형태소의 품사를 함께 반환
# 정규화 수행, 각 단어를 어간으로 변환
    malist = okt.pos(line, norm=True, stem=True)

    r = [] # 추출된 명사와 형용사를 저장할 빈 리스트를 생성

    for word in malist: # 형태소 분석 결과를 각 형태소에 대해 반복
        if not word[1] in ["Josa", "Eomi", "Punctuation"]: # 형태소의 품사가 조사, 어미, 구두점이 아닌 경우에만 처리
            r.append(word[0]) # 추출된 명사와 형용사를 리스트에 추가

    r1 = (" ".join(r)).strip() # 추출된 단어들을 공백을 사이에 두고 하나의 문자열로 결합
    results.append(r1) # results.append(r1): 결합된 문자열을 결과 리스트에 추가
    print(r1)

 

어미, 조사, 구두점의 형태소 제거

 

그런데... 이번에는 자꾸 out of memory 가 떠서 멈춘다.. (몇 번을 다시 해봐도 그렇다)

 

자꾸 튕기는 것을 대비하여 크롤링한 목록을 text 파일로 저장해놓고

# 크롤링한 데이터를 저장할 파일 경로
file_path = "present_candi_text_raw.txt"

# 크롤링한 데이터를 텍스트 파일에 저장
with open(file_path, "w", encoding="utf-8") as file:
    for line in present_candi_text:
        file.write(line.strip() + "\n")

 

마찬가지로, 불용어 처리한 내용도 text 파일로 저장해놓는다.

# 크롤링한 데이터를 저장할 파일 경로
file_path = "present_candi_text_stopwords.txt"

# 크롤링한 데이터를 텍스트 파일에 저장
with open(file_path, "w", encoding="utf-8") as file:
    for line in present_candi_text:
        file.write(line.strip() + "\n")

 

재작업을 위해 기존에 저장해놨던 텍스트 파일 (불용어 처리 버전)을 불러와서 몇 번을 해봤지만 계속 튕겨서 포기.

(나중에 사양이 더 좋은 노트북을 사면 그때 해보는 걸로...ㅠㅠ)

# 튕겼을 때 텍스트 파일 불러오기(불용어 처리 버전)
file_path = "../Data/09. present_candi_text_stopwords.txt" 

# Open the file in binary read mode ('rb') to handle null characters
with open(file_path, 'rb') as file:
    binary_content = file.read().replace(b'\0', b'')  # Remove null characters
    present_candi_text = binary_content.decode('utf-8')  # Decode the cleaned binary content to a string
    print(present_candi_text)  # Print the decoded text

교재에 나와있는 이후의 순서

 

이렇게 만들어진 데이터를 저장 (Word2Vec 실행하고 그 결과 저장)

data_file = 'pres_girl.data'
# res_girl.data 파일을 쓰기 모드('w')로 열고, 파일을 다루기 위한 파일 객체를 fp로 지정(UTF-8 인코딩)
with open(data_file, 'w', encoding='utf-8') as fp:
# results 리스트에 있는 각각의 요소를 개행 문자("\n")로 구분하여 하나의 문자열로 결합한 후 파일에 씀
    fp.write("\n".join(results))

 

※ 이 코드는 'pres_girl.data'라는 파일을 쓰기 모드('w')로 열고, results 리스트에 있는 문자열을 개행 문자('\n')를 이용하여 연결한 후 파일에 작성. 이를 통해 추출된 결과가 파일에 저장된다.

 

그리고 다시 읽어온다.

# ata_file에서 데이터를 읽어와서 한 줄씩 처리하기 위해 word2vec.LineSentence를 사용하여 데이터를 준비
data = word2vec.LineSetence(data_file)

model = word2vc.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)

model.save('pres_girl.data')
<코드 설명 with Chat GPT>

1) data = word2vec.LineSentence(data_file):
이 코드는 data_file에서 데이터를 읽어와서 한 줄씩 처리하기 위해 word2vec.LineSentence를 사용하여 데이터를 준비합니다. 이를 통해 메모리 효율적으로 대용량의 텍스트 데이터를 처리할 수 있습니다.


2) model = word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1):
이 코드는 Word2Vec 모델을 생성합니다. data는 학습 데이터로서, 앞서 준비한 줄 단위의 데이터입니다.
size=200은 단어 벡터의 차원을 나타냅니다.
window=10은 주변 단어의 윈도우 크기를 의미하며, 한 단어 주변에서 얼마나 많은 단어를 고려할지 결정합니다.
hs=1은 Hierarchical Softmax를 사용한다는 것을 나타냅니다.
min_count=2는 모델 구축에 고려되는 최소 단어 빈도를 나타냅니다.
sg=1은 Skip-gram 모델을 사용한다는 것을 의미합니다.

3) model.save('pres_girl.data'):
이 코드는 학습된 Word2Vec 모델을 지정된 파일 경로에 저장합니다.
모델을 나중에 재사용하거나 공유할 때 유용합니다.

 

그리고 다양한 단어와 유사한 단어를 코드를 통해 찾아본다.

(실제 결과값이 아닌, 교재 내의 코드를 적은 내용입니다.

추후 진행 시에는 '선물' 이라는 단어를 검색하여 유사도가 높은 단어를 기준으로 검색을 진행하면 될 것으로 보입니다.)

model = word2vec.Word2Vec.load("pres_girl.model")
model.most_similar(positive=['선물'])
model.most_similar(positive=['여자친구'])
model.most_similar(positive=['스와로브스키','목걸이'])

 

'스와로브스키'에서 '여자친구'를 빼는 코드를 입력 해본다.

model.most_similar(positive=['스와로브스키'] negative=['여자친구'])

 

 

728x90
반응형