gpt4 book ai didi

scala - 推理标记的 LDA/pLDA [主题建模工具箱]

转载 作者:行者123 更新时间:2023-12-01 12:52:00 25 4
gpt4 key购买 nike

我一直在尝试使用 TMT 工具箱(stanford nlp group)从训练有素的标记 LDA 模型和 pLDA 中完成推理代码。我已经完成了以下链接中提供的示例: http://nlp.stanford.edu/software/tmt/tmt-0.3/ http://nlp.stanford.edu/software/tmt/tmt-0.4/

这是我正在尝试进行标记的 LDA 推理的代码

val modelPath = file("llda-cvb0-59ea15c7-31-61406081-75faccf7");

val model = LoadCVB0LabeledLDA(modelPath);`

val source = CSVFile("pubmed-oa-subset.csv") ~> IDColumn(1);

val text = {
source ~> // read from the source file
Column(4) ~> // select column containing text
TokenizeWith(model.tokenizer.get) //tokenize with model's tokenizer
}

val labels = {
source ~> // read from the source file
Column(2) ~> // take column two, the year
TokenizeWith(WhitespaceTokenizer())
}

val outputPath = file(modelPath, source.meta[java.io.File].getName.replaceAll(".csv",""));

val dataset = LabeledLDADataset(text,labels,model.termIndex,model.topicIndex);

val perDocTopicDistributions = InferCVB0LabeledLDADocumentTopicDistributions(model, dataset);

val perDocTermTopicDistributions =EstimateLabeledLDAPerWordTopicDistributions(model, dataset, perDocTopicDistributions);

TSVFile(outputPath+"-word-topic-distributions.tsv").write({
for ((terms,(dId,dists)) <- text.iterator zip perDocTermTopicDistributions.iterator) yield {
require(terms.id == dId);
(terms.id,
for ((term,dist) <- (terms.value zip dists)) yield {
term + " " + dist.activeIterator.map({
case (topic,prob) => model.topicIndex.get.get(topic) + ":" + prob
}).mkString(" ");
});
}
});

错误

发现:scalanlp.collection.LazyIterable[(String, Array[Double])]需要:Iterable[(String, scalala.collection.sparse.SparseArray[Double])]EstimateLabeledLDAPerWordTopicDistributions(模型、数据集、perDocTopicDistributions);

我知道这是类型不匹配错误。但我不知道如何为 scala 解决这个问题。基本上我不明白我应该如何提取1. 每个文档主题分布2. infer命令输出后的per doc标签分配。

请帮忙。在 pLDA 的情况下也是如此。我到达推理命令,然后不知道如何处理它。

最佳答案

Scala 类型系统比 Java 类型系统复杂得多,理解它将使您成为更好的程序员。问题出在这里:

val perDocTermTopicDistributions =EstimateLabeledLDAPerWordTopicDistributions(model, dataset, perDocTopicDistributions);

因为模型、数据集或 perDocTopicDistributions 属于以下类型:

scalanlp.collection.LazyIterable[(String, Array[Double])]

虽然 EstimateLabeledLDAPerWordTopicDistributions.apply 期望一个

Iterable[(String, scalala.collection.sparse.SparseArray[Double])]

调查此类型错误的最佳方法是查看 ScalaDoc(例如 tmt 的那个:http://nlp.stanford.edu/software/tmt/tmt-0.4/api/#package)如果您不能轻易找出问题所在,您应该明确您的类型代码中的变量如下所示:

 val perDocTopicDistributions:LazyIterable[(String, Array[Double])] =  InferCVB0LabeledLDADocumentTopicDistributions(model, dataset)

如果我们一起查看 edu.stanford.nlp.tmt.stage 的 javadoc:

def
EstimateLabeledLDAPerWordTopicDistributions (model: edu.stanford.nlp.tmt.model.llda.LabeledLDA[_, _, _], dataset: Iterable[LabeledLDADocumentParams], perDocTopicDistributions: Iterable[(String, SparseArray[Double])]): LazyIterable[(String, Array[SparseArray[Double]])]

def
InferCVB0LabeledLDADocumentTopicDistributions (model: CVB0LabeledLDA, dataset: Iterable[LabeledLDADocumentParams]): LazyIterable[(String, Array[Double])]

现在您应该清楚 InferCVB0LabeledLDADocumentTopicDistributions 的返回不能直接用于提供 EstimateLabeledLDAPerWordTopicDistributions。

我从未使用过 stanford nlp 但这是设计使然的 api 工作方式,因此您只需将 scalanlp.collection.LazyIterable[(String, Array[Double])] 转换为 Iterable[(String, scalala.collection.sparse.SparseArray[Double])] 在调用函数之前。

如果您查看有关如何进行此转换的 scaladoc,它会非常简单。在 package 阶段,在 package.scala 中我可以读取 import scalanlp.collection.LazyIterable;

所以我知道去哪里找,事实上在http://www.scalanlp.org/docs/core/data/#scalanlp.collection.LazyIterable里面你有一个 toIterable 方法可以将 LazyIterable 转换为 Iterable,但你仍然必须将内部数组转换为 SparseArray

再次,我查看了 tmt 中阶段包的 package.scala,我看到:import scalala.collection.sparse.SparseArray; 我寻找 scalala 文档:

http://www.scalanlp.org/docs/scalala/0.4.1-SNAPSHOT/#scalala.collection.sparse.SparseArray

事实证明,构造函数对我来说似乎很复杂,所以听起来很像是我必须查看工厂方法的伴随对象。原来我要找的方法就在那里,而且在Scala中和往常一样叫做apply。

def
apply [T] (values: T*)(implicit arg0: ClassManifest[T], arg1: DefaultArrayValue[T]): SparseArray[T]

通过使用它,您可以编写具有以下签名的函数:

def f: Array[Double] => SparseArray[Double]

完成此操作后,您可以使用一行代码将 InferCVB0LabeledLDADocumentTopicDistributions 的结果转换为稀疏数组的非延迟迭代:

result.toIterable.map { case (name, values => (name, f(values)) }

关于scala - 推理标记的 LDA/pLDA [主题建模工具箱],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com