今天看到一道数学建模竞赛题,题目给了1284种食物的成分(附件1),和部分已知类别食物word(附件2),里面有三个种类的部分食物,要求根据已知食物分类来预测未知分类的食物寒热属性.
要做分类,需要用机器学习模型来训练已知类别数据,肯定是要先在附件1找到已知分类的食物,并且标注它的类别。
百度了好久,没找到相应的方法和代码。(可能是我搜索的关键词不对-_-)
题目的一小问
附件1部分数据样式附件二数据样式
于是我自己想到了下面的方法,可能有点笨。。。
1、先把word的3个食物分类分别复制在3个txt文件中
2、读取附件1中的数据,转化为DataFrame格式,在末尾添加一列用来存放类别,取食物名称列
import re import pandas as pd df3['catef'] = ''#添加列,分类 mingcheng = df3['名 称'].astype(str)#提取名称所在列
3、分别读取txt文件
f0 = open(r'性平.txt', encoding='utf-8') f1 = open(r'性凉寒.txt', encoding='utf-8') f2 = open(r'性温热.txt', encoding='utf-8')
4、将txt文件的食物读取为字符串,我用的是正则表达式
5、读取的字符串可能有空的,需要去除,不然在名称上搜索会发现所有的食物都符合条件
6、在附件1中找到含有txt文件中食物中的索引,并在源文件标注相应的食物类别,4-6实现如下。
#自定义函数,根据附件2分类标注数据
def TagCategory(datastr,f,tap):#datastr传入附件1所有名称数据,f为读取的txt文件,tap你想标注的内容,数字,字符都可
for line in f:
a = re.split('。|、|;|(|)|\n| ', line)#分割字符串保存到a
a = [x.strip() for x in a if x.strip() != '']#去除空字符串
for ss in a:
index0 = datastr.str.find(ss)#找到则返回所要找字符串在指定字符串位置,没有则返回-1
ind = index0[index0.values != -1].index#不为-1的即表示有
df3['catef'][ind] = tap#标注
7.直接调用函数即可,标注成功
TagCategory(mingcheng,f0,0)#性平标为0 TagCategory(mingcheng,f1,1)#性凉寒标为1 TagCategory(mingcheng,f2,2)#性温热标为2 print(df3.head())#查看前5行



