iOS-NSLinguisticTagger苹果自带自然语言处理工具

知 识 点 / 超 人


详细的自然语言处理要点原理会在下一篇文章详细说明。这里只单纯的记录下苹果自带的NSLinguisticTagger自然语言处理工具。
Apple的NLP优势:

  • 全 Apple 平台都支持(mac、pad、phone、watch、tv)且保持一致性
  • 安全性
  • 离线机器学习,所有的分析计算都是通过手机系统内部计算。不需要服务端去处理。
  • 用户数据保存在本地
  • 性能
  • 多线程高度优化
  • 速度显著提升
  • 多语种的支持,目前对英文的支持最优
  • 准确性保持业界领先水平

使用案例:

    //需要进行处理的 自然语句
    //NSString * string = @"What is the weather in San Francisco?";
    NSString *string = @"我爸就是山东东阿阿胶胶厂厂长长孙孙山了";
    //NSString *string = @"我在四川成都?";
    //NSString *string = @"社会のセグメントは、その職務を遂行します";
    //步骤1.NSLinguisticTaggerOptions 设置自然语言筛选条件
    NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerJoinNames |NSLinguisticTaggerOmitPunctuation;
    
    //步骤2.通过设置 标签处理方案和语言 获取对应的方案枚举数组
    //只设置 自然语言的类型
    //NSArray *arr = [NSLinguisticTagger availableTagSchemesForLanguage:@"zh-Hans"];
    //设置 语言的处理方式和语言类型
    NSArray *arr = [NSLinguisticTagger availableTagSchemesForUnit:NSLinguisticTaggerUnitWord|NSLinguisticTaggerUnitDocument language:@"zh-Hans"];
    
    //步骤3.创建自然语言处理标签器 设置语言处理方案 和 筛选条件
    NSLinguisticTagger * tagger = [[NSLinguisticTagger alloc]initWithTagSchemes:arr options:options];
    //步骤4.给处理器器设置处理的字符串
    tagger.string = string;
    //步骤5.根据设置的字符串,获取字符串的语言类型,BCP-47
    NSString *language = tagger.dominantLanguage;
    NSLog(@"语言类型:%@",tagger.dominantLanguage);
    //步骤6.执行筛选的处理
    [tagger enumerateTagsInRange:NSMakeRange(0, string.length) scheme:NSLinguisticTagSchemeScript  options:options usingBlock:^(NSString * _Nonnull tag, NSRange tokenRange, NSRange sentenceRange, BOOL * _Nonnull stop) {
        
        //步骤7.根据返回数据  判断 获取 想要的结果
        
        NSString *token = [string substringWithRange:tokenRange];
        NSLog(@"==>%@:%@",token,tag);
    }];

步骤1说明: NSLinguisticTaggerOptions是一个自然语言标签筛选条件的枚举类型。主要是设置对内容文本的过滤组合方案

/*通过对NSLinguisticTaggerOptions 的设置选择,来指定内容的过滤组合方式 */
typedef NS_OPTIONS(NSUInteger, NSLinguisticTaggerOptions) {   /* Any combination of options from the enumeration. */
    NSLinguisticTaggerOmitWords, /* 忽略过滤掉所有单词 */
    NSLinguisticTaggerOmitPunctuation,/* 忽略过滤掉所有标点符号 */
    NSLinguisticTaggerOmitWhitespace,/* 忽略过滤掉所有空白 */
    NSLinguisticTaggerOmitOther,/* 忽略过滤掉所有其他,这里的其他指的是非选择的语言或特殊字符 */
    NSLinguisticTaggerJoinNames,/* 连接名称,把人名,地名,组织名等组合在一起 */
};

步骤2说明:设置处理方案和语言 通过NSLinguisticTagger类方法自动根据设置的内容匹配可以处理的方案。处理器将会按照设置的NSLinguisticTaggerUnit方案,分成单词、句子或段落级别来进行分析操作。主要是设置分析的具体方案。

/*
NSLinguisticTaggerUnit是用作标记字符串中单位的大小。
标记单位可以是单词、句子、段落或整个字符串。
不同的单位按照不同的方法级别执行。
并非所有方法和单位的组合都受支持;
可以使用+availableTagschemesforUnit:language:方法来设置。
*/
typedef NS_ENUM(NSInteger, NSLinguisticTaggerUnit) {
    NSLinguisticTaggerUnitWord,/* Token按照单词或类似单词的语言项为单位*/
    NSLinguisticTaggerUnitSentence,/* Token按照句子为单位*/
    NSLinguisticTaggerUnitParagraph,/* Token 按照段落为单位 */
    NSLinguisticTaggerUnitDocument,/* Token 按照整个字符串为单位*/
};

语言主要是遵循BCP-47

语言字符串 语言名称
zh-Hant 中文繁体
zh-Hans 中文简体
en 英文
ja 日文
//指定处理单元和语言
+ (NSArray<NSLinguisticTagScheme> *)availableTagSchemesForUnit:(NSLinguisticTaggerUnit)unit language:(NSString *)language


//只设置语言,使用默认的处理单元处理
+ (NSArray<NSLinguisticTagScheme> *)availableTagSchemesForLanguage:(NSString *)language

步骤3说明: NSLinguisticTagger是自然语言标记处理器,步骤1,2已经选定了处理器的规则。所以我们只需要创建一个处理器并把步骤1,2中的条件设置进去即可

步骤4说明:语言处理器已经创建并设置了条件。现在设置需要处理的内容文本。

步骤5说明:当步骤4设置了需要处理的内容文本后,NSLinguisticTagger处理器会自动根据文本来判断内容文本对应的语言,因为在步骤2中所设置的language不一定就是文本的真实类型。但是这个返回语言类型不一定准确,因为有时候中文简体,繁体,日文会出现混淆的情况

