1. 개요
Natural Language API를 사용하면 Google 머신러닝을 사용하여 구조화되지 않은 텍스트에서 정보를 추출할 수 있습니다. 이 튜토리얼에서는 Python 클라이언트 라이브러리 사용에 중점을 둡니다.
학습할 내용
- 환경을 설정하는 방법
- 감정 분석을 수행하는 방법
- 항목 분석을 수행하는 방법
- 구문 분석을 수행하는 방법
- 콘텐츠 분류 수행 방법
- 텍스트 검토 방법
필요한 항목
설문조사
이 튜토리얼을 어떻게 사용하실 계획인가요?
귀하의 Python 사용 경험이 어떤지 평가해 주세요.
귀하의 Google Cloud 서비스 경험을 평가해 주세요.
<ph type="x-smartling-placeholder">2. 설정 및 요건
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수도 있지만 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.
Cloud Shell 활성화
- Cloud Console에서 Cloud Shell 활성화를 클릭합니다.
Cloud Shell을 처음 시작하는 경우에는 무엇이 있는지 설명하는 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.
Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.
가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저를 사용하여 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 자신의 프로젝트 ID로 설정된 것을 확인할 수 있습니다.
- Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
3. 환경 설정
Natural Language API를 사용하려면 먼저 Cloud Shell에서 다음 명령어를 실행하여 API를 사용 설정합니다.
gcloud services enable language.googleapis.com
다음과 같은 결과를 확인할 수 있습니다.
Operation "operations/..." finished successfully.
이제 Natural Language API를 사용할 수 있습니다.
홈 디렉터리로 이동합니다.
cd ~
Python 가상 환경을 만들어 종속 항목을 격리합니다.
virtualenv venv-language
가상 환경을 활성화합니다.
source venv-language/bin/activate
IPython, Pandas, Natural Language API 클라이언트 라이브러리를 설치합니다.
pip install ipython pandas tabulate google-cloud-language
다음과 같은 결과를 확인할 수 있습니다.
... Installing collected packages: ... pandas ... ipython ... google-cloud-language Successfully installed ... google-cloud-language-2.11.0 ...
이제 Natural Language API 클라이언트 라이브러리를 사용할 준비가 되었습니다.
다음 단계에서는 이전 단계에서 설치한 대화형 Python 인터프리터인 IPython을 사용합니다. Cloud Shell에서 ipython
를 실행하여 세션을 시작합니다.
ipython
다음과 같은 결과를 확인할 수 있습니다.
Python 3.9.2 (default, Feb 28 2021, 17:03:44) Type 'copyright', 'credits' or 'license' for more information IPython 8.15.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
4. 감정 분석
감정 분석은 주어진 텍스트를 조사하고 텍스트 내의 주도적인 감정적 의견을 식별하여 특히 문장 및 문서 수준에서 표현된 감정이 긍정적인지, 부정적인지 또는 중립적인지를 판단합니다. 이 작업은 AnalyzeSentimentResponse
를 반환하는 analyze_sentiment
메서드를 사용하여 실행됩니다.
다음 코드를 IPython 세션에 복사합니다.
from google.cloud import language
def analyze_text_sentiment(text: str) -> language.AnalyzeSentimentResponse:
client = language.LanguageServiceClient()
document = language.Document(
content=text,
type_=language.Document.Type.PLAIN_TEXT,
)
return client.analyze_sentiment(document=document)
def show_text_sentiment(response: language.AnalyzeSentimentResponse):
import pandas as pd
columns = ["score", "sentence"]
data = [(s.sentiment.score, s.text.content) for s in response.sentences]
df_sentence = pd.DataFrame(columns=columns, data=data)
sentiment = response.document_sentiment
columns = ["score", "magnitude", "language"]
data = [(sentiment.score, sentiment.magnitude, response.language)]
df_document = pd.DataFrame(columns=columns, data=data)
format_args = dict(index=False, tablefmt="presto", floatfmt="+.1f")
print(f"At sentence level:\n{df_sentence.to_markdown(**format_args)}")
print()
print(f"At document level:\n{df_document.to_markdown(**format_args)}")
분석 수행:
# Input
text = """
Python is a very readable language, which makes it easy to understand and maintain code.
It's simple, very flexible, easy to learn, and suitable for a wide variety of tasks.
One disadvantage is its speed: it's not as fast as some other programming languages.
"""
# Send a request to the API
analyze_sentiment_response = analyze_text_sentiment(text)
# Show the results
show_text_sentiment(analyze_sentiment_response)
다음과 같은 출력이 표시됩니다.
At sentence level: score | sentence ---------+------------------------------------------------------------------------------------------ +0.8 | Python is a very readable language, which makes it easy to understand and maintain code. +0.9 | It's simple, very flexible, easy to learn, and suitable for a wide variety of tasks. -0.4 | One disadvantage is its speed: it's not as fast as some other programming languages. At document level: score | magnitude | language ---------+-------------+------------ +0.4 | +2.2 | en
잠시 시간을 내어 자신의 문장을 테스트해 보세요.
요약
이 단계에서는 텍스트 문자열에 대한 감정 분석을 수행했습니다.
5. 항목 분석
항목 분석은 주어진 텍스트에서 알려진 항목 (유명 인사, 명소 등의 고유 명사)을 검사하고 이러한 항목에 대한 정보를 반환합니다. 이 작업은 AnalyzeEntitiesResponse
를 반환하는 analyze_entities
메서드를 사용하여 실행됩니다.
다음 코드를 IPython 세션에 복사합니다.
from google.cloud import language
def analyze_text_entities(text: str) -> language.AnalyzeEntitiesResponse:
client = language.LanguageServiceClient()
document = language.Document(
content=text,
type_=language.Document.Type.PLAIN_TEXT,
)
return client.analyze_entities(document=document)
def show_text_entities(response: language.AnalyzeEntitiesResponse):
import pandas as pd
columns = ("name", "type", "salience", "mid", "wikipedia_url")
data = (
(
entity.name,
entity.type_.name,
entity.salience,
entity.metadata.get("mid", ""),
entity.metadata.get("wikipedia_url", ""),
)
for entity in response.entities
)
df = pd.DataFrame(columns=columns, data=data)
print(df.to_markdown(index=False, tablefmt="presto", floatfmt=".0%"))
분석 수행:
# Input
text = """Guido van Rossum is best known as the creator of Python,
which he named after the Monty Python comedy troupe.
He was born in Haarlem, Netherlands.
"""
# Send a request to the API
analyze_entities_response = analyze_text_entities(text)
# Show the results
show_text_entities(analyze_entities_response)
다음과 같은 출력이 표시됩니다.
name | type | salience | mid | wikipedia_url ------------------+--------------+------------+-----------+------------------------------------------------------------- Guido van Rossum | PERSON | 50% | /m/01h05c | https://en.wikipedia.org/wiki/Guido_van_Rossum Python | ORGANIZATION | 38% | /m/05z1_ | https://en.wikipedia.org/wiki/Python_(programming_language) creator | PERSON | 5% | | Monty Python | PERSON | 3% | /m/04sd0 | https://en.wikipedia.org/wiki/Monty_Python comedy troupe | PERSON | 2% | | Haarlem | LOCATION | 1% | /m/0h095 | https://en.wikipedia.org/wiki/Haarlem Netherlands | LOCATION | 1% | /m/059j2 | https://en.wikipedia.org/wiki/Netherlands
잠시 시간을 내어 다른 항목을 언급하는 자신의 문장을 테스트해 보세요.
요약
이 단계에서는 항목 분석을 수행했습니다.
6. 구문 분석
구문 분석은 언어 정보를 추출하여 주어진 텍스트를 일련의 문장과 토큰 (일반적으로 단어 경계를 기준으로 함)으로 분해하고 해당 토큰에 대한 추가 분석을 제공합니다. 이 작업은 AnalyzeSyntaxResponse
를 반환하는 analyze_syntax
메서드를 사용하여 실행됩니다.
다음 코드를 IPython 세션에 복사합니다.
from typing import Optional
from google.cloud import language
def analyze_text_syntax(text: str) -> language.AnalyzeSyntaxResponse:
client = language.LanguageServiceClient()
document = language.Document(
content=text,
type_=language.Document.Type.PLAIN_TEXT,
)
return client.analyze_syntax(document=document)
def get_token_info(token: Optional[language.Token]) -> list[str]:
parts = [
"tag",
"aspect",
"case",
"form",
"gender",
"mood",
"number",
"person",
"proper",
"reciprocity",
"tense",
"voice",
]
if not token:
return ["token", "lemma"] + parts
text = token.text.content
lemma = token.lemma if token.lemma != token.text.content else ""
info = [text, lemma]
for part in parts:
pos = token.part_of_speech
info.append(getattr(pos, part).name if part in pos else "")
return info
def show_text_syntax(response: language.AnalyzeSyntaxResponse):
import pandas as pd
tokens = len(response.tokens)
sentences = len(response.sentences)
columns = get_token_info(None)
data = (get_token_info(token) for token in response.tokens)
df = pd.DataFrame(columns=columns, data=data)
# Remove empty columns
empty_columns = [col for col in df if df[col].eq("").all()]
df.drop(empty_columns, axis=1, inplace=True)
print(f"Analyzed {tokens} token(s) from {sentences} sentence(s):")
print(df.to_markdown(index=False, tablefmt="presto"))
분석 수행:
# Input
text = """Guido van Rossum is best known as the creator of Python.
He was born in Haarlem, Netherlands.
"""
# Send a request to the API
analyze_syntax_response = analyze_text_syntax(text)
# Show the results
show_text_syntax(analyze_syntax_response)
다음과 같은 출력이 표시됩니다.
Analyzed 20 token(s) from 2 sentence(s): token | lemma | tag | case | gender | mood | number | person | proper | tense | voice -------------+---------+-------+------------+-----------+------------+----------+----------+----------+---------+--------- Guido | | NOUN | | | | SINGULAR | | PROPER | | van | | NOUN | | | | SINGULAR | | PROPER | | Rossum | | NOUN | | | | SINGULAR | | PROPER | | is | be | VERB | | | INDICATIVE | SINGULAR | THIRD | | PRESENT | best | well | ADV | | | | | | | | known | know | VERB | | | | | | | PAST | as | | ADP | | | | | | | | the | | DET | | | | | | | | creator | | NOUN | | | | SINGULAR | | | | of | | ADP | | | | | | | | Python | | NOUN | | | | SINGULAR | | PROPER | | . | | PUNCT | | | | | | | | He | | PRON | NOMINATIVE | MASCULINE | | SINGULAR | THIRD | | | was | be | VERB | | | INDICATIVE | SINGULAR | THIRD | | PAST | born | bear | VERB | | | | | | | PAST | PASSIVE in | | ADP | | | | | | | | Haarlem | | NOUN | | | | SINGULAR | | PROPER | | , | | PUNCT | | | | | | | | Netherlands | | NOUN | | | | SINGULAR | | PROPER | | . | | PUNCT | | | | | | | |
잠시 시간을 내어 다른 구문 구조로 자신의 문장을 테스트해 보세요.
응답 통계를 자세히 살펴보면 토큰 간의 관계도 확인할 수 있습니다. 다음은 이 예의 완전한 구문 분석을 보여주는 시각적 해석과 온라인 자연어 데모의 스크린샷입니다.
요약
이 단계에서는 구문 분석을 수행했습니다.
7. 콘텐츠 분류
콘텐츠 분류는 문서를 분석하고 문서에서 찾은 텍스트에 적용되는 콘텐츠 카테고리 목록을 반환합니다. 이 작업은 ClassifyTextResponse
를 반환하는 classify_text
메서드를 사용하여 실행됩니다.
다음 코드를 IPython 세션에 복사합니다.
from google.cloud import language
def classify_text(text: str) -> language.ClassifyTextResponse:
client = language.LanguageServiceClient()
document = language.Document(
content=text,
type_=language.Document.Type.PLAIN_TEXT,
)
return client.classify_text(document=document)
def show_text_classification(text: str, response: language.ClassifyTextResponse):
import pandas as pd
columns = ["category", "confidence"]
data = ((category.name, category.confidence) for category in response.categories)
df = pd.DataFrame(columns=columns, data=data)
print(f"Text analyzed:\n{text}")
print(df.to_markdown(index=False, tablefmt="presto", floatfmt=".0%"))
분석 수행:
# Input
text = """Python is an interpreted, high-level, general-purpose programming language.
Created by Guido van Rossum and first released in 1991, Python's design philosophy
emphasizes code readability with its notable use of significant whitespace.
"""
# Send a request to the API
classify_text_response = classify_text(text)
# Show the results
show_text_classification(text, classify_text_response)
다음과 같은 출력이 표시됩니다.
Text analyzed: Python is an interpreted, high-level, general-purpose programming language. Created by Guido van Rossum and first released in 1991, Python's design philosophy emphasizes code readability with its notable use of significant whitespace. category | confidence --------------------------------------+-------------- /Computers & Electronics/Programming | 99% /Science/Computer Science | 99%
잠시 시간을 내어 다른 카테고리와 관련된 자신의 문장을 테스트해 보세요. 최소 20개의 토큰 (단어 및 구두점 기호)이 포함된 텍스트 블록 (문서)을 제공해야 합니다.
요약
이 단계에서는 콘텐츠 분류를 수행했습니다.
8. 텍스트 검토
Google의 최신 PaLM 2 기반 모델을 기반으로 하는 텍스트 검토는 증오심 표현, 괴롭힘, 성희롱 등 다양한 유해한 콘텐츠를 식별합니다. 이 작업은 ModerateTextResponse
를 반환하는 moderate_text
메서드를 사용하여 실행됩니다.
다음 코드를 IPython 세션에 복사합니다.
from google.cloud import language
def moderate_text(text: str) -> language.ModerateTextResponse:
client = language.LanguageServiceClient()
document = language.Document(
content=text,
type_=language.Document.Type.PLAIN_TEXT,
)
return client.moderate_text(document=document)
def show_text_moderation(text: str, response: language.ModerateTextResponse):
import pandas as pd
def confidence(category: language.ClassificationCategory) -> float:
return category.confidence
columns = ["category", "confidence"]
categories = sorted(response.moderation_categories, key=confidence, reverse=True)
data = ((category.name, category.confidence) for category in categories)
df = pd.DataFrame(columns=columns, data=data)
print(f"Text analyzed:\n{text}")
print(df.to_markdown(index=False, tablefmt="presto", floatfmt=".0%"))
분석 수행:
# Input
text = """I have to read Ulysses by James Joyce.
I'm a little over halfway through and I hate it.
What a pile of garbage!
"""
# Send a request to the API
response = moderate_text(text)
# Show the results
show_text_moderation(text, response)
다음과 같은 출력이 표시됩니다.
Text analyzed: I have to read Ulysses by James Joyce. I'm a little over halfway through and I hate it. What a pile of garbage! category | confidence -----------------------+-------------- Toxic | 67% Insult | 58% Profanity | 53% Violent | 48% Illicit Drugs | 29% Religion & Belief | 27% Politics | 22% Death, Harm & Tragedy | 21% Finance | 18% Derogatory | 14% Firearms & Weapons | 11% Health | 10% Legal | 10% War & Conflict | 7% Public Safety | 5% Sexual | 4%
잠시 시간을 내어 자신의 문장을 테스트해 보세요.
요약
이 단계에서는 텍스트 검토를 수행할 수 있었습니다.
9. 축하합니다.
Python을 사용하여 Natural Language API를 사용하는 방법을 알아봤습니다.
삭제
Cloud Shell에서 개발 환경을 삭제하려면 다음 안내를 따르세요.
- 아직 IPython 세션에 있다면 셸로 돌아갑니다.
exit
- Python 가상 환경 사용 중지:
deactivate
- 가상 환경 폴더 삭제:
cd ~ ; rm -rf ./venv-language
Google Cloud 프로젝트를 삭제하려면 Cloud Shell에서 다음 안내를 따르세요.
- 현재 프로젝트 ID를 가져옵니다.
PROJECT_ID=$(gcloud config get-value core/project)
- 삭제하려는 프로젝트가 맞는지 확인합니다.
echo $PROJECT_ID
- 프로젝트 삭제:
gcloud projects delete $PROJECT_ID
자세히 알아보기
- 브라우저에서 데모 테스트: https://cloud.google.com/natural-language#natural-language-api-demo
- Natural Language 문서: https://cloud.google.com/natural-language/docs
- Google Cloud 기반 Python: https://cloud.google.com/python
- Python용 Cloud 클라이언트 라이브러리: https://github.com/googleapis/google-cloud-python
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.