NLPSwift

https://github.com/VamshiIITBHU14/NLPSwift

NSLinguisticTagger предоставляет единый интерфейс для функционала по обработке текста на естественном языке с поддержкой множества разных языков и скриптов. Программист может использовать данный класс для того, чтобы выделить из такого текста параграфы, предложения или слова и такую общую информацию, как часть речи, лексический класс, «лемма» (начальная/основная форма)!

Обработка текста на естественном языке (Natural-language processing, NLP):

Из википедии: Обработка естественного языка (Natural Language Processing, NLP) — общее направление искусственного интеллекта и математической лингвистики. Оно изучает проблемы компьютерного анализа и синтеза естественных языков. Применительно к искусственному интеллекту анализ означает понимание языка, а синтез — генерацию грамотного текста. Решение этих проблем будет означать создание более удобной формы взаимодействия компьютера и человека.

NLP в iOS с NSLinguisticTagger:

NSLinguisticTagger предоставляет единый интерфейс для функционала по обработке текста на естественном языке с поддержкой множества разных языков и скриптов. Программист может использовать данный класс для того, чтобы выделить из такого текста параграфы, предложения или слова и такую общую информацию, как часть речи, лексический класс, «лемма» (начальная/основная форма), скрипт («script») и язык.

Пример:

import UIKit

let inputString = "In Old Delhi, a neighborhood dating to the 1600s, stands the imposing Mughal-era Red Fort."


// tag schemes: tag schemes are constants that are used to identify pieces of information that we want from the input text. Tag schemes asks tagger to look for informations like
// Token type: a contant to classify each character as a word, punctuation or a whitespace
// Language: a constant to determine langugage of the token
// LexicalClass: this constant determines class of each token. i.e. it determines part of speech for a word, type of punctuation for a punctuation or type of whitespace for a whitespace
// Name type: this constant looks for tokens that are part of a named entity. It will look for a person's name , organizational name and name of a place
// Lemma: this constant returns the stem of word.
let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagScheme.tokenType, .language, .lexicalClass, .nameType, .lemma], options: 0)

// Options are the way to tell API as how to split the text. We are asking to ignore any punctuations and any whitespaces. Also, if there is a named entity then join it together i.e instead of considering "New" "Delhi" as two entities, join them together as one which is "New Delhi"
let options: NSLinguisticTagger.Options = [NSLinguisticTagger.Options.omitPunctuation, .omitWhitespace, .joinNames]

Часть речи (Part of speech, POS):

В английском существительное, глагол, прилагательное, наречие, местоимение, предлог, союз и междометие — части речи.

func partOfSpeech() {
    tagger.string = inputString
    let range = NSRange(location: 0, length: inputString.utf16.count)
    
    tagger.enumerateTags(in: range, unit: NSLinguisticTaggerUnit.word, scheme: NSLinguisticTagScheme.lexicalClass, options: options) { (tag, tokenRange, _) in
        if let tag = tag {
            let word = (inputString as NSString).substring(with: tokenRange)
            print("\(tag.rawValue) -> \(word)")
        }
    }
}

Результат вызова метода в Playground:

partOfSpeech()

Preposition -> In
Noun -> Old Delhi
Determiner -> a
Noun -> neighborhood
Verb -> dating
Preposition -> to
Determiner -> the
Number -> 1600s
Verb -> stands
Determiner -> the
Adjective -> imposing
Noun -> Mughal
Noun -> era
Noun -> Red
Noun -> Fort

Лексический класс:

Лексический класс — то же, что и POS, но может исключать части речи, например местоимения

Поиск имен:

Имена людей или названия мест:

func namedEntity(str: String) {
    tagger.string = str
    
    let range = NSRange(location: 0, length: str.utf16.count)
    
    let tags: [NSLinguisticTag] = [NSLinguisticTag.personalName, .placeName, .organizationName]
    
    tagger.enumerateTags(in: range, unit: NSLinguisticTaggerUnit.word, scheme: NSLinguisticTagScheme.nameType, options: options) { (tag, tokenRange, _) in
        
        if let tag = tag, tags.contains(tag) {
            let name = (str as NSString).substring(with: tokenRange)
            print("\(name) : \(tag.rawValue)")
        }
        
    }
}

namedEntity(str: inputString)

Вывод:

Old Delhi : PlaceName

Приведение к начальной форме

Например, «go» может выглядеть как «gone», «will go», «wnet» и т.д. Приложение понимает это и приводит их к начальной форме — «go». В iOS терминологии называется Lemma.

func lemmatizeString() {
    tagger.string = inputString
    
    let range = NSRange(location: 0, length: inputString.utf16.count)
    
    tagger.enumerateTags(in: range, unit: NSLinguisticTaggerUnit.word, scheme: NSLinguisticTagScheme.lemma, options: options) { (tag, tokenRange, _) in
        if let lemma = tag?.rawValue {
            print(lemma)
        }
    }
}

lemmatizeString()

Вывод:

in
a
date
to
the
stand
the
imposing
era
red
fort

Определение языка:

Возвращает язык для определенной строки:

// Language identification
// here we will give input string to the tagger and ask the dominant language in the string.
// Dominant language is the most frequently occurring language in the string so if our string had mix of english, hindi, spanish and french words then it would choose the most common language

func languageIdentification() {
    tagger.string = inputString
    print(tagger.dominantLanguage!)
}

Вывод:

languageIdentification()

en

Области применения NSLinguisticTagger:

1. Поиск голосом — парсить и приводить к начальной форме слова в поиске. Объявлять грамматику для произносимой команды поиска
2. Автоматически создавать или предлагать теги, найденные документе — такие, как определенные существительные, имена организаций
3. Облегчить голосовое взаимодействие в целом

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *