다음을 통해 공유


REST API 및 SynapseML(미리 보기)을 사용하여 패브릭에서 Azure AI 언어 텍스트 분석 사용

Important

이 기능은 미리 보기로 제공됩니다.

Azure AI Language 는 NLP(자연어 처리) 기능을 사용하여 텍스트 마이닝 및 텍스트 분석을 수행할 수 있는 Azure AI 서비스 입니다.

이 문서에서는 Microsoft Fabric에서 직접 Azure AI Language 서비스를 사용하여 텍스트를 분석하는 방법을 알아봅니다. 이 문서의 끝부분에서 다음을 수행할 수 있습니다.

  • 문장 또는 문서 수준의 감정 레이블 검색
  • 지정된 텍스트 입력에 대한 언어 식별
  • 텍스트에서 핵심 구 추출
  • 텍스트에서 다른 엔터티를 식별하고 미리 정의된 클래스 또는 형식으로 분류

필수 조건

  • 새 Notebook을 만듭니다.
  • 노트북을 레이크하우스에 연결합니다. Notebook 왼쪽에서 추가를 선택하여 기존 레이크하우스를 추가하거나 새 레이크하우스를 만듭니다.

비고

이 문서에서는 인증을 자동으로 처리하는 Microsoft Fabric의 기본 제공 미리 빌드된 AI 서비스를 사용합니다. 별도의 Azure AI 서비스 키를 가져올 필요가 없습니다. 인증은 패브릭 작업 영역을 통해 관리됩니다. 자세한 내용은 패브릭의 미리 빌드된 AI 모델(미리 보기)을 참조하세요.

이 문서의 코드 샘플은 Microsoft Fabric Notebook에 미리 설치된 라이브러리를 사용합니다.

  • SynapseML: 기계 학습 기능을 위해 Fabric Notebook에 미리 설치됨
  • PySpark: 패브릭 Spark 컴퓨팅에서 기본적으로 사용 가능
  • 표준 Python 라이브러리: jsonPython uuid 표준 라이브러리의 일부입니다.

비고

Microsoft Fabric Notebook에는 많은 일반 라이브러리가 미리 설치되어 있습니다. MLflow 통합 및 텍스트 분석 기능을 제공하는 SynapseML 라이브러리는 Spark 환경에서 자동으로 사용할 수 있습니다.

접근 방식 선택

이 문서에서는 패브릭에서 Azure AI Language 서비스를 사용하는 두 가지 방법을 제공합니다.

  • REST API 접근 방식: 서비스에 대한 직접 HTTP 호출(초보자에게 권장)
  • SynapseML 접근 방식: 대규모 처리를 위해 Spark DataFrames 사용

팁 (조언)

새 사용자는 쉽게 이해하고 디버그할 수 있으므로 REST API 접근 방식부터 시작해야 합니다. SynapseML 접근 방식은 Spark를 사용하여 큰 데이터 세트를 처리하는 데 더 적합합니다.

인증 및 엔드포인트 설정

이 코드를 복사하여 Fabric Notebook의 첫 번째 셀에 붙여넣어 Azure AI Language 서비스에 대한 연결을 설정합니다.

비고

이 코드는 패브릭의 기본 제공 인증을 사용합니다. 이 함수는 get_fabric_env_config 자동으로 작업 영역 자격 증명을 검색하고 미리 빌드된 AI 서비스에 연결합니다. API 키가 필요하지 않습니다.

# Get workload endpoints and access token
from synapse.ml.fabric.service_discovery import get_fabric_env_config
from synapse.ml.fabric.token_utils import TokenUtils
import json
import requests

fabric_env_config = get_fabric_env_config().fabric_env_config
auth_header = TokenUtils().get_openai_auth_header()

# Make a RESful request to AI service
prebuilt_AI_base_host = fabric_env_config.ml_workload_endpoint + "cognitive/textanalytics/"
print("Workload endpoint for AI service: \n" + prebuilt_AI_base_host)

service_url = prebuilt_AI_base_host + "language/:analyze-text?api-version=2022-05-01"
print("Service URL: \n" + service_url)

