从文本中解析意义

11

我知道这是一个广泛的话题,但我正在寻找一个简洁易懂的教程,介绍从文本中提取含义的方法,最好使用Python。举个例子,如果用户发布了以下博客帖子:

"曼尼·拉米雷斯今天将回归道奇队对阵休斯顿太阳"

有什么轻量/简单的方法可以从句子中获取名词?首先,我认为我会限制它只提取专有名词,但我不想仅限于此(也不想依赖假设任何标题大写的文本都是专有名词的简单正则表达式)。

更糟糕的是,有哪些问题我没有问到但应该问?我需要一些现有单词的语料库来开始吗?我需要了解哪些词汇分析技术才能使其发挥作用?我确实看到了另一个问题涉及到这方面的内容,我正在查阅那些资源。


1
有一些Python中的“语义解析器”实现可以做到这一点,比如SEMPRE - Anderson Green
7个回答

11
你需要查看自然语言工具包,它正是用于这种情况的。
手册的这一部分非常相关:词汇分类和标记 - 这里是一段摘录:
>>> text = nltk.word_tokenize("And now for something completely different")
>>> nltk.pos_tag(text)
[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'),
('completely', 'RB'), ('different', 'JJ')]

在这里我们可以看到,and 是 CC,一个并列连词;nowcompletely 是 RB,即副词;for 是 IN,一个介词;something 是 NN,一个名词;而 different 则是 JJ,一个形容词。


8

使用NLTK,特别是信息提取的第7章。

你说你想提取含义,有语义分析模块,但我认为IE是你所需要的一切 - 而且诚实地说,这是计算机目前唯一能处理的NLP领域之一。

请参阅7.5和7.6节,了解命名实体识别(将Manny Ramerez作为人、Dodgers作为体育组织、Houston Astros作为另一个体育组织或适合您领域的任何内容进行分块和分类)和关系提取的子主题。一旦安装了NLTK,就可以插入NER分块器。从他们的示例中,提取地缘政治实体(GPE)和人物:

>>> sent = nltk.corpus.treebank.tagged_sents()[22]
>>> print nltk.ne_chunk(sent) 
(S
  The/DT
  (GPE U.S./NNP)
  is/VBZ
  one/CD
  ...
  according/VBG
  to/TO
  (PERSON Brooke/NNP T./NNP Mossman/NNP)
  ...)

请注意,您仍需要了解标记和标注,正如早期章节所讨论的那样,以便将文本格式化为这些IE任务所需的正确格式。

7
自然语言处理(NLP)是解析自然语言的名称。许多算法和启发式方法存在,并且它是一个活跃的研究领域。无论您编写什么算法,它都需要在语料库上进行训练。就像人类一样:我们通过阅读其他人写的文本(和/或听其他人说的句子)来学习语言。
在实际应用中,可以查看Natural Language Toolkit。对于您将要编写的任何理论基础,您可能希望查看Chris Manning和Hinrich Schütze的Foundations of Statistical Natural Language Processingalt text
(来源:stanford.edu

1
这本书是关于统计自然语言处理概念的绝佳入门读物! - Jay Stevens

4

哈,我刚在亚马逊把它加入购物车了,然后回到这里。它好用吗?我在想为什么没有评论。 - Tom
它看起来有相当不错的NTLK描述 - 这是一个答案中提到的工具包。 - zakovyrya

3
你想要的是称为NP(名词短语)分块或提取。

这里有一些链接

正如指出的那样,这是非常特定于问题域的东西。你能够缩小范围,它将更加有效。而且你需要在特定的领域训练你的程序。

1

这是一个非常复杂的话题。一般来说,这种东西属于自然语言处理范畴,往往是最棘手的。正是由于这种东西的难度,目前还没有完全自动化的系统来处理客户服务等事务。

通常情况下,对这种问题的处理方法取决于你的问题领域是什么。如果你能够缩小问题领域,那么你就可以获得一些非常重要的好处;以你的例子为例,如果你能够确定你的问题领域是棒球,那么这将给你一个非常强大的起点。即使如此,要让任何有用的东西运转起来也需要大量的工作。

值得一提的是,现有的词库会非常有用。更重要的是,确定系统所期望的功能复杂性至关重要;你需要解析简单的句子,还是需要解析复杂的行为?你能否将输入限制在相对简单的集合中?


-1

正则表达式在某些场景下非常有帮助。下面是一个详细的例子:CNET 论坛上被提到最多的扫描仪是哪个?,其中用到了一个正则表达式来查找 CNET 论坛帖子中提到的所有扫描仪。

在这篇文章中,使用了如下的正则表达式:

(?i)((?:\w+\s\w+\s(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)\s(\w+\s){0,1}(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner))|(?:(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner)\s(\w+\s){1,2}(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)))

为了匹配以下任意一种情况:

  • 两个单词,然后是型号(包括多合一),然后是“扫描仪”
  • “扫描仪”,然后是一个或两个单词,然后是型号(包括多合一)

因此,从帖子中提取的文本如下:

  1. 已停产的 HP C9900A 照片扫描仪
  2. 扫描他的旧 X 光
  3. 新的 Epson V700 扫描仪
  4. HP ScanJet 4850 扫描仪
  5. Epson Perfection 3170 扫描仪

这个正则表达式解决方案起到了作用。


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