我希望将Javascript对象按其字符串键值(description)中的一个进行集群。我已经尝试过多种解决方案,并希望就如何处理这个问题提供一些指导。
我想要的是:假设我有一个对象数据库。其中可能有很多人(可能有数千人,也许有数万人)。我需要能够:
categoryId (代表它们所属的集群)。我还没有尝试解决第二个问题,但下面是我尝试过的第一个问题。
npm的hierarchical-clustering库),但在大约150,我将不得不等待大约一分钟。成千上万的人都不工作。npm的natural库来计算TF和node-kmeans)。对于#2,我想使用朴素的Bayes (但我还没有尝试)。
有什么建议吗?如果这些对象只是聚集在一起,那就很好了。如果我能够提取标记(比如从TF-以色列国防军)来聚集这个组,那就更好了。
发布于 2020-01-17 12:50:55
使用tensorflow,可以创建一个深度学习模型,一旦经过训练,就可以用来预测传入单词的类别。
让我们假设这是dataset:
let data = [{description: 'just something', label: '1'}, {description: 'something else', label: '2'}]在文本分类中要做的第一件事是将文本编码为张量。考虑到感兴趣的领域,许多算法都可以被使用,只要它们能带来很好的精度。特别是,有一个通用句子编码器,它将转换大小为512的一维张量中的每个句子。
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主要是使用,因为单元格在将输出转发到其他层时会考虑数据的上下文。下面是这样一个模型的示例
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 2inputShape of [n, 512]是指模型一次输入n语句。如果句子的数量是可变的,则inputShape将是[null, 512]。
模型将被训练
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)
}
}
})在对模型进行了训练之后,每输入一个单词,就会有一个预测。但是,传入的单词需要首先转换成一个张量,这是上面描述的。
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添加填充。
https://stackoverflow.com/questions/42245050
复制相似问题