마이크로소프트/Azure

[Azure] 자연어처리- cognitive, translator 서비스 이용하여 감정분석 하기

Olivia-BlackCherry 2023. 6. 16. 14:41

오늘은 Azure를 이용해서 자연어처리를 한다.

<사전준비>

Microsoft Azure에서 cognitive, translator 리소스 추가하기

endpoint, API_key를 각각 받기

 

한글 문서, 영어 문서 text 문서로 준비하기

 

jupyter notebook 설치하기

 

<과정>

 

1. 리뷰 문서 보기

review1. txt

review2.txt

import os

# /data/reviews 폴더에 있는 리뷰들을 읽는다.
reviews_folder = os.path.join('data', 'text', 'reviews')

# ID(파일 이름)과 텍스트 (내용)속성들로 구성된 리뷰들의 컬렉션을 생성한다.
reviews = []
for file_name in os.listdir(reviews_folder):
    review_text = open(os.path.join(reviews_folder, file_name), encoding="UTF-8").read()
    review = {"id": file_name, "text": review_text}
    reviews.append(review)

for review_num in range(len(reviews)):
    # 리뷰 텍스트를 인쇄한다
    print('{}\n{}\n'.format(reviews[review_num]['id'], reviews[review_num]['text']))

 

 

2. cognitive, Translator key, endpoint 입력하기

cog_key = 
cog_endpoint = 

key=

endpoint=

 

 

3. cognitive service에서 text analytics와 관련된 설치하기

! pip install azure-cognitiveservices-language-textanalytics

 

 

4. 언어 감지하기

import os
from azure.cognitiveservices.language.textanalytics import TextAnalyticsClient
from msrest.authentication import CognitiveServicesCredentials

# Text Analytics Cognitive 서비스 리소스를 위한 클라이언트 가져오기
text_analytics_client = TextAnalyticsClient(endpoint=cog_endpoint,
                                            credentials=CognitiveServicesCredentials(cog_key))

# 앞에서 언급한 /data/reviews 폴더로부터 읽은 리뷰들을 분석한다
language_analysis = text_analytics_client.detect_language(documents=reviews)

# 각 리뷰에서 감지된 언어 세부 정보들을 프린트한다.
for review_num in range(len(reviews)):
    # print the review id
    print(reviews[review_num]['id'])

    # 이 리뷰에 대한 언어 세부 정보를 가져온다.
    lang = language_analysis.documents[review_num].detected_languages[0]
    print(' - Language: {}\n - Code: {}\n - Score: {}\n'.format(lang.name, lang.iso6391_name, lang.score))

    # 리뷰 컬렉션에 검지된 언어 코드를 추가한다(이렇게 함으로 더 많은 분석이 가능하다.
    reviews[review_num]["language"] = lang.iso6391_name

 

5. 언어 번역하기 한국어->영어

# API를 이용해서 한국어를 영어로 번역해본다.
import requests, uuid, json

# location, also known as region.
# required if you're using a multi-service or regional (not global) resource. It can be found in the Azure portal on the Keys and Endpoint page.
location = 'Koreacentral'
path = '/translate'
constructed_url = endpoint + path

params = {
    'api-version': '3.0',
    'from': 'ko',
    'to': 'en'
}

headers = {
    'Ocp-Apim-Subscription-Key': key,
    # location required if you're using a multi-service or regional (not global) resource.
    'Ocp-Apim-Subscription-Region': location,
    'Content-type': 'application/json',
    'X-ClientTraceId': str(uuid.uuid4())
}

# You can pass more than one object in body.
body = [{
    'text':  reviews[0]['text']}]

request = requests.post(constructed_url, params=params, headers=headers, json=body)
response = request.json()

#json화 시켰지만.. 크게 의미는 없다
print(json.dumps(response, sort_keys=True, ensure_ascii=False, indent=4, separators=(',', ': ')))

 

print(response[0]['translations'][0]['text'])

 

# 위의 한국어 리뷰를 영어로 바꿔서, 모두 영어리뷰로만 이루어진 새로운 리뷰 리스트를 만든다.
all_en_review=[]
for review in reviews:
    if review['language']=='ko':
        body = [{'text':  review['text']}]
        request = requests.post(constructed_url, params=params, headers=headers, json=body)
        response = request.json()
        ko_review= response[0]['translations'][0]['text']
        all_en_review.append(ko_review)
    else:
        all_en_review.append(review['text'])
