da-analysis / asac_4_dataanalysis

ASAC 4기 Data Analysis Project
0 stars 1 forks source link

텍스트 리뷰 임베딩 데이터 저장하기 #17

Open syleeie2310 opened 3 months ago

syleeie2310 commented 3 months ago

텍스트 리뷰 임베딩 데이터 저장하기

-> 2가지 방식

  1. Spark NLP 모델 사용하기
  2. 허깅페이스 모델 사용하기

리서치 영역 -> 데이터 마다 다르니깐, 쇼핑 리뷰에 가까운 모델을 찾으면 베스트. -> sentence-bert

1. SparkNLP https://sparknlp.org/2020/08/25/sent_small_bert_L10_128.html 아래코드 참고할 것 https://tacademykr-daanalysis.cloud.databricks.com/?o=647747681770278#notebook/3210538999355180/command/3210538999355196

syleeie2310 commented 3 months ago

sentence_transformers huggingface

아래 모델 중에서 어떤 거 사용하면 좋을지 리서치 필요합니다. https://huggingface.co/sentence-transformers

JIYUN0710 commented 3 months ago

Doc2Vec 돌리는데 판다스 데이터 프레임으로 변경후에 , 1. 그냥 돌리는 것, 2. multiprocessing 돌리는 것, 3. ray 활용하는 것 모두 돌아가다가 같은 에러가 발생합니다! 메모리 이슈 같아요!

image

syleeie2310 commented 3 months ago

@JIYUN0710 님 제가 전에 공유해드린 spark nlp https://tacademykr-daanalysis.cloud.databricks.com/?o=647747681770278#notebook/3210538999355180/command/3210538999355181

사용해보시겠어요? 허깅페이스에서 에러난다면 결국 모델 사이즈의 문제일거라 어떤 모델 사용하고 있는지? 링크랑 모델 크기가 얼마나 되는지 같이 알려주시면 좋을거 같아요.

메모리 부족하다고 계속 늘릴순 없거든요. 어느정도 모델 사이즈인데 에러나는지 알고 있어야;;

syleeie2310 commented 3 months ago

아..그리고 코드보니깐 직접 doc2vec 학습하는거 같은데 그게 아니라 inference 만 해야 될거 같아요. @JIYUN0710

위에 있는 bert 쓰는것도 결국 transfer learning 만 해달라는거였..

JIYUN0710 commented 3 months ago

지금 돌아가는거 다 돌아가면, 공유해주신 코드도 돌려보려고 그것도 정리해두고 있었습니다!! 끝나면 바로 적용하겠습니다!

JIYUN0710 commented 3 months ago

@syleeie2310 image 아니면 현재 이걸 돌리고 있는데, 멈추고 바로 bert를 돌릴까요?

JIYUN0710 commented 3 months ago

우선 멈추고 나서 bert돌리고 있는데,

image

해당 결과를 아래와 같이 델타 테이블로 저장하면 될까요? 전에 코드에는 파켓파일로 저장을 했어서요!

JIYUN0710 commented 3 months ago

image

2시간 정도 돌렸는데, 이정도 돌아갔습니다! 멘토링 가려면 중간에 끊길거 같은 느낌입니다...

syleeie2310 commented 3 months ago

@JIYUN0710 네 중간에 끊기진 않을거에요. 에러가 나지 않는 이상.. 켜놓고 멘토링 와서 와서 저장 되었는지 보면 되겠네요.

그리고 결국 저 데이터가 완성되면 어떻게 활용할지 아이디어가 중요한데 그쪽 방면을 오늘 고민해서 와주세요.

(리뷰 sentence 임베딩 데이터가 있을 때 => document => asin 으로 어떻게 구상할 것인지?)

JIYUN0710 commented 3 months ago

1시간 지나서 클러스터 꺼지면 끊기지 않나요?!

넵넵! 지금 PCA, t-SNE 이런것들 보면서 차원축소 내용도 찾아보고 코드도 짜고 있습니다!

syleeie2310 commented 3 months ago

@JIYUN0710 1시간 동안 드라이버에서 어떠한 실행도 없으면 자동으로 termination 되는 설정이에요. 그리고 실행이라는 기준이 cluster에서 노트북이 running 상태이면 내가 보이는 웹이랑 상관없구요.

지금은 실행중이니깐.. 에러나서 실패한 다음에 1시간 지나면 꺼질 수 있긴한데 그외는 안꺼질거에요.

JIYUN0710 commented 3 months ago

