working_helen

[키워드 추출] Llama를 이용한 리뷰 키워드 추출 및 카테고리 선정 본문

deep daiv./NLP project

[키워드 추출] Llama를 이용한 리뷰 키워드 추출 및 카테고리 선정

HaeWon_Seo 2024. 9. 15. 15:54

마켓컬리 '국 · 탕 · 찌개' 상품들의 리뷰 텍스트에서부터 키워드를 추출한 후 리뷰 내용을 분류할 카테고리를 선정하는 과정을 진행한다. 리뷰 텍스트를 어떤 주제 카테고리로 클러스터링할 수 있는지 파악한다. 

 

 

1. Llama few-shot prompting

2. 키워드 추출 결과

 


1. Llama few-shot prompting

 Llama few-shot prompting으로 마켓컬리 리뷰 내용의 키워드 추출 시도 

 

LLM에게 요구할 task

- 주어진 리뷰 전문으로부터 주요 키워드를 추출하는 task

- 각 리뷰마다 키워드 추출을 진행

  → 모든 키워드 추출 결과를 합쳐 마켓컬리 리뷰 속 키워드 추출 결과로 활용 

 

사용 데이터

- 길고 자세하게 작성된 리뷰들의 키워드는 짧고 간단한 리뷰들의 키워드를 포괄한다고 볼 수 있음

- 전체 리뷰 데이터가 아닌, '도움돼요' 개수가 많은(정보를 많이 담고 있는) 리뷰들에 대해서만 키워드 추출 

- 20년도 이후 & 4단어 이상 & '도움돼요' 개수가 많은 순으로 정렬한 후

  상위 100개의 리뷰 데이터에 대해 적용

 

 

 

(1) prompt 작성

 

- 키워드 추출의 경우 정해진 정답이 있는 것이 아니기 때문에 few-shot 예제를 많이 제공하는 것보단 키워드 추출 과정에서 추론 방법이나 출력 형식을 정확히 지시하는 것이 더 중요하다고 판단

- 프롬프트 성능을 위해 사용한 작성 방식

  • '제품' 자체와 관련된 내용에만 집중하여 키워드를 추출하도록 지시
  • '좋다' '추천' '만족'과 같은 감정적 표현이 아닌, 제품의 특성 및 기능에 관한 내용에 대한 키워드를 얻기 위해 '감정적인 표현'에 집중하지 않도록 지시 
  • 키워드로 동사나 형용사 형태인 경우, 단어나 구 형태로 변환하여 출력하도록 예제와 함께 별도의 지시사항 추가
  • 모델의 출력 형식은 키워드들을 쉼표로 구분한 list로 출력하도록 지시 
system_prompt = '''
주어진 구문에서 제품의 주요 특성, 속성, 기능을 나타내는 명사 또는 구체적 표현을 키워드로 추출하세요.
구문에 포함된 단어들을 분석하여 제품의 중요한 특성이나 기능을 정확히 표현하는 키워드를 도출합니다.
감정적인 표현보다는 제품의 구체적인 속성에 중점을 두어야 합니다.

- 키워드는 제품과 관련된 구체적인 명사 또는 기능을 나타내는 단어나 구입니다.
- **키워드가 동사나 형용사로 되어 있을 경우** 명사나 구 형태로 변환하여 추출하세요.
  예를 들어, '간이 생각보다 쎄서'는 '간이 쎔'으로 변환하세요.
- 감정적인 표현(예: '좋아요', '실망스러워요')은 포함하지 마세요.
- 키워드는 다음과 같이 쉼표로 구분된 목록으로 출력하세요 : ['키워드1', '키워드2', ...]
'''

 

 

 

(2) 키워드 추출 진행

 

- hugging face에서 8B 크기 Llama3 모델 불러오기

  • 구글 코랩에서 실행하여 cuda GPU 사용
  • tensor 데이터 타입을 float16으로 설정 +  모델을 4비트 양자화를 사용하여 로드 
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from huggingface_hub import login
login(token="hugging face token")

device = "cuda" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16
model_name = "meta-llama/Meta-Llama-3.1-8B-Instruct"
model = load_model(model_name, use_quantization=True)
tokenizer = AutoTokenizer.from_pretrained(model_name)

 

- Llama 답변 생성

  • Llama3 special tokens 사용해 입력문 inputs 생성 
  • tokenizer가 텍스트 inputs을 tensor 형태의 토큰으로 변환하여 GPU에 전달 
  • model.generate를 통해 모델의 응답 텍스트를 생성 
