一、前言
前面一篇博文简单的通过官方文档来了解了下机器学习是什么,以及简单的文字筛选Demo,但是我在实际执行过程中遇到的些问题,在这里抛出来。
二、训练源
我准备做出一个可以识别影评是好评、差评还是中评的机器学习模型。
这是我准备的数据:
[ { "text":"这部电影真好看", "label":"好评" }, { "text":"太烂了", "label":"差评" }, { "text":"一般般,不算差也不算好", "label":"中评" },
然后当我在playground里面执行这句代码的时候:
//训练源地址 let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/sunjiaqi/Desktop/data.json")) //导入训练源数据 let sentimentClassifier = try MLTextClassifier(trainingData: data, textColumn:"text", labelColumn: "label")
报错了,
经过一番查找资料后得知,Creater ML 是不支持中文输入的,这就很坑。
那怎么办呢,有办法,将中文转成UTF-16编码,这个编码后的汉字就变成一个又一个数字了,也就可以进行训练了
文字转UTF16编码和导出JSON文件的代码奉上
NSMutableArray *textList = [[NSMutableArray alloc] init]; // 获取文件路径 NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"]; // 将文件数据化 NSData *data = [[NSData alloc] initWithContentsOfFile:path]; NSArray *dataPathList = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; [dataPathList enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) { NSString *moviceContent = obj[@"text"];//影评内容 NSString *moviceType = obj[@"label"];//影评类型 moviceContent = [moviceContent stringByReplacingPercentEscapesUsingEncoding:NSUTF16StringEncoding]; NSDictionary *dict = @{@"text":moviceContent,@"label":moviceType}; [textList addObject:dict]; }]; //将数组转成JSON写入文件 NSData *whirtData =[NSJSONSerialization dataWithJSONObject:textList options:NSJSONWritingPrettyPrinted error:0]; [whirtData writeToFile:@"/Users/zhaowenjuan/Desktop/apps2.json" atomically:YES];
注:很多人会问,为啥这里的代码又用OC来写了,我只想说我用OC习惯点,这段代码很简单,会swift的也可以轻易的转出来。
数据终于准备好了,开始训练吧。
三、使用
模型的训练与导出没有什么可说的了,就那固定的几行代码
关键是该怎么使用。
1、将模型直接拖入项目中,打开模型的话会看见一个文件的快捷入口,这个头文件就是自动生成的,里面有调用模型的方法。
2、构建一个模型的方法
- (nullable MCContentFilter *)model { auto bundle = [NSBundle bundleForClass:MCContentFilter.class]; auto mlmodelcURL = [bundle URLForResource:@"MCContentFilter" withExtension:@"mlmodelc"]; if (mlmodelcURL) { return [MCContentFilter new]; } auto modelPath = [bundle pathForResource:@"MCContentFilter" ofType:@"mlmodel"]; if (!modelPath) return nil; auto modelURL = [NSURL fileURLWithPath:modelPath]; mlmodelcURL = [MLModel compileModelAtURL:modelURL error:nil]; if (!mlmodelcURL) return nil; auto model = [[MCContentFilter alloc] initWithContentsOfURL:mlmodelcURL error:nil]; return model; }
用法
auto model = [self model];
注:auto 自动类型推导
3、调用模型方法
model predictionFrom
类似于这样的方法。
模型的作用只是做出判断,它不关心你是中文还是英文,它都看不懂,它只能根据你给的数据规则来判断和匹配,随意生成训练源数据这步非常重要!
demo过段时间再整理吧,今天太晚了,晚安。