Использование встроенной Apple NaturalLanguage Framework для анализа настроений в разработке приложений для iOS

У Apple есть собственная встроенная структура, которую мы можем использовать в нашем проекте XCode под названием NaturalLanguage. Этот фреймворк также поддерживает анализ настроений, поэтому, как только мы его внедрили, он волшебным образом запустится и предоставит результат в нашем приложении на основе вашего кода.

Подождите, что такое анализ настроений?

Согласно Википедии, анализ настроений (также известный как анализ мнений или эмоциональный ИИ) — это использование обработки естественного языка, анализа текста. », вычислительная лингвистика и биометрия для систематического выявления, извлечения, количественной оценки и изучения аффективных состояний и субъективной информации.

Проще говоря, мы используем ИИ для обнаружения человеческих эмоций, чтобы определить, являются ли они положительными, нейтральными или отрицательными. Анализ настроений широко применяется для озвучивания тем клиентов, таких как обзоры, ответы на опросы и социальные сети.

Сложно ли реализовать анализ настроений в приложении iOS с помощью NaturalLanguage?

Внедрение Apple NaturalLanguage для анализа тональности может быть проще, чем вы думали, если вы уже понимаете суть его структуры и читаете документацию при ее реализации.

Тем не менее, есть несколько ограничений, о которых следует помнить, если вы хотите использовать эту платформу:

  1. Ограниченная языковая поддержка для анализа настроений. Я думаю, что он может поддерживать меньше языков, чем сам NaturalLanguage (вы должны проверить это самостоятельно, чтобы узнать, можно ли использовать ваш язык)
  2. Он далек от совершенства, он, вероятно, не может распознавать сложные варианты предложений, такие как «Я не люблю лапшу». или «Не любить кого-то — это не мое». поскольку такого рода предложения нуждаются в отрицательной обработке.

Если вы хотите разработать более совершенную модель, чем предложенная Apple, рассмотрите возможность создания собственной модели текстового классификатора с помощью фреймворка CreateML, а затем добавьте ее в свой собственный проект с помощью CoreML.

Выполнение

Наконец мы добрались до этой части. Для реализации буду использовать SwiftUI, чтобы сэкономить время и волшебным образом поставить верстку.

Во-первых, давайте откроем наш XCode и создадим новый проект, используя интерфейс SwiftUI, и назовем его «NaturalLanguageProject» или любое другое имя, которое вы хотите. Вот мы и запустили наш проект!

Теперь давайте сначала создадим наше представление, чтобы позже мы могли протестировать наше приложение. Мы добавим текстовое поле для ввода нашего предложения, кнопку для проверки классификации предложений и текст для отображения результата!

//
//  ContentView.swift
//  NaturalLanguageProject
//
//  Created by Kevin Jonathan on 25/11/22.
//

import SwiftUI

struct ContentView: View {
    @State var sentence: String = ""
    @State var emotion: String = ""
    
    var body: some View {
        VStack(spacing: 8) {
            TextField("Type sentence..", text: $sentence)
                .padding()
                .overlay(
                    RoundedRectangle(cornerRadius: 8)
                        .strokeBorder(.blue)
                )
                .padding()
            
            Button(
                action: {
                    emotion = "😀"
                }, label: {
                    Text("Detect")
                })
            
            Text(emotion)
        }
        .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Подождите, а где NaturalLanguage?

Мы еще не сделали. Теперь добавим служебный класс для обработки NaturalLanguage. Добавьте новые файлы в свой проект, выберите «Файл Swift» и сохраните его с именем «NaturalLanguageUtility». И добавим код для определения результата анализа настроений.

//
//  NaturalLanguageUtility.swift
//  NaturalLanguageProject
//
//  Created by Kevin Jonathan on 25/11/22.
//

import Foundation
import NaturalLanguage

struct NaturalLanguageUtility {
    static func processSentimentAnalysis(input: String) -> Double {
        let tagger = NLTagger(tagSchemes: [.sentimentScore])
        tagger.string = input
        let sentiment = tagger.tag(at: input.startIndex, unit: .paragraph, scheme: .sentimentScore).0
        let score = Double(sentiment?.rawValue ?? "0") ?? 0
        return score
    }
}

Вау, помедленнее! Что это за коды?

По сути, нам нужно импортировать NaturalLanguage и инициализировать экземпляр NLTagger для классификации текста с использованием анализа настроений. Экземпляр принял наш ввод в виде своей строки и вызвал функцию тега, чтобы определить результат анализа тональности. Функция тега находит тег для заданной лингвистической единицы для одной схемы (для работы которой мы используем сентиментскоре) в указанной позиции символа.

После этого мы можем получить необработанное значение результата тональности и вернуть его как двойное значение. Обычно мы можем классифицировать тексты как положительные (если значение колеблется в пределах 0 ‹ значение ≤ 1), нейтральные или не поддающиеся определению (если значение равно 0) и отрицательные (если значение колеблется в диапазоне -1 ≤ значение ‹ 0).

Последний штрих

Теперь давайте вызовем эту функцию в пользовательском интерфейсе нашего приложения и получим результат для каждого введенного нами предложения.

                ...
                .padding()
            
            Button(
                action: {
                    determineEmotion()
                }, label: {
                    Text("Detect")
                })
            
            Text(emotion)
        }
        .padding()
    }
}

extension ContentView {
    private func determineEmotion() {
        guard !sentence.isEmpty else {
            emotion = ""
            return
        }
        
        let score = NaturalLanguageUtility.processSentimentAnalysis(input: sentence)
        
        switch score {
        case let value where value > 0:
            emotion = "😀"
        case let value where value < 0:
            emotion = "🙁"
        default:
            emotion = "😐"
        }
    }
}

struct ContentView_Previews: PreviewProvider {
..

В разделе пользовательского интерфейса я добавил расширение ContentView и функцию определения эмоций, чтобы получить значение предложения, результат анализа настроений и присвоить значение эмоции. Довольно просто, не так ли?

И вот результат, когда мы запускаем наш код (я запускаю его непосредственно в предварительном просмотре SwiftUI):

Выглядит довольно аккуратно, правда? Вы можете продолжить разработку приложения по своему усмотрению, изменив пользовательский интерфейс или добавив дополнительные функции в класс NaturalLanguageUtility! Вы также можете улучшить или изменить реализацию кода!

Это то, что я знаю о реализации NaturalLanguage для анализа настроений в приложениях для iOS. Спасибо, что прочитали мою статью!

P.S. Пожалуйста, дайте мне знать, если я сказал что-то не так.