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

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 本篇文章将介绍如何使用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

目录
相关文章
|
8月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
797 4
|
8月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
9月前
|
自然语言处理 算法 Python
自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
【10月更文挑战第9天】自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
190 4
|
8月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
338 21
|
7月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
147 8
|
9月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
199 2
|
10月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
429 3
|
9月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
缓存 Unix iOS开发
iOS Crash 分析攻略
应用崩溃是影响 APP 体验的重要一环, 而崩溃定位也常常让开发者头疼。本文就讲讲关于 Crash 分析的那些事。
3830 0
iOS Crash 分析攻略
|
缓存 Unix 编译器
iOS Crash 分析攻略
应用崩溃是影响 APP 体验的重要一环, 而崩溃定位也常常让开发者头疼。本文就讲讲关于 Crash 分析的那些事。
iOS Crash 分析攻略

热门文章

最新文章