iOS MachineLearning 系列(11)—— 自然语言之词句相似性分析

简介: 本篇文章将介绍如何使用NaturalLanguage框架来对词句的相似性进行分析。文本相似性的分析在实际开发中应用很多,比如我们可以通过查找与用户输入相似的词来进行内容推荐。

iOS MachineLearning 系列(11)—— 自然语言之词句相似性分析

本篇文章将介绍如何使用NaturalLanguage框架来对词句的相似性进行分析。文本相似性的分析在实际开发中应用很多,比如我们可以通过查找与用户输入相似的词来进行内容推荐。

分析语句的相似性需要进行大量的训练,NaturalLanguage已经内置了许多语言的训练模型,使用非常方便。

1 - 文本相似性分析的示例

需要创建NLEmbedding实例来进行词句的相似性分析。例如:

let embedding = NLEmbedding.wordEmbedding(for: .english)!
let embedding2 = NLEmbedding.sentenceEmbedding(for: .english)!

其中,使用wordEmbedding创建出的实例用来进行单词分析,sentenceEmbedding创建出的实例用来进行句子分析。其参数设置所分析的语言,需要注意,并非所有语言都支持进行相似性分析。

下面示例代码演示了如何对单词,句子的相似性进行分析,并能够自动根据传入的单词来进行相近的词的推荐:

let label = UILabel(frame: CGRect(x: 0, y: 100, width: view.frame.width, height: 500))
label.numberOfLines = 0
label.text = ""
view.addSubview(label)
let word = "dog"
let word2 = "cat"
let word3 = "teacher"

// 计算单词间的矢量距离
let distance = embedding.distance(between: word, and: word2)
let distance2 = embedding.distance(between: word, and: word3)
label.text = label.text!.appending("单词1:\(word)\n单词2:\(word2)\n单词3:\(word3)")
label.text = label.text!.appending("\n\n单词1与单词2间的距离:\(distance)\n单词1与单词3间的距离:\(distance2)")

// 获取相似的词
embedding.enumerateNeighbors(for: word3, maximumCount: 5, using: { item, distance in
    label.text = label.text!.appending("\n与单词3相近的词:\(item) - \(distance)")
    return true
})

let sen = "Hello, Xiao."
let sen2 = "Hi, Xiao."
let sen3 = "My name is Xiao."
// 计算句子间的矢量距离
let distance3 =  embedding2.distance(between: sen, and: sen2)
let distance4 =  embedding2.distance(between: sen, and: sen3)
label.text = label.text!.appending("\n\n\n句子1:\(sen)\n句子2:\(sen2)\n句子3:\(sen3)")
label.text = label.text!.appending("\n\n句子1与句子2间的距离:\(distance3)\n句子1与句子3间的距离:\(distance4)")

计算出的矢量距离越大,标明词句间的差异越大,即相似性越差。效果如下图所示:

通常矢量距离小于1的词句相似性较高。取值范围为0-2之间。

2 - 关于NLEmbedding类

要进行词句的相似性分析,需要NLEmbedding类来完成:

open class NLEmbedding : NSObject {
    // 创建分析单词的实例
    open class func wordEmbedding(for language: NLLanguage) -> NLEmbedding?
    open class func wordEmbedding(for language: NLLanguage, revision: Int) -> NLEmbedding?

    // 创建分析句子的实例
    open class func sentenceEmbedding(for language: NLLanguage) -> NLEmbedding?
    open class func sentenceEmbedding(for language: NLLanguage, revision: Int) -> NLEmbedding?

    // 判断词汇表是否包含参数字符串
    open func contains(_ string: String) -> Bool
    // 向量空间维数
    open var dimension: Int { get }
    // 词汇表单词数量
    open var vocabularySize: Int { get }
    // 所使用的语言
    open var language: NLLanguage? { get }
    // 所使用的算法版本
    open var revision: Int { get }
    
    // 获取所支持的算法版本
    open class func supportedRevisions(for language: NLLanguage) -> IndexSet
    open class func supportedSentenceEmbeddingRevisions(for language: NLLanguage) -> IndexSet
    // 当前默认的算法版本
    open class func currentRevision(for language: NLLanguage) -> Int
    open class func currentSentenceEmbeddingRevision(for language: NLLanguage) -> Int
    
    // 计算两个字符串之间的向量距离
    public func distance(between firstString: String, and secondString: String, distanceType: NLDistanceType = .cosine) -> NLDistance
    // 计算参数字符串的空间向量数据
    public func vector(for string: String) -> [Double]?
    // 获取相似的词句,maxCount控制最大返回个数
    public func enumerateNeighbors(for string: String, maximumCount maxCount: Int, distanceType: NLDistanceType = .cosine, using block: (String, NLDistance) -> Bool)
    public func neighbors(for string: String, maximumCount maxCount: Int, distanceType: NLDistanceType = .cosine) -> [(String, NLDistance)]
    // 通过空间向量数据来获取相似的词句
    public func enumerateNeighbors(for vector: [Double], maximumCount maxCount: Int, distanceType: NLDistanceType = .cosine, using block: (String, NLDistance) -> Bool)
    public func neighbors(for vector: [Double], maximumCount maxCount: Int, distanceType: NLDistanceType = .cosine) -> [(String, NLDistance)]
}

其中NLDistance是Double类型的一个别名。直接使用这些API实际上并不能很好的支持中文,NaturalLanguage也支持我们使用自定义的模型,关于模型的使用和训练,我们后面文章会再介绍。

完整的示例代码可以在如下地址找到:

https://github.com/ZYHshao/MachineLearnDemo

目录
相关文章
|
29天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
20 1
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
35 4
|
7月前
|
C语言 索引
09-iOS之load和initialize底层调用原理分析
09-iOS之load和initialize底层调用原理分析
58 0
|
2月前
|
安全 搜索推荐 Android开发
Android 与 iOS 的比较分析
【2月更文挑战第5天】 Android 和 iOS 是目前市场上两种最流行的移动操作系统,它们都拥有自己的特点和优势。本文将会分别从操作系统设计、应用生态、安全性等方面对这两种操作系统进行比较和分析,希望能够帮助读者更好地选择适合自己的移动设备。
|
7月前
|
机器学习/深度学习 自然语言处理 算法
深度解析自然语言处理之篇章分析
深度解析自然语言处理之篇章分析
57 0
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型
本篇文章将是本系列文章的最后一篇。本专题将iOS中有关Machine Learning的相关内容做了整体梳理。下面是专题中的其他文章地址,希望如果你有需要,本专题可以帮助到你。
223 0
|
9月前
|
数据可视化 数据挖掘 iOS开发
iOS MachineLearning 系列(21)——CoreML模型的更多训练模板
前面文章中,有介绍如何训练生成定制化需求的 CoreML 模型,以图像分类为例做了演示.
118 0
|
9月前
|
存储 编解码 缓存
HTTP Live Streaming直播(iOS直播)技术分析与实现
HTTP Live Streaming直播(iOS直播)技术分析与实现
135 1
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
85 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2