有没有一种算法可以帮助检测英语句子的“主题”?

33

我正在尝试找出是否有一种已知的算法能够检测一个句子的“关键概念”。

使用案例如下:

  1. 用户输入一个查询句子(鸡肉的味道像火鸡吗?)
  2. 我们的系统识别句子的概念(鸡肉,火鸡)
  3. 然后它运行搜索我们语料库内容的过程

我们欠缺的是确定句子真正涉及什么核心“主题”的能力。句子“鸡肉的味道像火鸡吗?”的主要主题是“鸡肉”,因为用户询问的是鸡肉的味道。而“火鸡”是次要的辅助主题。

所以……我正在尝试找出是否有一种算法可以帮助我确定一个句子的主要主题……如果你知道任何这样的算法,请告诉我!!!


1
语言严格限定为英语吗? - biziclop
26
果蝇喜欢香蕉。 - porges
2
@belisarius 只有一个是有意义的。 - biziclop
2
@biziclop:关键是两种意思都有语法上的合理性。Porges的评论很好地证明了一个句子的语法结构不能仅仅通过语法规则来推断:要做到这一点需要(大量的)领域知识。如果你甚至无法确定一个句子的语法结构,那么你如何确定它的预期含义呢? - j_random_hacker
1
你可能想要了解免费的OpenCalais服务:http://opencalais.com - user3188544
显示剩余5条评论
12个回答

21

我曾经做过一个研究项目,并赢得了两个比赛的奖项并参加了全国比赛。

这种方法包括两个步骤

  1. 使用上下文无关文法(CFG)解析句子
  2. 在解析树中,找到所有只属于名词短语一部分的名词

例如,“我吃派”,有2个名词:“我”和“派”。从解析树来看,“派”位于动词短语内部,因此不能是主语。然而,“我”仅位于类似名词短语的成分中。作为唯一的主语候选者,它就是主语。您可以在http://www.candlemind.com上找到该程序的早期版本。请注意,词汇量仅限于基本单数词汇,且没有动词变位,因此有“人”但没有“人们”,有“吃”但没有“吃掉”。此外,我使用的CFG是手工制作的,并且存在一定限制。我将很快更新此程序。

总之,这个程序还有局限性。我的导师指出,在目前的状态下,它无法识别主语是“真正”的名词短语(语法实际上称之为NP)的句子。例如,“月亮是平的已经不再是一个辩论话题。” 主语实际上是“月亮是平的”。但是程序会将“月亮”认为是主语。我很快就会修复这个问题。

总之,对大多数句子来说,这已经足够了...

我的研究论文也可以在那里找到。请前往第11页阅读方法。

希望这有所帮助。


11
句子的语法主语并不等同于它的主题。比如,在你的回答中间,你说:“我会很快更新这个程序。”根据上下文,这句话的主题是“这个程序”,因为这是这个句子所陈述的内容。然而,语法主语却是“我”。 - jogojapan

10

大多数基本的自然语言处理(NLP)解析技术可以提取句子的基本要素 - 即,鸡肉和火鸡是名词短语(NP),它们由形容词“like”连接。将它们转化为“主题”或“概念”则更加困难。

像潜在语义分析(Latent Semantic Analysis)及其许多派生技术这样的技术将此信息转换为向量(一些方法保留某些部分之间的层次结构/关系),然后将其与现有向量进行比较,通常是预先按概念分类的向量。请参见http://en.wikipedia.org/wiki/Latent_semantic_analysis以开始学习。

编辑以下是一个LSA应用程序的示例,您可以尝试一下看看是否想进一步学习。 http://lsi.research.telcordia.com/lsi/demos.html


即使LSA不能直接解决OP的问题,但我还是支持+1。 - Fred Foo
LSA - 只有在查找查询中更独特的单词时才会真正有所帮助。因此,如果“鸡肉”出现在比“火鸡肉”更多的文档中,“火鸡肉”更有可能出现在前几个结果中... - rockit
1
@rockit - LSA 真的与查询中的唯一单词没有太多关系。我认为你把向量的创建和 LSA 混淆了。事实上,一些 LSA 变体甚至不保留单词的数量,只保留其存在性。 - dfb
1
演示链接已经失效。这里是一个可用的LSA:https://github.com/TheDataLeek/Python-LSA。 - dashesy
gensim 还拥有更多的 LSA 工具。 - dashesy