# Llama 모델의 리턴에서 답변에 해당하는 부분만 추출하는 함수 
def extract_assistant_text(outputs):
    output = tokenizer.decode(outputs[0], skip_special_tokens=True)
    if '키워드' in output:
        return output.split('키워드:')[-1].strip().split('\n')[0]
    else:
        return "No keywords extracted"

    
extracted_keywords = []
for review in reviews:
    query = f'{review}\n키워드:'
    inputs = f'<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n{system_prompt}<|eot_id|><|start_header_id|>user<|end_header_id|>\n{query}<|eot_id|><|start_header_id|>assistant<|end_header_id|>'
    outputs = model.generate(tokenizer(inputs, return_tensors="pt").input_ids.to(device), max_new_tokens=500, do_sample=False)
	extracted_keywords.append([query, extract_assistant_text(outputs)])

 

- Llama가 생성한 답변을 데이터프레임 형태로 저장 

df['keywords'] = extracted_keywords

 

 

 

 

 

 

2, 키워드 추출 결과 

키워드 추출 결과 예시

...1인분짜리 팩이 두 개 들어 있어서 1 인 가구로서 그 부분이 일단 마음에 들었어요
한 팩의 양도 꽤나 푸짐해서 넉넉한 1 인분이구요 국물이 맵진 않지만 고기 육수가 찐 한 스타일이에요
그래서 취향에 맞게 고춧가루나 다진 마늘 넣고 물 좀 더 넣고 끓여 먹으니 정말 맛있습니다
우거지도 아주 부드러워서 고기에 곁들여 먹으면 궁합이 참 좋아요
한 팩에 뼈 두 개 들어 있는데 살도 꽤 실해서 맛있고 든든한 한 끼로 그만입니다
두 번째 먹을 때는 불린 당면도 넣어 줬더니 잘 어울리네요...

['팩', '양', '국물', '고기', '육수', '고춧가루', '마늘', '우거지', '뼈', '당면']

 

 

493개의 키워드 추출 

더보기

