简单的短语识别

时间:2012-01-13 12:29:11

标签: regex parsing nlp

我希望识别简单的短语,例如google calendar中发生的短语 但不是解析日历条目,而是我必须解析与财务,会计和待办事项相关的句子。所以例如我必须解析像

这样的句子
  我昨天在食物上花了50美元

我需要将信息标记为Reason : 'food'Cost : 50Time: <Yesterday's Date>

我的问题是我是否会参加完整的自然语言处理 在这些问题中给出并使用GATE

之类的东西

Machine Learning and Natural Language Processing

Natural Language Processing in Ruby

Ideas for Natural Language Processing project?

https://stackoverflow.com/a/3058063/492561

或者使用像AntLR之类的东西编写简单的语法并尝试识别它是否更好。

或者我应该真的很低,只需定义语法并使用正则表达式。

时间是一个约束,我有大约45 - 50天,我不知道如何使用像GATE这样的AntLR或NLP库。

首选语言:Python,Java,Ruby(不按任何特定顺序排列)

PS:这不是家庭作业,所以请不要将其标记为。

PPS:请尝试用Facts回答为什么使用特定方法更好。 即使特定方法可能不符合时间限制,请随意分享,因为它可能会使其他人受益。

2 个答案:

答案 0 :(得分:4)

您确实可以查看命名实体识别。根据您的问题,我了解您的域名定义非常明确,因此您可以识别与您相关的(少数?)实体(日期,货币,金额,时间表达式等)。如果这些短语很简单,你可以采用基于规则的方法,否则很快就会变得过于复杂。

为了让自己在几秒钟内恢复正常运行,http://timmcnamara.co.nz/post/2650550090/extracting-names-with-6-lines-of-python-code是你能做的非常好的例子。当然我不希望只有6行python的高精度,但它应该让你知道它是如何工作的:

1>>> import nltk
2>>> def extract_entities(text):
3...     for sent in nltk.sent_tokenize(text):
4...         for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent))):
5...             if hasattr(chunk, 'node'):
6...                 print chunk.node, ' '.join(c[0] for c in chunk.leaves())

核心思想是在第3行和第4行:在第3行,它将文本分成句子并迭代它们。 在第4行,它将句子分为标记,它在句子上运行"part of speech" tagging,然后将pos标记的句子提供给命名的实体识别算法。这是非常基本的管道。

一般来说,nltk是一个非常漂亮的软件,并且有很好的文档:我会看一下。其他答案包含非常有用的链接。

答案 1 :(得分:3)

您的任务是一种Information Extraction任务,具体为relation/fact extraction,前面有Named Entity Recognition

看看以下Java / Python框架: