我应该使用什么方法来对具有数千个类别的文本进行分类?

2024-04-26 04:13:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个产品描述数据集,我需要与一个很长的列表(2265个可能的类别)中的单个类别相匹配。我很难弄清楚应该使用哪种方法。我曾尝试使用Levenshtein距离/比率来使用模糊匹配,当描述与正确的类别名称非常相似时,这种方法会起作用,但并不总是如此。例如,我的第一个条目是“砾石和碎石”,它应该被归类为“所有其他非金属矿产开采”,但匹配逻辑并没有抓住它。我曾尝试通过柠檬化、删除停止词、按字母顺序对每个条目中的词进行排序,以及删除重复的词来达到公平竞争的目的,但这并没有产生明显的效果

我认为这可能需要某种有监督或无监督的学习方法,但我不确定从哪里开始。现在我只能访问一个包含18行的虚拟数据集,但我希望在接下来的几天内能够访问大量数据,这将使我可以选择进行训练/测试拆分并正确训练模型。一旦发生这种情况,我应该使用什么方法


Tags: 数据方法名称距离列表条目逻辑类别
1条回答
网友
1楼 · 发布于 2024-04-26 04:13:03

我解决这个问题的方法是使用glove2word2vec,首先在100维向量上使用(如果这不起作用,那么使用300d向量)

对于每个单词,你都会得到唯一的分数。它还有一个API,您可以在其中找到最相似的词,如:

most similar words around "screw"

word embeddings

因此,找到目标类别中的所有名词。得到他们的分数。不要添加它们,将它们分开。 假设“砾石”=0.5,“石头”=0.51,“采矿”=0.49,那么我们看到它最接近“砾石”。[我目前没有安装库]

为了减少时间,您可以单独保存分数,不要在100d/300d语料库中反复查找,这很耗时

编辑: 您可以针对每个类别尝试以下操作:

from textblob import TextBlob
from itertools import product

description = [w[0].lower() for w in TextBlob("Gravel and crushed stone").tags if w[1].startswith('NN')]
category_1 = [w[0].lower() for w in TextBlob("All Other Nonmetallic Mineral Mining").tags if w[1].startswith('NN')]
max([model.similarity(w[0], w[1]) for w in product(category_1, description)])

enter image description here

在所有类别(1到2265)中检查每个描述。无论哪个类别给你的分数最高,都应该是最接近该描述的类别。您可以使用DataFrame.apply()对其进行矢量化,并且可以更快地完成。如果您很幸运,并且所有描述都正确分类,那么您只需要对前10K数据点执行此操作。既然现在您有了正确的标签,您可以转而使用ML,那么就不需要这种基于规则的方法了

相关问题 更多 >