티스토리 뷰

반응형

 

 

 

지난번 포스팅에서는 NLTagger로 간단하게 문자열을 단어 단위로 토큰화해봤었는데요.
오늘은 해당 문자열을 어휘(품사) 혹은 지역, 인물, 회사 등의 다양한 기준으로 토큰화 및 분석결과를 얻는 방법을 알아보겠습니다.

이번 포스팅의 과정은 과정은 지난번에 작성한 코드에서 이어서 진행해도 문제가 없습니다. 

 

 

 


NLTagger로 문자열 품사별(.LexicalClass) 토큰화하기

지난번과 같이 playground 파일을 열어서, 빈 프로젝트 파일에 import NaturalLanguage를 import 해줍니다. 

// MARK: - String Tokenizer
// - 문자열의 토큰화는 자연어 처리에 있어서 핵심적인 기능 중 하나입니다. 
// - 문자열을 토큰화해보는 예제)

import NaturalLanguage

 

 

 

분석 및 토큰화에 사용할 문자열을 영어로 준비합니다. 분석하려는 문자열을 자유롭게 준비해주시면 됩니다.

let textString = "Knowledge will give you power, but character respect."

 

 

 

자연어 처리 및 토큰화를 할 문자열을 준비했다면 이제 NLTagger 객체를 생성합니다. 지난번과 달리, tagSchemes의 옵션값으로 .language, .lexicalClass를 넣어줍니다. 여기에서 .lexicalClass는 분석하는 문자열에 대해서 어휘 단위로 태깅을 할 수 있는 옵션입니다. 

// NLTagger 객체를 생성합니다.tagSchemes 인자값에는 .tokenType으로 지정합니다.
// 1) .lexicalClass : 어떤 토큰이 품사의 일부인지, 공백과 점인지를 알아냅니다.
// 2) .langauge : 언어를 제공합니다.
let tagger = NLTagger(tagSchemes: [.language, .lexicalClass])

// tagger에 대해 분석하려는 문자열을 셋팅합니다.
tagger.string = textString

 

 

 

이제 tagger 인스턴스를 통해 특적 기준으로 문자열을 토큰화하고 그 결과를 나열해서 출력해 보겠습니다. 

// 특정 문자열의 범위, 토큰유닛, 토큰타입, 옵션 등을 지정해서 해당 조건에 맞는 문자열을 열거하는데 사용합니다.
tagger.enumerateTags(
    in: textString.startIndex..<textString.endIndex,
    unit: NLTokenUnit.word, // 유닛 : 개별적인 단어
    scheme: NLTagScheme.lexicalClass,
    options: [.omitPunctuation, .omitWhitespace]) { (tag, range) -> Bool in
        print(textString[range])
        print("-> ", tag?.rawValue ?? "unknown", separator: " ")
        return true
}

tagger의 enumerateTags 메서드를 사용합니다

지난번 소개했듯이, 메서드 enumerateTags에서는 분석하려는 문자열의 범위, 토큰유닛, 토큰타입, 옵션(공백, 점 등을 빼는 등)을 다양하게 설정한 문자열 처리 결과를 열거해서 tag, range 값으로 받을 수 있습니다. 

 

 


unit 인자값은 word로 개별적인 단어로 토큰화하도록 설정하고, scheme 인자값으로는 lexicalClass를 설정합니다. 

지난번에는 lexicalClass 대신 tokenType을 scheme 인자값으로 설정했었는데요. lexicalClass와 tokenType의 결과값 차이는 아래와 같습니다. 

Toekn type은 단어, 공백, 점, other 등의 단위로 태깅작업을 한다면, lexical class에서는 품사인 대명사, 명사, 동사, None 등의 결과를 태깅정보로 제공합니다. 분석하려는 문자열의 성질에 따라 이러한 특성을 고려하여 설정해서 사용할 수 있습니다. 

 

 

 

lexicalClass를 scheme으로 설정 한 뒤 문자열을 토큰화한 결과값을 태그와 함께 출력해본 결과

위와 같이 tagger의 enumerateTags 메서드의 결과를 볼 수 있습니다. 

주어진 문자열을 단어 단위로 토큰화 하고, 그 태깅 결과 값으로 lexicalClass 설정을 통해 대명사, 접속사, 동사, 명사 등의 세부적인 문자열 토큰 별 품사 정보를 흭득할 수 있습니다. 

 

 


NLTagger로 문자열 이름단위(.nameType) 토큰화하기

이번에는 tokenType, lexicalClass 대신, NLTagger의 tagSchemes, enumerateTags메서드의 scheme 인자값으로 nameType을 설정해보겠습니다. nameType은 지명, 인물명 등의 기준으로 태깅 결과값을 제공합니다. 

// 현재 분석하고자 하는 문자열
let textString = "Steven Paul Jobs, Apple Computer, Los Altos Home."

// NLTagger 객체를 생성합니다.tagSchemes 인자값에는 .tokenType으로 지정합니다.
// 1) .lexicalClass : 어떤 토큰이 품사의 일부인지, 공백과 점인지를 알아냅니다.
// 2) .langauge : 언어를 제공합니다.
// 3) .nameType : 사람이름, 회사명, 지역 등의 기준으로 문자열을 구분합니다.
let tagger = NLTagger(tagSchemes: [.nameType])

// tagger에 대해 분석하려는 문자열을 셋팅합니다.
tagger.string = textString

// 특정 문자열의 범위, 토큰유닛, 토큰타입, 옵션 등을 지정해서 해당 조건에 맞는 문자열을 열거하는데 사용합니다.
tagger.enumerateTags(
    in: textString.startIndex..<textString.endIndex,
    unit: NLTokenUnit.word, // 유닛 : 개별적인 단어
    scheme: NLTagScheme.nameType, // NLTagger를 .nameType 기준으로 설정했다면 scheme 인자값 또한 nameType으로 설정합니다.
    options: [.omitPunctuation, .omitWhitespace]) { (tag, range) -> Bool in
        print(textString[range])
        print("-> ", tag?.rawValue ?? "unknown", separator: " ")
        return true
}


위와 같이 .nameType으로 설정 한 결과는 인물명, 회사명, 지역 등의 기준으로 문자열 분석결과를 제공하는 것을 알 수 있습니다. 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함