[Natural Language] Overview
[Natural Language] Overview
- Overview
- tokenizing-natural-language-text
- identifying-the-language-in-text
자연어 텍스트를 분석하고 언어별 메타데이터 추론
자연어 프레임워크는 다양한 언어와 스크립트를 지원하는 다양한 자연어 처리(NLP) 기능을 제공.
이 프레임워크를 사용하여 자연어 텍스트를 단락, 문장 또는 단어로 분류하고 품사, 어휘 클래스, 어휘, 스크립트 및 언어와 같은 해당 세그먼트에 대한 정보에 태그를 지정할 수 있음.
이 프레임워크를 사용하여 다음과 같은 작업을 수행
- 언어 식별, 텍스트의 언어를 자동으로 감지
- 토큰화, 텍스트 조각을 언어 단위 또는 토큰으로 나누는 작업
- 품사 태깅: 개별 단어에 품사를 표시하는 작업
- 형태소 분석에 기반하여 단어의 어간을 추론하는 어간화
- 명명된 엔티티 인식: 토큰을 사람, 장소 또는 조직의 이름으로 식별
이 프레임워크를 Create ML과 함께 사용하여 사용자 지정 자연어 모델을 학습하고 배포할 수 있음.
Tokenizing natural language text
자연어 텍스트로 작업할 때는 텍스트를 개별 단어로 토큰화하는 것이 유용할 때가 많음.
단순히 공백으로 구성 요소를 분리하는 대신 NLTokenizer를 사용하여 단어를 열거하면 여러 스크립트와 언어에서 올바른 동작을 보장할 수 있음. 예를 들어 중국어와 일본어는 단어를 구분할 때 공백을 사용하지 않습니다.
아래 예시와 함께 제공되는 단계는 NLTokenizer를 사용하여 자연어 텍스트의 단어를 열거하는 방법을 보여줌.
let text = """
All human beings are born free and equal in dignity and rights.
They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.
"""
let tokenizer = NLTokenizer(unit: .word)
tokenizer.string = text
tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { tokenRange, _ in
print(text[tokenRange])
return true
}
// console
All human beings are born free and equal in dignity and rights.
They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.
해당 부분은 sentence로 뽑은 결과물
토큰화할 단위로 NLTokenUnit.word를 지정하여 NLTokenizer의 인스턴스를 생성
토큰화기의 문자열 속성을 자연어 텍스트로 설정
처리할 문자열의 전체 범위를 지정하여 enumerateTokensInRange:usingBlock: 메서드를 호출하여 문자열의 전체 범위에 대해 열거
열거 블록에서 토큰 범위에서 원본 텍스트의 하위 문자열을 가져와 각 단어를 가져옴.
이 코드를 실행하여 각 단어를 새 줄에 텍스트로 인쇄.
Tokenizing natural language text
언어 식별은 텍스트의 언어와 스크립트를 자동으로 감지하는 작업. 자연어에서는 NLLanguageRecognizer가 이 작업을 수행.
언어 인식기를 사용하면 입력 텍스트에 대해 가장 가능성이 높은 언어 또는 관련 확률을 가진 가능한 언어 후보 집합을 얻을 수 있음. 언어에 대해 알려진 확률에 대한 힌트 목록이나 예측이 제한되는 언어 목록을 제공하여 식별 프로세스를 제한할 수도 있음. NLLanguage에서 지원되는 언어를 찾을 수 있지만 자체 언어 태그를 정의하여 사용할 수도 있음.
아래는 예제 코드임.
// Create a language recognizer.
let recognizer = NLLanguageRecognizer()
recognizer.processString("This is a test, mein Freund.")
// Identify the dominant language.
if let language = recognizer.dominantLanguage {
print(language.rawValue)
} else {
print("Language not recognized")
}
// Generate up to two language hypotheses.
let hypotheses = recognizer.languageHypotheses(withMaximum: 2)
print(hypotheses)
아래 결과를 보면 가장 지배적은 언어는 영어고 그 다음은 de
언어 제한을 식별할 수도 있음.
필수는 아니지만, 식별하려는 텍스트에 대해 이미 알고 있는 경우 언어 인식기에 해당 텍스트에 대한 정보를 제공할 수 있음.
예를 들어 언어가 특정 언어 집합 내에 있어야 한다는 것을 알고 있는 경우 해당 제약 조건을 지정할 수 있음.
구체적으로 이러한 제약 조건 중 하나 또는 둘 모두를 제공할 수 있음.
- 예측이 제약되는 언어 목록
- 일부 또는 모든 언어에 대해 알려진 확률 목록
아래는 코드 예제.
// 언어 식별을 위한 제약 조건을 지정
recognizer.languageConstraints = [.french, .english, .german,
.italian, .spanish, .portuguese]
recognizer.languageHints = [.french: 0.5,
.english: 0.9,
.german: 0.8,
.italian: 0.6,
.spanish: 0.3,
.portuguese: 0.2]
let constrainedHypotheses = recognizer.languageHypotheses(withMaximum: 2)
print(constrainedHypotheses)
위의 첫줄의 결과보다 두번째 줄의 결과에서 더 정확하게 나타내는 것을 확인할 수 있음.
여러 텍스트 언어를 식별할 수 있음.
개별적으로 식별하려는 언어가 다른 텍스트 조각이 있는 경우 다음 문자열을 처리하기 전에 인식기를 재설정해야 합니다. 언어 인식기를 재설정하면 이전에 제공한 입력 문자열, 언어 제약 조건 및 힌트가 모두 제거되어 초기 상태로 돌아갑니다.
// 인식기를 초기 상태로 재설정
recognizer.reset()
// 언어 식별을 위한 추가 문자열을 처리
recognizer.processString("Este es un idioma diferente.")
(참고)
https://developer.apple.com/documentation/naturallanguage/
https://developer.apple.com/documentation/naturallanguage/tokenizing-natural-language-text
https://developer.apple.com/documentation/naturallanguage/identifying-the-language-in-text