마이크로소프트/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))