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

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
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

目录
相关文章
|
25天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
2月前
|
自然语言处理 算法 Python
自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
【10月更文挑战第9天】自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
50 4
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
51 2
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
52 2
|
3月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
143 3
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
3月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
3月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
51 1
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用与挑战
【10月更文挑战第3天】本文将探讨AI技术在自然语言处理(NLP)领域的应用及其面临的挑战。我们将分析NLP的基本原理,介绍AI技术如何推动NLP的发展,并讨论当前的挑战和未来的趋势。通过本文,读者将了解AI技术在NLP中的重要性,以及如何利用这些技术解决实际问题。
|
3月前
|
机器学习/深度学习 数据采集 自然语言处理
深度学习在自然语言处理中的应用与挑战
本文探讨了深度学习技术在自然语言处理(NLP)领域的应用,包括机器翻译、情感分析和文本生成等方面。同时,讨论了数据质量、模型复杂性和伦理问题等挑战,并提出了未来的研究方向和解决方案。通过综合分析,本文旨在为NLP领域的研究人员和从业者提供有价值的参考。