auth_headers = {
    "Authorization" : auth_header
}

def print_response(response):
    if response.status_code == 200:
        print(json.dumps(response.json(), indent=2))
    else:
        print(f"Error: {response.status_code}, {response.content}")

관심도 분석

감정 분석 기능은 문장 및 문서 수준에서 감정 레이블(예: "부정", "중립" 및 "긍정")과 신뢰도 점수를 검색하는 방법을 제공합니다. 또한 이 기능은 각 문서에 대해 0에서 1 사이의 신뢰도 점수를 반환하고 그 안의 문장은 긍정적, 중립 및 부정적인 감정에 대해 반환합니다. 사용 가능한 언어 목록은 감정 분석 및 오피니언 마이닝 언어 지원을 참조하세요.

텍스트 감정 분석

이 코드를 Notebook의 새 셀에 복사하여 샘플 텍스트의 감정을 분석합니다.

payload = {
    "kind": "SentimentAnalysis",
    "parameters": {
        "modelVersion": "latest",
        "opinionMining": "True"
    },
    "analysisInput":{
        "documents":[
            {
                "id":"1",
                "language":"en",
                "text": "The food and service were unacceptable. The concierge was nice, however."
            }
        ]
    }
} 

response = requests.post(service_url, json=payload, headers=auth_headers)


# Output all information of the request process
print_response(response)

팁 (조언)

"텍스트" 필드의 텍스트를 분석할 고유한 콘텐츠로 바꿀 수 있습니다. 서비스는 감정 점수를 반환하고 텍스트의 어느 부분이 양수, 음수 또는 중립인지를 식별합니다.

예상 출력

다음 코드를 성공적으로 실행하면 다음과 유사한 출력이 표시됩니다.

{
  "kind": "SentimentAnalysisResults",
  "results": {
    "documents": [
      {
        "id": "1",
        "sentiment": "negative",
        "confidenceScores": {
          "positive": 0.0,
          "neutral": 0.0,
          "negative": 1.0
        },
        "sentences": [
          {
            "sentiment": "negative",
            "confidenceScores": {
              "positive": 0.0,
              "neutral": 0.0,
              "negative": 1.0
            },
            "offset": 0,
            "length": 40,
            "text": "The food and service were unacceptable. ",
            "targets": [
              {
                "sentiment": "negative",
                "confidenceScores": {
                  "positive": 0.01,
                  "negative": 0.99
                },
                "offset": 4,
                "length": 4,
                "text": "food",
                "relations": [
                  {
                    "relationType": "assessment",
                    "ref": "#/documents/0/sentences/0/assessments/0"
                  }
                ]
              },
              {
                "sentiment": "negative",
                "confidenceScores": {
                  "positive": 0.01,
                  "negative": 0.99
                },
                "offset": 13,
                "length": 7,
                "text": "service",
                "relations": [
                  {
                    "relationType": "assessment",
                    "ref": "#/documents/0/sentences/0/assessments/0"
                  }
                ]
              }
            ],
            "assessments": [
              {
                "sentiment": "negative",
                "confidenceScores": {
                  "positive": 0.01,
                  "negative": 0.99
                },
                "offset": 26,
                "length": 12,
                "text": "unacceptable",
                "isNegated": false
              }
            ]
          },
          {
            "sentiment": "neutral",
            "confidenceScores": {
              "positive": 0.22,
              "neutral": 0.75,
              "negative": 0.04
            },
            "offset": 40,
            "length": 32,
            "text": "The concierge was nice, however.",
            "targets": [
              {
                "sentiment": "positive",
                "confidenceScores": {
                  "positive": 1.0,
                  "negative": 0.0
                },
                "offset": 44,
                "length": 9,
                "text": "concierge",
                "relations": [
                  {
                    "relationType": "assessment",
                    "ref": "#/documents/0/sentences/1/assessments/0"
                  }
                ]
              }
            ],
            "assessments": [
              {
                "sentiment": "positive",
                "confidenceScores": {
                  "positive": 1.0,
                  "negative": 0.0
                },
                "offset": 58,
                "length": 4,
                "text": "nice",
                "isNegated": false
              }
            ]
          }
        ],
        "warnings": []
      }
    ],
    "errors": [],
    "modelVersion": "2025-01-01"
  }
}