3
对于很多较长的句子来说,很难确定到底是什么主题,也可能存在不止一个主题。
一种获取近似答案的方法是:
1. 使用openNLP、stanford Parser或其他相似工具对句子进行标记 2. 从句子中移除所有停用词 3. 挑选名词(专有名词,单数和复数)
另一种方法是:
1. 使用任何一种解析器将句子分成短语 2. 挑选出所有名词短语 3. 移除没有名词作为子节点的名词短语 4. 只保留形容词和名词,移除其余名词短语中的所有单词
这样可能会得到近似的答案。

1
“关键概念”在语言学中没有一个明确定义的术语,但这可能是一个起点:解析句子,在分析树或依赖结构中找到主语。(这并不总是有效的;例如,“是否在下雨?”的主语是“它”,而关键概念很可能是“雨”。还有,“意大利面和千层面是否相同?”中的关键概念是什么?)
这种问题(NLP + 搜索)更适合使用LSA等方法处理,但那是一个相当高级的话题。

@rockit:我不是那个链接到另一个问题的人。似乎你想要的东西可以做到一定程度。 - Fred Foo
1
该死的,"下雨了吗?"是我想写的第一个例子。(与"I've just seen 2012."/"Is it interesting?"/"Not really."相反。)但我会加入我的第二个例子,这非常恰当:"你怎么敢?" - biziclop
@biziclop,@rockit:可以通过过滤诸如“它”之类的单词并选择主动词的宾语,甚至是动词本身作为“关键概念”,来避免“空”主题。 - Fred Foo
@rockit - FWIW - 你不会轻易找到这个问题的解决方案。大多数这些技术都依赖于拥有训练数据语料库。 - dfb
一个句子的语法主语是一个句法(即结构)概念。它与句子的主题无关。此外,“诸如LSA之类的方法”是什么? - jogojapan
显示剩余10条评论

1
在最基本的层面上,英语中的问题通常采用 <动词> <主语> ... ? 或者 <代词> <动词> <主语> ... ? 这样的形式。这绝不是一个好的算法,特别是考虑到主语可能涵盖多个单词,但取决于您需要多么复杂的解决方案,它可能是一个有用的起点。
如果您需要精确性,请忽略此答案。

“鲸鱼是哺乳动物,这是真的吗?” :p - Fred Foo
@larsmans 在最基本的层面上...问题是,我们不知道OP在想什么样的精度。虽然这个问题的主题实际上是“它”,它指的是复合句的第二部分。 - biziclop
实际上,在英语中,“最基本的水平”相对于其他语言来说确实非常基础,因此这可能对强化学习问题没有太大帮助。 - Voo
@Voo 我也没有太大的希望,更多的是为了展示不同复杂度和效率选项的完整谱系。这种方法在谱系中排名相当低。 - biziclop

1
如果你愿意花钱,http://www.connexor.com/ 可以进行各种语言(包括英语)的语义分析。我从未直接使用过他们的产品,因此无法对其效果发表评论。

1

1

复合或复杂句子可能有一个以上的主要概念。

您可以使用stanfordNLP或MaltParser,它们可以给出句子的依赖结构。它还提供了词性标注,包括主语、动词、宾语等。

我认为大多数情况下,宾语将是句子的关键概念。


1

那与提取“主题”有什么关系? - jogojapan

0
简单的解决方案是使用词性标注器(例如Python的 NLTK库)对您的句子进行标记,然后在一些预定义的词性模式中查找匹配项,在这些模式中明确句子的主语所在位置。

我怀疑基于词性标注的分块模式集合能够可靠地找到句子的主语。此外,可以使用能够完成此任务的解析器。 - Fred Foo
我的句子被OpenNLP语法标记了,但不是针对句子的主语。 - rockit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接