我正在研究文本分类程序。我的训练数据是700多个文本类别,每个类别包含1-350个文本短语。总共超过16k个短语。需要分类的数据是文本短语。我想对数据进行分类,因此它给了我5个最相似的类别。训练数据有很多常用词。
我的第一次尝试是在github上使用此库来使用朴素贝叶斯定理,因为该库易于使用,并允许我将训练数据作为字符串加载。但是其他用户报告了问题,当我尝试对数据进行分类时,我的输入被分类为错误或未被分类。
https://github.com/ptnplanet/Java-Naive-Bayes-Classifier
所以我认为这是问题所在,所以我要尝试使用不同的库并考虑k表示聚类,因为我的数据差异很大。
因此,当我查看其他库时,它们都需要输入和训练数据作为矢量矩阵。我查看了word2vec和td-idf来转换文本向量。我了解tf-idf,与其他文件相比,我可以理解这个词的重要性。但是,如何使用它将输入数据分类?每个类别都是文件吗?还是所有类别都是一个文档?
edit:数据样本
SEE_BILL-查看帐单
SEE_BILL帐单余额
SEE_BILL-我的帐单在哪里
SEE_BILL不能找到帐单
PAY_BILL支付账单
PAY_BILL付款
PAY_BILL降低余额
PAY_BILL删除余额
PAST_BILL-最近的帐单
PAST_BILL以前的帐单
PAST_BILL历史帐单
去年的PAST_BILL账单
答案 0 :(得分:1)
首先,问题的结尾没有任何意义,因为您没有说要对文本短语进行分类的类。现在,我可以帮助您对文本短语进行矢量化。
Tf-idf相当不错,但是您必须进行良好的预处理。另外,您必须自己创建向量。它的问题在于,您将给定数据集中所有不同单词的长度向量,甚至是相同单词在数据集中出现的形式也不同。因此,如果您的数据集中包含单词go
,则该单词很可能会有多种形式,包括going
,Go
,gone
,went
等等。这就是为什么必须对所有go
单词的所有形式都加进其根形式之前进行很好的预处理的原因。另外,由于单词go
和Go
不相同,因此必须小写整个数据集。但是,即使您做了所有这些工作并建立了完善的预处理管道,您也将获得长度为20k +的向量。然后,您将必须手动选择要保留在向量中的特征(单词),然后删除其他特征。这就是说,如果您想使用大小为300的向量,则必须从向量中删除19 700个单词。当然,您将获得300个最佳特色。如果您想更深入地研究它,并查看其工作原理,可以查看here
另一方面,word2vec将任何单词映射到300维向量。当然,您必须进行一些类似于tf-idf的预处理,但是这种方法的敏感性要低得多。您可以找到word2vec的工作原理here
总而言之,我建议您使用word2vec,因为它起步容易得多。 Google提供了一种经过培训的模型,您可以下载here
答案 1 :(得分:0)
两种最受欢迎的方法是:
word2vec
,它将每个单词放在X维向量空间(例如300维)中,因此每个短语/句子将是X维向量的序列< / li>
一种更极端的方法是使用universal-sentence-encoder之类的模型嵌入整个句子。简而言之:它类似于word2vec
,但不是单词而是将整个句子转换为(512维)向量空间。比找到“相似”的句子要容易得多。