文本分类,如何将文本字符串转换为矢量表示

时间:2019-01-09 05:16:36

标签: java machine-learning classification svm text-classification

我正在研究文本分类程序。我的训练数据是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账单

2 个答案:

答案 0 :(得分:1)

首先,问题的结尾没有任何意义,因为您没有说要对文本短语进行分类的类。现在,我可以帮助您对文本短语进行矢量化。

Tf-idf相当不错,但是您必须进行良好的预处理。另外,您必须自己创建向量。它的问题在于,您将给定数据集中所有不同单词的长度向量,甚至是相同单词在数据集中出现的形式也不同。因此,如果您的数据集中包含单词go,则该单词很可能会有多种形式,包括goingGogonewent等等。这就是为什么必须对所有go单词的所有形式都加进其根形式之前进行很好的预处理的原因。另外,由于单词goGo不相同,因此必须小写整个数据集。但是,即使您做了所有这些工作并建立了完善的预处理管道,您也将获得长度为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维)向量空间。比找到“相似”的句子要容易得多。