print(all_en_review)

 

# 이번에는 감정분석을 하기 앞서, 원래 저장된 reviews 변수 안의 한국어 리뷰를 영어 리뷰로 교체한다.
for (i, review) in enumerate(reviews):
    if review['language']=='ko':
        body = [{'text':  review['text']}]
        request = requests.post(constructed_url, params=params, headers=headers, json=body)
        response = request.json()
        ko_review= response[0]['translations'][0]['text']
        reviews[i]['text']= ko_review
        reviews[i]['language']='en'
    
print(reviews)

 

 

6. 감정분석하기

sentiment_analysis= text_analytics_client.sentiment(documents=reviews)
for review_num in range(len(reviews)):
    sentiment_score = sentiment_analysis.documents[review_num].score
    print(sentiment_analysis.documents[review_num])
    
    if sentiment_score <0.5:
        sentiment='negative'
    elif sentiment_score ==0.5:
        sentiment='neutral'
    else:
        sentiment='negative'

    print('{} : {} ({})'.format(reviews[review_num]['id'], sentiment, sentiment_score))
    print()

결과값이 0.5라니.. 

부정적이지도 않고, 긍정적이지도 않다는 뜻인가보다..

그래서 neutral 중립이라는 문구를 추가해보았다.

 

 

7. 핵심 phrase 추출하기

# 이전 코드 셀에서 생성한 클라이언트와 리뷰들을 이용하여 핵심구를 추출한다
key_phrase_analysis = text_analytics_client.key_phrases(documents=reviews)

# 각 리뷰별로 핵심 구를 인쇄한다
for review_num in range(len(reviews)):
    print(review_num)
    # 리뷰 ID를 인쇄한다.
    print(reviews[review_num]['id'])

    # 이 리뷰에 있는 핵심 구를 가져온다.
    print('\nKey Phrases:')
    key_phrases = key_phrase_analysis.documents[review_num].key_phrases
    # 각 핵심 구를 인쇄한다.
    print(key_phrases)
    for key_phrase in key_phrases:
        print('\t', key_phrase)
    print('\n')

 

 

8. 언어 감지하기

import os
from azure.cognitiveservices.language.textanalytics import TextAnalyticsClient
from msrest.authentication import CognitiveServicesCredentials

# Text Analytics Cognitive 서비스 리소스를 위한 클라이언트 가져오기
text_analytics_client = TextAnalyticsClient(endpoint=cog_endpoint,
                                            credentials=CognitiveServicesCredentials(cog_key))

# 앞에서 언급한 /data/reviews 폴더로부터 읽은 리뷰들을 분석한다
language_analysis = text_analytics_client.detect_language(documents=reviews)

# 각 리뷰에서 감지된 언어 세부 정보들을 프린트한다.
for review_num in range(len(reviews)):
    # print the review id
    print(reviews[review_num]['id'])

    # 이 리뷰에 대한 언어 세부 정보를 가져온다.
    lang = language_analysis.documents[review_num].detected_languages[0]
    print(' - Language: {}\n - Code: {}\n - Score: {}\n'.format(lang.name, lang.iso6391_name, lang.score))

    # 리뷰 컬렉션에 검지된 언어 코드를 추가한다(이렇게 함으로 더 많은 분석이 가능하다.
    reviews[review_num]["language"] = lang.iso6391_name

 

9. 엔티티 추출하기- 날짜와 위치만

# 이전 코드 셀에서 생성한 클라이언트와 리뷰들을 이용하여 정한 엔터티들을 가져온다
entity_analysis = text_analytics_client.entities(documents=reviews)

# 리뷰들에 대한 결과들을 프린트한다
for review_num in range(len(reviews)):
    print(reviews[review_num]['id'])
    # 이 리뷰에 포함되어 있는 엔터티들을 가져온다
    entities = entity_analysis.documents[review_num].entities
    for entity in entities:
        # 장소 날짜와 엔터티들을 가져온다
        if entity.type in ['DateTime','Location']:
            link = '(' + entity.wikipedia_url + ')' if entity.wikipedia_id is not None else ''
            print(' - {}: {} {}'.format(entity.type, entity.name, link))