【问题标题】:De-Duplicating sets of n-grams去重 n-gram 集
【发布时间】:2013-10-06 09:27:01
【问题描述】:

我需要想出一种方法来对最相关的数据进行排序并向用户显示。我们的数据由从社交媒体中提取的多个 n-gram 组成。我们称这些为“主题”。

我面临的问题是数据包含很多重复。虽然每个字符串都不是另一个字符串的直接副本,但它们是子集。对于用户而言,此信息似乎是重复的。以下是一些示例数据:

{
    "count": 1.0, 
    "topic": "lazy people"
}, 
{
    "count": 1.0, 
    "topic": "lazy people taking"
}, 
{
    "count": 1.0, 
    "topic": "lazy people taking away food stamps"
}

一个极端情况是可以从其他短语中提取短语“lazy people”。例如,“懒人快乐”。使用最小的公分母(在这种情况下是“懒惰的人”)似乎不是一个好主意,因为最终用户不会看到不同的上下文(“拿走食品券”和“很开心”)。

另一方面,取最长的 N-Gram 可能信息太多。在我上面给出的例子中,这似乎是合乎逻辑的。但是,这可能并不总是成立。

我的总体目标是以信息丰富且排名靠前的方式呈现这些数据。

有没有现有的解决方案和相应的算法来解决这类问题?

注意:最初我的问题非常含糊不清。事实上,这导致我一起改变了这个问题,因为我真正需要的是关于我的最终结果应该是什么的指导。

注意 2:如果我误用了任何术语,或者应该修改此问题的标题,以便其他人搜索此类问题的答案,请告诉我。

【问题讨论】:

  • 您到底想完成什么?有几种方法可以减少 n-gram 的空间,具体取决于您的需求。
  • 我正在尝试显示所有 N-Gram 的排序列表而不显示冲突。一个简单的例子是,如果这是我拥有的所有数据,那么“The World”和“The World is Good”将显示为数量相等,即使显示“The World is Good”只是有用。另一个极端情况是我的数据库中的其他对象可能包含“世界”作为 2 克,但“世界还活着”作为 4 克。这有帮助吗?
  • @JimMischel,我已经完全修改了我的问题。我不确定最终结果应该是什么——只是“这是我拥有的数据类型”和“这是我用数据实现的有点通用的目标”。总体而言,我认为我需要有人帮助我了解如何最好地将此类信息转换为呈现给用户。

标签: algorithm nlp aggregate deduplication


【解决方案1】:

这是一个难题,解决方案往往是针对特定应用的。通常,您收集的不仅仅是 n-gram 和计数。例如,一个特定的 n-gram 是否被一个人或很多人大量使用通常很重要。也就是说,如果我经常发帖并且对木雕充满热情,那么 n-gram“木雕”可能会成为一个常用术语。但我是唯一关心它的人。另一方面,可能有很多人喜欢油画,但他们发帖的频率相对较低,因此 n-gram“油画”的计数接近“木雕”的计数。但很明显,“油画”会与您的用户相关,而“木雕”则不会。如果没有关于 n-gram 来自哪些页面的信息,就不可能说哪些页面与更多用户相关。

识别文档语料库中最相关短语的常用方法称为TF-IDF:词频-逆文档频率。您看到的大多数描述都与单个单词有关,但将其扩展到 n-gram 很简单。

当然,这假设您可以识别某种类型的单个文档。您可以将每个单独的帖子视为一个文档,或者您可以将来自用户的所有帖子分组为一个更大的文档。或者,也许一天中的所有帖子都被视为文档。如何识别文件取决于您。

一个简单的 TF-IDF 模型并不难构建,而且它在第一次切割时给出了不错的结果。您可以针对样本语料库运行它以获得基线性能数字。然后您可以添加改进(参见 Wikipedia 文章和相关页面),始终根据您的纯 TF-IDF 基线测试它们的性能。

鉴于我掌握的信息,这就是我要开始的地方。

【讨论】:

  • 我应该提一件事,可能还不是很清楚。我想保留每个短语的总和/计数。在这种情况下,可能有 100 次提及“The World”,70 次提及“The World is good”和 30 次提及“The world is round”。显示时,显示“世界是美好的”和“世界是圆的”会更有趣,但“世界”会使它们相形见绌。回顾过去——我认为我需要对最终结果进行更多思考。谢谢!
  • @Kurtis:是的,需要全面了解您希望从流程中获得什么。例如,如果您还想像“养活世界”和“爱世界”那样合并后缀,事情就会变得复杂得多。
【解决方案2】:

考虑使用图形数据库,有一个单词表,包含 N-Grams 的元素;以及一个 N-Gram 表,其中包含 N-Gram 中包含的单词的弧线。

作为实现,您可以使用也有 Python 库的 neo4j: http://www.coolgarif.com/brain-food/getting-started-with-neo4j-in-python

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 2012-04-11
    • 2016-08-01
    • 2018-04-05
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多