首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于聚类(和分类)短句的NLP包词/TF-IDF

用于聚类(和分类)短句的NLP包词/TF-IDF
EN

Stack Overflow用户
提问于 2017-02-15 09:13:31
回答 1查看 1.6K关注 0票数 6

我希望将Javascript对象按其字符串键值(description)中的一个进行集群。我已经尝试过多种解决方案,并希望就如何处理这个问题提供一些指导。

我想要的是:假设我有一个对象数据库。其中可能有很多人(可能有数千人,也许有数万人)。我需要能够:

  1. 按逻辑(类)组中的相似性对对象进行聚类。语义匹配将是很棒的,但就目前而言,仅仅是字符串的相似性就足够了。在它们聚集之后,我需要为它们分配一些categoryId (代表它们所属的集群)。
  2. 每当新对象被添加到数据库中时,我都需要将它们分类到现有的组中/提出新的集群。

我还没有尝试解决第二个问题,但下面是我尝试过的第一个问题。

  • 分层聚类与Levenshtein距离(单链接)-这里的问题是性能,结果令人满意(我使用了来自npmhierarchical-clustering库),但在大约150,我将不得不等待大约一分钟。成千上万的人都不工作。
  • TF-以色列国防军,矢量化+k-意思是-性能很好.它可以轻松地穿过5000件物体。但是结果肯定是关闭的(可能是我的实现中的一个错误)。我使用(来自npmnatural库来计算TF和node-kmeans)。
  • 包-单词+k-意思是-我现在正在尝试实现这个,还没有任何运气。

对于#2,我想使用朴素的Bayes (但我还没有尝试)。

有什么建议吗?如果这些对象只是聚集在一起,那就很好了。如果我能够提取标记(比如从TF-以色列国防军)来聚集这个组,那就更好了。

EN

回答 1

Stack Overflow用户

发布于 2020-01-17 12:50:55

使用tensorflow,可以创建一个深度学习模型,一旦经过训练,就可以用来预测传入单词的类别。

让我们假设这是dataset:

代码语言:javascript
复制
let data = [{description: 'just something', label: '1'}, {description: 'something else', label: '2'}]

在文本分类中要做的第一件事是将文本编码为张量。考虑到感兴趣的领域,许多算法都可以被使用,只要它们能带来很好的精度。特别是,有一个通用句子编码器,它将转换大小为512的一维张量中的每个句子。

代码语言:javascript
复制
const useModel = await use.load()
let features = data.map(d => useModel.embed(d.description))
features = tf.stack(features) // create a 2d tensor from the array of 1d tensor
let labels = tf.oneHot([0, 1], 2) // encode it as oneHot
// more details on labels encoding in this answer 
// https://stackoverflow.com/questions/59127861/how-may-i-define-my-own-labels-in-tensorflow-js/59128300#59128300

第二件事是为分类建立一个模型。虽然可以使用FCNN,但对于NLP处理,LSTM或双向LSTM主要是使用,因为单元格在将输出转发到其他层时会考虑数据的上下文。下面是这样一个模型的示例

代码语言:javascript
复制
const model = tf.sequential({
    layers: [
        tf.layers.lstm({ inputShape: [1, 512], units: 16, activation: "relu", returnSequences: true }),
        tf.layers.lstm({ units: 16, activation: "relu", returnSequences: true }),
        tf.layers.lstm({ units: 16, activation: "relu", returnSequences: false }),
        tf.layers.dense({ units: numberOfCategories, activation: "softmax" }),
    ]
}) // in this example of the numberOfCategories is 2

inputShape of [n, 512]是指模型一次输入n语句。如果句子的数量是可变的,则inputShape将是[null, 512]

模型将被训练

代码语言:javascript
复制
model.compile({
    optimizer: "adam",
    loss: "categoricalCrossentropy",
    metrics: ["accuracy"]
})
model.fit(features, labels, {
    epochs: number,// as needed to have a good accuracy
    callbacks: {
        onBatchEnd(batch, logs) {
            console.log(logs.acc)
        }
    }
})

在对模型进行了训练之后,每输入一个单词,就会有一个预测。但是,传入的单词需要首先转换成一个张量,这是上面描述的。

代码语言:javascript
复制
let prediction = model.predict( await useModel.embed('newWord').reshape([1, 1, -1])).argMax([-1])
prediction.print() // will print the index of the label

如果培训数据还没有标签(这意味着对象没有label属性),则应该对数据进行集群。在tensorflow.js中还没有聚类算法。对于文本聚类,我们首先需要创建标记。use包有一个令牌程序;还有一个包natural。标记化之后,可以使用node-kmeans对数据集进行标记。从这一步开始,可以使用第一种方法。

另一种方法可能是使用标记化的句子来训练模型。但是,由于所有句子的形状都不一样,因此需要使用tf.pad添加填充。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42245050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档