美文网首页
iOS 分词处理

iOS 分词处理

作者: topws1 | 来源:发表于2022-06-06 14:22 被阅读0次

在搜索等场景,需要对完成的字符串进行分词处理,iOS 自带两种分词方式 NaturalLanguageCFStringTokenizer

苹果这边 对于分词可以选择对于的模式,常用的是以词为单位,比如 工作质量会拆分成 工作和质量。当然 对于多语言来说,苹果这边支持的也较好,iOS 的Emoji也能识别出来。(特殊字符比如 , / ` 这些符合系统不会识别)

代码如下:

import Foundation
import NaturalLanguage
import CoreText

extension String {
    public func NLTokenizer() -> [String] {
        let tokenizer = NLTokenizer(unit: .word)
        tokenizer.string = self
        var keyWords: [String] = []

        tokenizer.enumerateTokens(in: startIndex..<endIndex) { tokenRange, _ in
            keyWords.append(String(self[tokenRange]))
            return true
        }
        return keyWords
    }
}

需要注意的是以上代码的运行结果并不包括系统未识别的的部分。

这里用CFStringTokenizer 单独给出包含原字符串所有的分词结果。

例如:今天天气不错,我们一起出去玩啊?

上面代码给出的结果是 今天 天气 不错 我们 一起 出去 玩 啊

下面代码给出的结果是 今天 天气 不错 , 我们 一起 出去 玩 啊 ?


extension String {
    public func cStringTokenizer() -> [String] {
        let cString = self as CFString
        let nsString = self as NSString
        let cStringCount = nsString.length
        let ref = CFStringTokenizerCreate(
            nil,
            cString,
            CFRangeMake(0, cStringCount),
            kCFStringTokenizerUnitWord,
            CFLocaleCopyCurrent()
        )
        CFStringTokenizerAdvanceToNextToken(ref)
        var range: CFRange = CFStringTokenizerGetCurrentTokenRange(ref)
        var keywords: [String] = []
        var preTokenEndIndex: Int = -1
        while range.length > 0 {
            let defaultIndex = preTokenEndIndex + 1
            if defaultIndex < range.location {
                let ignoredRange = NSRange(
                    location: defaultIndex,
                    length: range.location - defaultIndex
                )
                let ignoredString = nsString
                    .substring(with: ignoredRange)
                keywords.append(ignoredString)
            }
            preTokenEndIndex = range.location + range.length - 1

            let keyWord = nsString
                .substring(with: NSRange(location: range.location, length: range.length))
            keywords.append(keyWord)

            CFStringTokenizerAdvanceToNextToken(ref)
            range = CFStringTokenizerGetCurrentTokenRange(ref)
        }

        if preTokenEndIndex + 1 < count {
            let ignoredLocation = preTokenEndIndex + 1
            let ignoredRange = NSRange(location: ignoredLocation, length: count - ignoredLocation)
            let ignoredString = nsString
                .substring(with: ignoredRange)
            keywords.append(ignoredString)
        }

        return keywords
    }
}

相关文章

  • iOS 分词处理

    在搜索等场景,需要对完成的字符串进行分词处理,iOS 自带两种分词方式 NaturalLanguage 及 CFS...

  • 分词处理

    1.文本挖掘的分词原理 在做文本挖掘的时候,首先要做的预处理就是分词。英文单词天然有空格隔开容易按照空格分词,但是...

  • 中文分词工具及中文语料资源

    关键词: 中文分词;分词;自然语言处理;中文语料 最近要做中文自然语言处理相关任务,牵涉到使用中文分词工具和相关算...

  • Elasticsearch的分词

    ES在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。处理中文...

  • ES分词器 - 内置分词器

    2、分词器:分词器是ES中专门处理分词的组件,英文为Analyzer,它的组成如下: Character Filt...

  • 豆瓣评分预测

    中文分词 中文分词包jieba,用jieba对原始文本做分词。 文本预处理 1. 去掉无用的字符 2. 去掉停用词...

  • ElasticSearch 分词器

    Analysis:分词,将全文经过处理,转换为(term / token)的过程 Analyzer:分词器,Ana...

  • iOS 分词

  • iOS FMDB FTS unknown tokenizer:

    iOS FMDB集成了FTS功能,并且支持icu。icu是sqlite3里支持中文分词的分词器。 unknown ...

  • 如何在ubuntu使用hanlp

    前言 以前,我对大部分的处理中文分词都是使用python的结巴分词工具,该分词工具是在线调用API, 关于这个的分...

网友评论

      本文标题:iOS 分词处理

      本文链接:https://www.haomeiwen.com/subject/oejjmrtx.html