가격, 가성비, 가위, 가자미, 가족, 간, 간단 식사, 간단함, 간소한 조리법, 간이, 간이 쎔, 간장, 간장, 간편, 간편함, 갈 빗살, 갈비, 갈비뼈, 갈비탕, 갈빗대, 감자, 감자 칼국수면, 감자탕, 감칠맛, 감투, 강릉, 강비탕, 강추, 건강, 건더기, 건데기, 겨울, 경상도 식, 경제적, 경험, 계란, 고객, 고급, 고기, 고기 분리, 고기 양, 고명, 고사리, 고소, 고추, 고추가루, 고추기름, 고추장, 고춧가루, 곰탕, 곱창, 구성, 국, 국간장, 국구릇, 국그릇, 국물, 국물 베이스, 국물 소스, 국물 양, 국밥, 국산, 국수, 국수 베이스, 귀찮음, 기대 이상, 기름, 기름지기, 기분, 김, 김장김치, 김치, 김치찌개, 김칫국물, 깊은 맛, 깊이, 깔끔, 깔끔한, 깔끔함, 깨소금, 깻잎, 꼬리, 꼬리 곰탕, 꽃게 액, 끓이기, 끓임, 낙지, 날씨, 남편, 내용물, 내장, 냄비, 냄새, 냉동, 냉동 밥, 냉동 상태, 냉동 육개장, 냉동 제품, 냉동식품, 냉동실, 냉동실 보관, 냉장, 냉장고, 냉장실, 노력, 노른자, 다데기, 단백질, 닭, 닭고기, 담백, 당근, 당면, 대량, 대추, 대파, 데우기, 도가니, 도가니탕, 돼지 등뼈 척수, 돼지 머릿고기, 돼지고기, 된장, 된장밥, 된장찌개, 두부, 두부 만두, 뒷맛, 들기름, 들깨, 들깨 가루, 따끈한 밥, 따끈한 육개장, 땡초, 떡, 떡국, 떡국 떡, 떡국떡, 떡만둣국, 뚝배기, 뜨끈, 뜨끈한, 라면, 라면 사리, 레시피, 레토르트, 리조트, 마늘, 마켓컬리, 만두, 만두국, 만족, 맑음, 맛, 맛이, 맛이 좋음, 맛있, 맛있게, 맛있는, 맛있다, 맛있어요, 맛집, 매실 액, 매운맛이 적음, 매움, 매콤, 맵기, 머릿고기, 메뉴, 메밀국수, 면, 면 사리, 면기, 몽글몽글, 무, 무나 콩나물, 문어, 물, 미림, 미역, 미역국, 미원, 믿음, 밀 키트, 밀가루, 밀키트, 밀키트류, 바삭함, 반모, 반찬, 밤, 밥, 밥솥, 방법, 배달, 배불리, 배송, 배추, 백김치, 백암, 버섯, 베이크드빈, 보관, 보기도, 보양식, 보장, 볶음 김치, 볶음밥, 봉투, 부대찌개, 부드러움, 부드럽게, 부드럽고, 부모님, 부찌, 부추, 부추 무침, 부피, 불, 불고기, 불맛, 불순물, 불편함, 비닐, 비쥬얼, 비축, 빨간 소고기 무 국, 뼈, 뼈 해장국, 뼈다귀, 사골, 사골 국물, 사리, 사리면, 사미헌, 살, 삶기, 삼계탕, 삼진 어묵, 새우, 새우젓, 새콤함, 생선, 생채, 서울식, 석박지, 선물, 설겆이, 설렁탕, 설탕, 섭섭, 소, 소고기, 소고기 곱창 전골, 소금, 소면, 소반, 소스, 소스지, 소울 푸드, 소주, 손, 수입, 수제비, 숙주, 숙주나물, 순대, 순대국, 순두부, 순두부물, 순두부찌개, 술안주, 스팸, 스프, 시간, 시간 단축, 시원, 시원함, 식감, 식당, 식사, 식초, 신맛, 신선도, 신선설농탕, 쌀, 쌀쌀함, 쑥갓, 쓰레기, 아이, 아이들, 아이스팩, 아픔, 안원 당, 알 배추, 알맞음, 애호박, 야채, 양, 양 곰탕, 양 조절, 양념, 양념장, 양량, 양배추, 양분, 양이, 양이 적당, 양이 적은 분, 양이 충분한 분, 양지, 양파, 어묵, 얼음, 에어컨, 여행, 연두, 염통, 영계, 영양 정보, 오뎅 탕, 오뚜기, 오모가리, 오미자, 오소리, 오징어, 오징어 국, 오징어 젓갈, 옥 사골, 올리고당, 와사비, 완제품, 왕갈비탕, 요리, 우거지, 우거지 감자탕, 우거지 탕, 우동, 우동 면, 우동 사리, 우동 소스, 유부, 유부 주머니, 유통기한, 육개장, 육수, 육즙, 은행, 익음, 인력, 인분, 인삼, 인심, 인싸템, 일, 일 인분 양, 일상 미소, 입맛, 자극, 잡내, 재구매, 재료, 재주문, 쟁여기기, 적당, 적당함, 전골, 전복, 전자레인지, 젓, 젓가락, 정통 가쓰오 우동, 제품, 조랭이 떡, 조리, 조리법, 조미 가루, 조미료, 조절, 죽, 중량, 즉석, 지방, 지역, 진실된, 진한, 진한 맛, 진함, 질기, 질리지 않음, 집밥, 짬뽕, 짬뽕면, 짭짭, 쪽파, 쫄깃, 쫄깃쫄깃, 쫄깃쫄깃한 식감, 쫄깃한 식감, 쫄깃함, 찌개, 찐, 참기름, 찹쌀, 채소, 첨가, 청고추, 청국장, 청량 고추, 청양고추, 초등학생, 촉촉함, 추천, 취향, 치즈, 친정엄마, 칼, 칼국수, 칼칼, 칼칼한 맛, 칼칼함, 캠핑, 컬리, 콩나물, 퀄리티, 크고 두툼한 갈비, 탕, 탱글, 탱글탱글, 토란, 토종 닭, 토종 삼계탕, 토종 축산물 인증 마크, 토종닭, 토종닭 곰탕, 토종닭 국물, 토종닭 맛, 토종닭 속, 토종닭 육수, 토종닭 전문점, 토종닭 진한 국물, 토핑, 통마늘, 통뼈 감자탕, 팁, 파, 팩, 팽이버섯, 펜션, 편리, 편리성, 편리함, 편안한 국, 편의성, 편함, 포만감, 포장, 포장 상태, 포장지, 퐉 풀, 표고버섯, 푸짐, 푸짐함, 푹 끓여지다, 풀무원, 풀무원 만두, 품목, 품질, 프리미엄, 플라스틱, 피로, 핏물, 한 끼, 한 끼 식사용, 한약재, 한약향, 한우, 할라피뇨, 할인, 해동, 해산물, 해장, 햄, 행복, 향, 현미햇반, 호박, 혼밥, 혼자 먹기, 홍고추, 홍보, 후추, 후춧가루

 

