iOS-NSLinguisticTagger苹果自带自然语言处理
2019-03-22 本文已影响213人
树下敲代码的超人
知 识 点 / 超 人
详细的自然语言处理要点
、原理
会在下一篇文章详细说明。这里只单纯的记录下苹果自带的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,