아아 넵넵! 완전히 이해했습니다 ㅎㅎ! 업무도 바쁘실텐데 답변주셔서 정말 감사드려요 ㅠㅠ!^_^!

syleeie2310 commented 3 months ago

https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews

syleeie2310 commented 3 months ago

https://tyami.github.io/deep%20learning/Siamese-neural-networks/

syleeie2310 commented 3 months ago

https://stackoverflow.com/questions/60492839/how-to-compare-sentence-similarities-using-embeddings-from-bert

JIYUN0710 commented 3 months ago

[텍스트 임베딩]

  1. 허깅페이스 모델 작은 것 -https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2

    • 용량 : 90MB
  2. 사전 학습된 Doc2Vec 모델 https://spotintelligence.com/2023/09/06/doc2vec/ -> 개념 https://sparknlp.org/2021/11/21/doc2vec_gigaword_wiki_300_en.html -> 모델

    • 용량 : 312.3MB (조금 큼...)
    • 300차원으로 구성됨 / 100개 확인해본결과 문장 여러개여도 300차원 1개 배열만 가짐
    • 판다스 데이터프레임으로 해봤지만, 계속해서 오류 발생 -> 파이스파크 활용하라는 답변 계속 나옴 image
    • 전체에서 na행 삭제한 뒤 전체 저장하는 중

=> 우선 허깅페이스 모델 그나마 적은 것 찾았는데, 사전학습된 doc2vec을 찾아서 이것 먼저 학습중입니다! => 판다스로 바꿔서 해봤는데 에러 계속 고쳐도 에러가 나서 원본 리뷰 텍스트에서 na만 제거해서 델타 테이블로 저장하고 있습니다. => 일단 이렇게 돌려두고, 이 모델 결과를 쓴다는 전제하에, 같은 asin끼리 어떻게 대표값을 설정할지에 대해 리서치할 예정입니다! 괜찮을까요?

syleeie2310 commented 3 months ago

@JIYUN0710 네 그렇게 하시고 어제 돌린거 기준으로 모델 만드는것부터 먼저 하는게 좋을 듯 해요 (클러스터링으로 할지 차원축소로 할지...)

JIYUN0710 commented 3 months ago

@syleeie2310 image

왼쪽 컬럼에 annotatorType, begin등 필요없는 정보도 있어서 오른쪽 컬럼처럼 임베딩 값만 뽑을 때,

image

이와 같이 하고, 그 후에 asin 같은 것끼리 임베딩 배열 합치려고,

image

이 방법 활용해서 최종적으로 같은 asin별로 임베딩 배열이 합쳐진 것만 남은 데이터프레임을 생성하고 싶은데, 이렇게 하면, 너무 비효율적일까요? sql을 활용해서 하는 방법이 더 나을까요? 첫 번째 사진에서 sbert는 델타테이블로 저장되어있습니다!

syleeie2310 commented 3 months ago

pyspark dataframe에 있는 함수 쓰는건 spark sql 에서 쓰는거랑 동일해요 큰 차이 없을걸요?

JIYUN0710 commented 3 months ago

그럼 저 방식으로밖에 합칠 수 없는걸까요?

syleeie2310 commented 3 months ago

글쎄요 그건 합친 다음에 어떤걸 할 목적이냐에 따라 다르지 않을까요? @JIYUN0710 일부 asin 샘플만 빼서 별도 테이블 저장한 다음에

그 작은 데이터로 불러와서 전체 플로우를 개발하고 쭉 돌리는 좋을거 같긴 해요.

array 함수 중에서 몇개 테스트 해봐도 좋을거 같기도 하구요 아래 같은 예시도 있고...

https://spark.apache.org/docs/latest/api/sql/#flatten

syleeie2310 commented 3 months ago

특정 샘플 데이터로 별도 테이블 빼서 개발하라는 의견은 다음과 같아요.

JIYUN0710 commented 3 months ago

image image

이런식으로 글에서 자꾸 오류가 뜹니다!!

특정 샘플 데이터로 별도 테이블 빼서 해보도록 하겠습니다!!! ㅎㅎ 감사해요!