추출한 키워드를 클러스터링하여 리뷰 내용을 분류할 카테고리 선정 

- Chat GPT에게 위의 키워드들을 입력한 후 의미를 기준으로 클러스터링 하도록 지시

 

  •  맛/풍미 : 제품의 맛, 향, 풍미와 관련된 키워드들
더보기

간, 간이, 간이 쎔, 감칠맛, 깊은 맛, 깊이, 고소, 매실 액, 매운맛이 적음, 매움, 매콤, 맛, 맛이 좋음, 맛있, 맛있게, 맛있는, 맛있다, 맛있어요, 맵기, 소금, 소스, 소스지, 진한, 진한 맛, 진함, 쫄깃, 쫄깃쫄깃, 쫄깃쫄깃한 식감, 쫄깃한 식감, 쫄깃함, 칼칼, 칼칼한 맛, 칼칼함, 텡글, 텡글텡글, 향, 한약향, 홍고추, 후추, 후춧가루

  • 재료/구성 : 제품에 포함된 재료나 구성 요소와 관련된 키워드들
더보기

갈 빗살, 갈비, 갈비뼈, 갈비탕, 갈빗대, 감자, 감자 칼국수면, 감자탕, 고기, 고기 분리, 고기 양, 고명, 고추, 고추가루, 고추기름, 곰탕, 곱창, 구성, 국, 국간장, 국수, 국물, 국물 베이스, 국물 소스, 국물 양, 국밥, 국산, 김, 김치, 김치찌개, 김칫국물, 김장김치, 나물, 냉동, 내장, 대파, 돼지 등뼈 척수, 돼지 머릿고기, 돼지고기, 된장, 된장찌개, 두부, 들기름, 들깨, 들깨 가루, 떡, 떡국, 떡국 떡, 떡만둣국, 라면 사리, 마늘, 만두, 만두국, 맛집, 메밀국수, 면, 면 사리, 무, 무나 콩나물, 문어, 미역, 미역국, 미원, 배추, 버섯, 부대찌개, 부추, 불고기, 비빔면, 새우, 설렁탕, 소고기, 순대, 순두부, 스팸, 쌀, 양, 양배추, 양지, 어묵, 우거지, 육개장, 육수, 육즙, 잡내, 전골, 전복, 조랭이 떡, 조미 가루, 조미료, 죽, 찌개, 찹쌀, 청국장, 청양고추, 토란, 해산물, 해장, 향, 호박

  • 조리/보관 방법 : 제품의 조리법, 보관 상태 및 관련 방법에 대한 키워드들
더보기

간단 식사, 간단함, 간소한 조리법, 간편, 간편함, 끓이기, 냉동 상태, 냉동 육개장, 냉동 제품, 냉동식품, 냉동실, 냉동실 보관, 데우기, 레시피, 리조트, 밀 키트, 밀가루, 밀키트, 밀키트류, 보관, 보관 상태, 조리, 조리법, 조절, 즉석, 해동

  • 포장/배송 : 제품의 포장 상태, 배송, 보관과 관련된 키워드들
더보기

배송, 포장, 포장 상태, 포장지, 봉투, 냉장, 냉장고, 냉장실, 아이스팩, 포장지

  • 양/가격 : 제품의 양, 가성비 및 경제성과 관련된 키워드들
더보기

가격, 가성비, 경제적, 대량, 양 조절, 양이, 양이 적당, 양이 적은 분, 양이 충분한 분, 일 인분 양, 중량, 푸짐, 푸짐함

 

 

➡️ 리뷰 내용을 평가할 카테고리 선정

      →  ‘맛/향/풍미’, ‘보관’, ‘포장/배송’, ‘양’, ‘가격’, ‘활용 방법6가지

 

키워드 추출 결과 

  • 맛/향/풍미 : 상품의 맛, 냄새, 식감 등 음식 자체에 대한 평가를 담은 내용
  • 보관 : 소비자들의 상품 보관 방식에 관한 내용
  • 포장/배송 : 상품의 포장 상태, 택배 배송 상태와 관련된 내용
  • : 상품의 양, 푸짐함과 관련된 내용
  • 가격 : 상품의 가격, 가성비에 대한 평가를 담은 내용
  • 활용 방법 : 소비자가 이 상품을 먹을 때 활용한 조리법 및 레시피, 평소 이 상품을 사용하는 목적 혹은 상품을 사용하기 유용한 상황에 관한 내용