我有一个数据集,相当于一个包含500万个键值对的字典,键和值都是字符串。
每个键都是唯一的,但只有几百种不同的值。
键不是自然语言的词汇,而是技术参考。值是“家族”,用于分组相似的技术参考。这里的“相似”是指“具有相似的正则表达式”、“包含相似的字符”或某种模式。
键值对的示例:
ADSF33344 : G1112AWDX45603 : G1112D99991111222 : X3334E98881188393 : X3334A30-00005-01 : B0007B45-00234-07A : B0007F50-01120-06 : B0007
最终目标是向算法提供一组新的参考(之前从未见过),算法将为每个参考返回一个建议的家族,理想情况下,还会附带一个基于数据集学习结果的置信度百分比。
建议的家族只能来自数据集中已有的家族,不需要“发明”新的家族名称。
我不熟悉机器学习,所以不知道从哪里开始。我看到了一些通过Sklearn或TextBlob的解决方案,我明白我需要的是一个分类算法,但每个教程都倾向于分析大型文本。
不知何故,我找不到如何处理我的问题,尽管它似乎比分析自然语言的新闻文章要“简单”…
你能为我推荐一些来源或教程吗?
回答:
制作一个训练数据集,并训练一个分类器。大多数分类器基于你自己定义的一组特征的值来工作。(特征的类型取决于分类器;在某些情况下它们是数值量,在其他情况下是真/假,还有一些可以取几个离散值。)你提供特征,分类器决定每个特征的重要性,以及如何解释它们的组合。
作为教程,你可以查看NLTK书的第6章。示例任务,将名字分类为男性和女性,在结构上与你的非常接近:基于短字符串(名字)的形式,将它们分类到类别(性别)中。
你将每个零件号转换成一个特征字典。由于你没有向我们展示真实数据,没有人能给你具体的建议,但你绝对应该像书中那样制作通用特征,此外,你还应该将你知道的每一个线索,无论强弱,都转化为特征。如果供应商ID的长度不同,就制作一个长度特征。如果连字符的存在(或数量或位置)是一个线索,就将其转化为特征。如果某些供应商的零件使用了大量的零,也同样处理。然后为其他任何可能有用的东西制作额外的特征,例如“前三个字母”。一旦你有一个工作系统,就可以尝试不同的特征集和不同的分类器引擎和算法,直到获得可接受的性能。
为了在新数据上获得良好的结果,别忘了将你的训练数据分成训练、测试和评估子集。你可以将所有这些与任何分类器一起使用,但NLTK的Naive Bayes分类器训练速度相当快,所以你可以从那里开始。(注意,特征可以是离散值,例如first_letter
可以是实际的字母;你不需要坚持使用布尔特征。)