概述
大家都知道,要想一款 App 真正的引人入胜、夺人心魄,最重要的是站在用户的立场投其所爱。如何更加贴心的懂得用户的小心思呢?诚然,大家可以动用市面上诸多 AI 大模型来让我们得偿所愿,不过这些对于秃头初学小码农们来说门槛略微有些“高不可攀”。
所幸的是,Apple 早就在本地集成了一些“轻”AI 框架,利用它们大家起码可以小试牛刀来预先验证一下我们的设计构想。好消息是:这些框架使用起来都相当简单,值得我们进一步“潜精研思”。
在本篇博文中,您将学到如下内容:
闲言少叙,让我们马上开始“情感剖析”大冒险吧!
Let’s go!!!😉
3. “不稳定”的情绪感知器
想必大家都知道,不能光听苹果吹得如何天花乱坠,我们需要自己动手验证自然语言引擎的实际效果。
想听听秃头码农们之前是如何上过苹果当,咬过酸苹果的吗?大家可以移步如下链接观赏精彩的故事:
- SwiftUI 界面动画调试一例:做码农最重要的是什么?相信自己!
- 有用的知识又增加了:为何无法编译某些 WWDC 官方视频中的代码?
- 消失的它:摆脱 SwiftUI 中“嵌入视图数量不能超过 10 个”限制的秘密
下面我们先找一个颇为“正能量”的文本来测试一下:
Smile, happiness looks great on you
let text = "Smile, happiness looks great on you"
let tagger = NLTagger(tagSchemes: [.sentimentScore])
tagger.string = text
if let sentiment = tagger.tag(at: text.startIndex, unit: .paragraph, scheme: .sentimentScore).0, let score = Double(sentiment.rawValue) {
print("情绪评分:\(score)")
}
运行结果如下,情绪评分为 0.6 分,还算不错:
我们再来试一个更激动人心的文本,结果得分竟然高达 0.8 分:
I feel extremely happy today because I fixed over 10000 bugs!
下面,我们换一段消极的负能量言语试试:
I feeling really down today
可以看到得分瞬间下降到 -0.6 分:
到目前为止,自然语言框架表现的都还不错。我们甚至都想试试苹果的表情符号(Emoji)了:
❤️😊
可惜,自然语言框架貌似完全不理解 Emoji,根本得不到任何结果,只得作罢。
最后,我们再让它评价一下小说哈利波特中著名的邓布利多校长所说过的话:
“Happiness can be found, even in the darkest of times, if one only remembers to turn on the light.” - Albus Dumbledore
“即使在最黑暗的时刻,只要记得点亮心灯,幸福依然可以被寻觅到。”——阿不思·邓布利多
不幸的是,明明是一段振奋人心、催人泪下的鸡汤正能量言辞,却被计算出了满满负能量的情绪:
综上所述,我们可以认为苹果推出的自然语言框架在目前的水平还比较“弱”,它只能通过文本中特定单词的含义来堆砌整个文本的情绪价值,还远远谈不上“深入”理解。
尽管如此,有总比没有强。
下面,就让我们尝试利用它来别有风趣的实现为任意成语打分的功能吧!
不过在这之前,我们得解决一些小问题。
4. 阿欧,有点小问题
中国语言博大精深,成语更是不可多得的语言宝藏。我们想做的是用 Natural Language 在移动设备上按照成语含义的积极和消极程度为其评分。
更多关于 Swift 语言处理成语文本的有趣内容,请小伙伴们移步如下链接观赏精彩的博文:
不过,之前我们只测试过自然语言框架对英文的支持,那么它对中文的支持又如何呢?
let texts = [
"我今天开心极了,因为打败了灭霸!",
"我今天被天仙姐姐骂了,哭的很伤心",
"我是大熊猫侯佩"
]
let tagger = NLTagger(tagSchemes: [.sentimentScore])
for text in texts {
tagger.string = text
let start = text.startIndex
let end = text.endIndex
tagger.setLanguage(.simplifiedChinese, range: start..<end)
if let sentiment = tagger.tag(at: text.startIndex, unit: .paragraph, scheme: .sentimentScore).0, let score = Double(sentiment.rawValue) {
print("\(text) - 情绪评分:\(score)")
}
}
上面代码运行的结果让我们莫名其妙,甚至有点百思不得其解:
如您所见:无论是积极、消极或是中性文本的评估结果统统“驴唇不对马嘴”。可见自然语言框架对中文支持的非常差,这对我们无疑是一个坏消息。
那么,我们又该何去何从呢?
在下一篇文章中,我们将再接再厉找出一条“迂回小径”来继续前进,敬请期待吧!
想要系统学习 Swift 的小伙伴们,请来我的《Swift 语言开发精讲》专栏逛一逛哦:
总结
在本篇博文中,我们讨论了 Apple 自然语言框架的真实水平,并暂时被一个小问题束手束脚。别急,我们很快会在后面解决它。
感谢观赏,下一篇再会啦!😎