【问题标题】:Tagging words based on some pre-defined categories根据一些预定义的类别标记词
【发布时间】:2016-03-10 22:09:21
【问题描述】:

假设我们有 16 个不同的类别,例如计算机、科学、艺术、商业等。我们在每个类别下都有一些词作为同义词、同音词等,它们描述了每个主题及其范围的可能含义。因此,可能有相似甚至相同的词属于多个类别。我们的目标是向系统提交查询(最大长度为 3,去除停用词后),并要求系统将该词放入相似度最高的类别中。所以我的问题是,除了余弦相似度之外,还有什么好的技术可以做到这一点?

我已经知道WordNet 及其扩展版本extjwnl,但是,我希望实现一个为我提供足够灵活性的小用途。

【问题讨论】:

  • 你能说得更具体一点吗?描述这个“查询”,我不知道你所说的最大长度是什么意思。听起来您需要能够使用“按引用传递”和“按值传递”。 Java 很难做到这一点,因为该语言不支持指针。如果这是您感兴趣的逻辑,您将需要每个单词包含它适合的所有类别。因此,类别将需要在每个单词中具有某种引用。如果您想使用 java,您将需要某种 oop 模型,如果速度是一个问题,这可能会很困难。需要更多信息。
  • @bigcodeszzer 最大长度表示查询包含的最大关键字。想象一下,我们有“printer laserjet”作为查询。我们希望将其分配给相似度最高的类别。每个类别都装满了一袋最相关的词。所以我的问题是,怎么做?
  • 听起来你正在做的事情非常具体,超出了基本的编码逻辑。但最终,如果您将每个类别编码为一个对象,那么您将使用一个函数来搜索每个类别的单词模式。如果您有多个单词模式,则必须多次运行该函数。计算每个类别中的匹配数并返回匹配次数最多的那个。
  • 预测或映射类别可以让这更快、更高效,这样您就可以在搜索过程中确定获得高结果的可能性。如果你真的想看看有趣的东西,看看神经网络。这种类型的模型可能会有所帮助。
  • @bigcodeszzer 这想法太简单了。所以我把这个问题发给statistical建模。

标签: java nlp stanford-nlp linguistics


【解决方案1】:

因此,除了词干提取、词形还原等提高性能之外,几乎没有什么可以做的,以便正确计算相似度。 现在就相似度而言,您可以使用 LDA(潜在狄利克雷分配)将每个文档视为多个主题的组合。

LDA 将文档表示为主题的混合,这些主题以一定的概率吐出单词。它假定文档以下列方式生成:在编写每个文档时,您

确定文档将包含的单词数 N(例如,根据泊松分布)。 为文档选择一个主题混合(根据一组固定的 K 个主题上的 Dirichlet 分布)。例如,假设我们有上面的两个食物和可爱的动物主题,您可以选择由 1/3 食物和 2/3 的可爱动物组成的文档。 通过以下方式生成文档中的每个单词 w_i: 首先选择一个主题(根据您上面采样的多项分布;例如,您可能会选择 1/3 概率的食物主题和 2/3 概率的可爱动物主题)。 使用主题生成单词本身(根据主题的多项式分布)。例如,如果我们选择食物主题,我们可能会以 30% 的概率生成单词“broccoli”,以 15% 的概率生成单词“bananas”,等等。 假设这个生成模型用于文档集合,LDA 然后尝试从文档中回溯以找到可能生成集合的一组主题。

https://www.cs.princeton.edu/~blei/topicmodeling.html

虽然这是主题(类别是潜在的)的无监督训练,但您可以使用称为 LLDA(Labeled LDA) 的 LDA 扩展。

我不建议使用 wordnet 和余弦相似度,因为它们不考虑术语的共现,因此可能不适用于所有数据集。

【讨论】:

  • LDA 太慢了。应该推荐一些不那么耗时的东西。
【解决方案2】:

Jaccard Similarity 也可以用于您的情况。

Jaccard Similarity 将一个句子转换为一个集合,然后找到我们必须找到相似度的文档之间的交集。

有关 Jaccard 相似度的更多信息,您可以查看https://en.wikipedia.org/wiki/Jaccard_index

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2022-01-03
    • 2020-02-14
    • 2019-06-06
    相关资源
    最近更新 更多