syleeie2310 commented 2 months ago
  1. PCA 분산 설명력 확인 ㄴ 임베딩 결과를 차원 축소했을 때 문제 발생할 수 있으므로 설명력 확인해보고 너무 많은 피쳐 사용해야 한다면 해당 방식은 제외하기

  2. asin 별로 텍스트 임베딩 대표값 계산하기 ㄴ 평균만 가지고 대표하긴 어렵기 때문에, 평균/분산/표준편차/1분위수/2분위수/3분위수/왜도/통계 값들을 저장해서 해당 통계값들 기준으로 코사인 유사도 계산한 다음에 가중평균을 계산하기 (통계량이 모두 유사하면 유사하다고 가정) ㄴ asin 별로 모든 문장 가져왔을 때 길이 분포 확인하기 (문장이 많은 asin는 위 방식이 아닌 클러스터링 - kmeans나 가우시안 믹스쳐 모델 사용해서 대표값을 뽑는게 좋을 수도 있음 다만 시간이 없으면 이건은 패스)

  3. self-attention 모델 ㄴ pytorch 로 asin 별로 쪼개서 돌려야 합니다. 어텐션 모델 결과 가지고 데이터프레임으로 저장한 다음에 저장된 파일 가지고 코사인 유사도 계산해보기

JIYUN0710 commented 2 months ago

self-attention 모델 하나의 행에 asin별로 임베딩 값들 모아놓은 데이터프레임을 돌렸을 때,

image

이런식으로 행별로 128개의 벡터를 포함한 하나의 리스트만 나온다는 것을 확인하였습니다. 하지만, 이를 저장하고자 하니

image

이와 같이 메모리가 터졌습니다. 그래서 전체 데이터 프레임을 행별로 500개행씩 쪼개서 해당 과정을 진행해보고 있습니다! 쪼갠 데이터프레임은 dfs리스트 안에 들어있습니다.

image

이런식으로 진행하고 있는데, 쪼객 데이터프레임중(전체 1179개) 4개의 데이터프레임만 선택해서 display해보고자 했는데, union을 활용해서 그런지, 비효율적인 방법 같다는 생각이 들었습니다!

image

다른 방식으로 하는게 좋을까요?

syleeie2310 commented 2 months ago

self-attention 모델은 스파크랑 상관없으니, 스파크 사용하지 않고 해야 될듯 한데요. 스파크 데이터프레임으로 하지 말고

파이썬 numpy로 하거나 리스트로 처리하거나 다른 방법으로 하셔야 될듯 하고 데이터 쪼개서 파일로 저장하는 코드 짜서 루프 돌리면서 해야 될듯 해요!

JIYUN0710 commented 2 months ago

어제와 다른 asin 기준으로 키워드랑 요약 뽑으려고 하는데, image

사진은 32차원인데, 이것처럼 128차원도 뽑으려는데 image

이와 같이 또 계속 터져요! 어제 했던 asin은 안 터졌는데 오늘 다른거 2개 해봤을 때는 터졌었습니다!

image

새로운 asin으로 32차원 다시 해봤는데 이와 같이 나왔습니다! => 결론적으로 시간과 자원의 이유로 128차원은 활용하지 않고, 32차원으로 줄인 것을 활용하는 것이 어떨까요!

어제 한 asin 32차원도 사진 첨부드립니다! image

=> 우선은 다른방식으로 코드 해보면서 해결해보겠습니다!!

JIYUN0710 commented 2 months ago

해결했습니다!!!!

syleeie2310 commented 2 months ago

아..네 @JIYUN0710 고생하셨어요!! 중간 작업하면서 제가 못볼 수도 있다보니 본인이 판단해서 진행해주시고

해당 이슈는 완료되면 종료 처리한 다음에 다음 모델링 작업으로 넘어가셔도 될 거 같습니다.

syleeie2310 commented 2 months ago

32개 차원으로 결정

JIYUN0710 commented 2 months ago

코사인 유사도 구하는 코드를 아래와 같이 계산했는데, 방법4처럼 돌리는 것이 가장 효율적일까요?

방법1) 처음 했던 udf 코드 ->2분 image

방법2) -> 4분 image

방법3) -> 2분 image

방법4) -> 1~2분 image

syleeie2310 commented 2 months ago

데이터가 클 때 시간 차이가 있을 듯 한데.. 스파크 함수만 사용하는거면 2,3,1 다 비슷한거 같기도 하고; 잘모르겠네요. 방법 4만 다른거 같고

방법 1이 float랑 vector.dense가 스파크 데이터프레임에 있는 함수면 실제로 스파크 내 함수만 돌거 같기도 한데..

수행했을 때 스파크 ui 보고 어떻게 돌아가는지 보고 결정하심 될듯한데요?

JIYUN0710 commented 2 months ago

넵 알겠습니다!!ㅎㅎ