언어 감지기

언어 감지기는 각 문서에 대해 텍스트 입력을 평가하고, 분석 강도를 나타내는 점수가 있는 언어 식별자를 반환합니다. 이 기능은 알 수 없는 언어로 된 임의의 텍스트를 수집하는 콘텐츠 저장소에 유용합니다. 사용 가능한 언어 목록에 대한 언어 검색은 언어 감지에 지원되는 언어를 참조하세요.

payload = {
    "kind": "LanguageDetection",
    "parameters": {
        "modelVersion": "latest"
    },
    "analysisInput":{
        "documents":[
            {
                "id":"1",
                "text": "This is a document written in English."
            }
        ]
    }
}

response = requests.post(service_url, json=payload, headers=auth_headers)

# Output all information of the request process
print_response(response)

출력

{
  "kind": "LanguageDetectionResults",
  "results": {
    "documents": [
      {
        "id": "1",
        "warnings": [],
        "detectedLanguage": {
          "name": "English",
          "iso6391Name": "en",
          "confidenceScore": 0.95
        }
      }
    ],
    "errors": [],
    "modelVersion": "2024-11-01"
  }
}

핵심 구 추출기

핵심 구 추출은 구조화되지 않은 텍스트를 평가하고 핵심 구 목록을 반환합니다. 이 기능은 문서 컬렉션에서 주요 지점을 빠르게 식별해야 하는 경우에 유용합니다. 사용 가능한 언어 목록은 주요 문장 추출에서 지원되는 언어를 참조하세요.

payload = {
    "kind": "KeyPhraseExtraction",
    "parameters": {
        "modelVersion": "latest"
    },
    "analysisInput":{
        "documents":[
            {
                "id":"1",
                "language":"en",
                "text": "Dr. Smith has a very modern medical office, and she has great staff."
            }
        ]
    }
}

response = requests.post(service_url, json=payload, headers=auth_headers)

# Output all information of the request process
print_response(response)

출력

{
  "kind": "KeyPhraseExtractionResults",
  "results": {
    "documents": [
      {
        "id": "1",
        "keyPhrases": [
          "modern medical office",
          "Dr. Smith",
          "great staff"
        ],
        "warnings": []
      }
    ],
    "errors": [],
    "modelVersion": "2022-10-01"
  }
}

NER(명명된 엔터티 인식)

NER(명명된 엔터티 인식)은 텍스트에서 다양한 엔터티를 식별하고 이를 사용자, 위치, 이벤트, 제품, 조직 등의 미리 정의된 클래스 또는 형식으로 분류하는 기능입니다. 지원되는 언어 목록은 NER 언어 지원 페이지를 참조하세요.

payload = {
    "kind": "EntityRecognition",
    "parameters": {
        "modelVersion": "latest"
    },
    "analysisInput":{
        "documents":[
            {
                "id":"1",
                "language": "en",
                "text": "I had a wonderful trip to Seattle last week."
            }
        ]
    }
}

response = requests.post(service_url, json=payload, headers=auth_headers)

# Output all information of the request process
print_response(response)

출력

{
  "kind": "EntityRecognitionResults",
  "results": {
    "documents": [
      {
        "id": "1",
        "entities": [
          {
            "text": "trip",
            "category": "Event",
            "offset": 18,
            "length": 4,
            "confidenceScore": 0.66
          },
          {
            "text": "Seattle",
            "category": "Location",
            "subcategory": "City",
            "offset": 26,
            "length": 7,
            "confidenceScore": 1.0
          },
          {
            "text": "last week",
            "category": "DateTime",
            "subcategory": "DateRange",
            "offset": 34,
            "length": 9,
            "confidenceScore": 1.0
          }
        ],
        "warnings": []
      }
    ],
    "errors": [],
    "modelVersion": "2025-02-01"
  }
}


엔터티 연결

이 구역에는 REST API에 대한 단계가 없습니다.