文本分类,如何将文本字符串转换为向量表示
Posted
技术标签:
【中文标题】文本分类,如何将文本字符串转换为向量表示【英文标题】:Text Classification, How to convert text strings to vector representation 【发布时间】:2019-06-03 20:14:40 【问题描述】:我正在开发一个文本分类程序。我的训练数据是 700 多个文本类别,每个类别包含 1-350 个文本短语。总共 16k+ 短语。需要分类的数据是文本短语。我想对数据进行分类,因此它给了我 5 个最相似的类别。训练数据有很多常用词。
我的第一次尝试是使用 github 上的这个库来使用朴素贝叶斯定理,因为这个库非常易于使用,并且允许我将训练数据加载为字符串。但是其他用户报告了问题,当我尝试对我的数据进行分类时,我的输入要么分类错误,要么未分类。
https://github.com/ptnplanet/Java-Naive-Bayes-Classifier
所以我认为库是问题所在,所以我会尝试不同的库并研究 k 意味着聚类,因为我的数据方差很大。
所以当我查看其他库时,它们都需要输入和训练数据作为向量矩阵。我查看了 word2vec 和 td-idf 来转换文本向量。我了解 tf-idf,并且与其他文档相比,我可以得到这个词的权重。但是如何使用它将输入数据分类?每个类别都会是一个文档吗?还是所有类别都是一个文档?
编辑:数据样本
SEE_BILL-查看账单
SEE_BILL-账单余额
SEE_BILL-我的账单在哪里
SEE_BILL-找不到账单
PAY_BILL-支付账单
PAY_BILL-付款
PAY_BILL-余额不足
PAY_BILL-删除余额
PAST_BILL-上次帐单
PAST_BILL-上一个帐单
PAST_BILL-历史账单
PAST_BILL-去年的账单
【问题讨论】:
【参考方案1】:首先,您问题的结尾没有任何意义,因为您没有说明要将文本短语分类到哪些类。现在,我可以帮助您对文本短语进行矢量化。
Tf-idf 非常好,但您必须进行良好的预处理才能做到这一点。此外,您必须自己创建向量。问题在于,您将给出数据集中所有不同单词的长度向量,甚至是它们在数据集中出现的不同形式的相同单词。因此,如果您的数据集中有 go
一词,则该词可能会有多种形式,包括 going
、Go
、gone
、went
等。这就是为什么您必须进行良好的预处理,将所有这些形式的单词 go
放到它的根形式中。此外,您必须将整个数据集小写,因为单词 go
和 Go
不一样。但即使你做了所有这些并制作了一个完美的预处理管道,你也会得到长度为 20k+ 的向量。然后,您必须手动选择要保留在向量中的特征(单词)并删除其他特征。这意味着,如果您想拥有大小为 300 的向量,则必须从向量中删除 19 700 个单词。当然,你会留下 300 个最独特的。如果你想更深入地研究它,看看它是如何工作的,你可以查看here
另一方面,word2vec 将任何单词映射到 300 维向量。当然,您必须进行一些预处理,类似于 tf-idf,但这种方法的敏感性要低得多。您可以找到 word2vec 的工作原理here
最后,我建议您使用 word2vec,因为它更容易开始。有谷歌的预训练模型,你可以下载here
【讨论】:
您好,感谢您的回答。我正在尝试将文本短语分类为类似于聊天机器人的不同类别。我们已经使用了企业聊天机器人解决方案,但这将用于帮助培训机器人。我们将使用过去的训练数据来匹配新的用户短语进行分类。我查看了 deeplearnings4j 的 word2vec 实现 我们有大约 700 多个训练类别,其中一些类别的训练数据与其他类别非常相似。我从 deeplearning 和其他网站上查看了 word2vec,我大致了解了它的工作原理。那么我会为每个类别构建一个 word2vec,然后将每个新的训练短语与每个模型进行比较,然后选择最接近的匹配项吗?我在原帖中添加了一些示例类别。 不,word2vec 已经是把单词变成数字序列的模型了。你想要做的是:当你得到短语时,使用 word2vec 模型将每个单词转换为向量,以某种方式将向量连接到一个向量(也许尝试将来自该短语中所有单词的向量加在一起)并将它在聚类算法中。它将使用所有短语的向量构建集群,然后您将根据集群中的距离选择最接近的一个。那将是我的第一次尝试【参考方案2】:两种最流行的方法是:
将每个短语/句子表示为一袋单词,您基本上对短语的每个单词进行一次热编码,编码的维度是您的词汇量(单词总数) 使用基于流行模型的嵌入,例如word2vec
,它将每个单词放入 X 维向量空间(例如 300 维),因此您的每个短语/句子都是 X 维向量序列
更极端的方法是使用universal-sentence-encoder 等模型嵌入整个句子。简而言之:它类似于word2vec
,但不是单词,而是将整个句子转换为(512 维)向量空间。比找到“相似”的句子更容易。
【讨论】:
是否有用于 Java 的通用句子编码器库?我能找到的只有 python 库以上是关于文本分类,如何将文本字符串转换为向量表示的主要内容,如果未能解决你的问题,请参考以下文章
文本挖掘——文本特征TFIDF权重计算及文本向量空间VSM表示