步骤6说明:根据选择的处理方案和响应的参数来执行 语言处理器。从处理器的block中得到处理结果。

/*
不指定处理单元的方式 自动处理内容文本
参数1 range:指定处理传入的内容文本在字符串中的范围
参数2 tagScheme:指定处理的分类方案
参数3 opts:指定筛选条件
参数4 block:处理后的结果返回的block
*/
- (void)enumerateTagsInRange:(NSRange)range scheme:(NSLinguisticTagScheme)tagScheme options:(NSLinguisticTaggerOptions)opts usingBlock:(void (NS_NOESCAPE ^)(NSLinguisticTag _Nullable tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop))block;

/*
指定处理单元的方式 根据指定的单元进行内容文本的处理
参数1 range:指定处理传入的内容文本在字符串中的范围
参数2 unit:指定处理的单元
参数3 scheme:指定处理的分类方案
参数4 options:指定筛选条件
参数5 block:处理后的结果返回的block
*/
- (void)enumerateTagsInRange:(NSRange)range unit:(NSLinguisticTaggerUnit)unit scheme:(NSLinguisticTagScheme)scheme options:(NSLinguisticTaggerOptions)options usingBlock:(void (NS_NOESCAPE ^)(NSLinguisticTag _Nullable tag, NSRange tokenRange, BOOL *stop))block;

/*
 类方法,通过类方法直接处理想要的结果而不通过对象获取
参数1 string:需要处理的内容文本
参数2 range:指定处理传入的内容文本在字符串中的范围
参数3 unit:指定处理的单元
参数4 scheme:指定处理的分类方案
参数4 options:指定筛选条件
参数5 block:处理后的结果返回的block
*/
+ (void)enumerateTagsForString:(NSString *)string range:(NSRange)range unit:(NSLinguisticTaggerUnit)unit scheme:(NSLinguisticTagScheme)scheme options:(NSLinguisticTaggerOptions)options orthography:(nullable NSOrthography *)orthography usingBlock:(void (NS_NOESCAPE ^)(NSLinguisticTag _Nullable tag, NSRange tokenRange, BOOL *stop))block;

/*
方法中block回调的参数说明:
NSLinguisticTag _Nullable tag:
 NSRange tokenRange:token处理的单元 所在的范围
NSRange sentenceRange:句子处理的所在范围
 BOOL *stop:是否停止遍历
*/

NSLinguisticTagSchemeTokenType , /*此标记方案根据 token 的广泛通用类型对其进行分类:单词、标点符号、空格等。*/
NSLinguisticTagSchemeLexicalClass,/*此标记方案根据类对token进行分类:单词的话语部分、标点类型或空格等。*/
NSLinguisticTagSchemeNameType, /*此标记方案对token进行分类,以确定它们是否是各种类型的命名实体的一部分。*/
NSLinguisticTagSchemeNameTypeOrLexicalClass, /*此标记方案遵循NSLinguisticTagSchemeNameType和NSLinguisticTagSchemeLexicalClass所表示的token。*/
NSLinguisticTagSchemeLemma,/*此标记方案为每个单词标记(如果已知)提供一个词组形式。*/
 /*NSLinguisticTagSchemeLanguage此标记方案根据最可能的语言(如果已知)标记token。
标记出的值会以标准语言所写形式给出,
例如"en"、"fr"、"de"等,和用 NSOrthography 类的效果相同。
注意此类分词根据的是词语在整个句子或段落中的表意,
而不是只根据该词本身来判断*/
NSLinguisticTagSchemeLanguage,
/*NSLinguisticTagSchemeScript此标记方案根据其Script脚本标记token。
标记不同语言,但会以如下的缩略形式给出:"Latn"、"Cyrl"、"Jpan"、"Hans"、"Hant"等*/
NSLinguisticTagSchemeScript ,

typedef NSString *NS_EXTENSIBLE_STRING_ENUM;

/* NSLinguisticTagSchemeTokenType的类型 */
 NSLinguisticTagWord ,/* Tokens 按照单词或类似单词的语言为标准处理 */
 NSLinguisticTagPunctuation, /* Tokens 按照符号为处理. */
 NSLinguisticTagWhitespace , /* Tokens 按照空白处理. */
 NSLinguisticTagOther, /* token按照非选择的语言或特殊字符处理. */

/* Tags for NSLinguisticTagSchemeLexicalClass */
 NSLinguisticTagNoun,
 NSLinguisticTagVerb,
 NSLinguisticTagAdjective,
 NSLinguisticTagAdverb,
 NSLinguisticTagPronoun,
 NSLinguisticTagDeterminer,
 NSLinguisticTagParticle,
 NSLinguisticTagPreposition,
 NSLinguisticTagNumber,
 NSLinguisticTagConjunction,
 NSLinguisticTagInterjection,
 NSLinguisticTagClassifier,
 NSLinguisticTagIdiom,
 NSLinguisticTagOtherWord,
 NSLinguisticTagSentenceTerminator,
 NSLinguisticTagOpenQuote,
 NSLinguisticTagCloseQuote,
 NSLinguisticTagOpenParenthesis,
 NSLinguisticTagCloseParenthesis,
 NSLinguisticTagWordJoiner,
 NSLinguisticTagDash,
 NSLinguisticTagOtherPunctuation,
 NSLinguisticTagParagraphBreak,
 NSLinguisticTagOtherWhitespace,

/* Tags for NSLinguisticTagSchemeNameType */
 NSLinguisticTagPersonalName,
 NSLinguisticTagPlaceName,
 NSLinguisticTagOrganizationName,
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354