11

我意识到这是一个广泛的话题,但我正在寻找一个很好的从文本中解析含义的入门书,最好是在 Python 中。作为我想要做的一个例子,如果用户发表博客文章,例如:

“曼尼·拉米雷斯今天回归道奇队,对阵休斯顿太空人队”,

从句子中取出名词的轻量级/简单方法是什么?首先,我想我会将它限制为专有名词,但我不想仅限于此(而且我不想依赖一个简单的正则表达式,它假设任何 Title Capped 都是专有名词)。

让这个问题更糟的是,我没有要求我应该做的事情是什么?我需要现有单词的语料库才能开始吗?我需要知道哪些词法分析知识才能完成这项工作?我确实遇到了关于该主题的另一个问题,我现在正在挖掘这些资源。

4

7 回答 7

10

您需要查看Natural Language Toolkit,它正是用于此类事情的。

手册的这一部分看起来非常相关:Categorizing and Tagging Words - 这是一个摘录:

>>> 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,一个协调连词;现在完全是RB,或副词;for is IN,介词;某物是NN,名词;和不同的是JJ,一个形容词。

于 2009-07-17T00:07:54.530 回答
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 任务获取正确格式的文本。

于 2009-07-17T03:58:18.573 回答
7

自然语言处理 (NLP) 是解析自然语言的名称。存在许多算法和启发式方法,这是一个活跃的研究领域。无论您编写什么算法,都需要在语料库上进行训练。就像人类一样:我们通过阅读其他人写的文本(和/或通过听其他人说出的句子)来学习一门语言。

实际上,请查看Natural Language Toolkit。对于您将要编写的任何代码的理论基础,您可能需要查看Chris Manning 和 Hinrich Schütze的《统计自然语言处理基础》 。

替代文字
(来源:stanford.edu

于 2009-07-17T00:15:09.623 回答
4

这是我最近偶然发现的一本书:Natural Language Processing with Python

于 2009-07-17T00:12:15.847 回答
3

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

这里有一些链接

正如所指出的,这是非常有问题的领域特定的东西。你越能缩小范围,它就会越有效。而且您将不得不在您的特定域上训练您的程序。

于 2009-07-17T00:11:58.000 回答
1

这是一个非常复杂的话题。一般来说,这类东西属于自然语言处理的范畴,充其量往往是棘手的。这类东西的困难正是为什么仍然没有完全自动化的系统来处理客户服务等。

一般来说,处理这些东西的方法真的取决于你的问题域是什么。如果您能够筛选出问题域,您可以获得一些非常重要的好处;以您的示例为例,如果您能够确定您的问题领域是棒球,那么这将为您提供一个非常强大的开端。即便如此,要让任何特别有用的东西运行起来,还是需要做大量的工作。

就其价值而言,是的,现有的语料库将很有用。更重要的是,确定系统预期的功能复杂性将变得至关重要。你需要解析简单的句子,还是需要解析复杂的行为?你能把输入限制在一个相对简单的集合中吗?

于 2009-07-17T00:10:30.123 回答
-1

正则表达式在某些情况下会有所帮助。这是一个详细的例子:What's the Most Mentioned Scanner on CNET Forum,它使用正则表达式来查找 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)))

为了匹配以下任一:

  • 两个词,然后是型号(包括一体机),然后是“扫描仪”</li>
  • “扫描仪”,然后是一两个词,然后是型号(包括一体机)

结果,从帖子中提取的文本就像,

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

这个正则表达式解决方案在某种程度上起作用。

于 2015-12-08T01:04:45.027 回答