我希望识别简单的短语,例如google calendar中发生的短语 但不是解析日历条目,而是我必须解析与财务,会计和待办事项相关的句子。所以例如我必须解析像
这样的句子我昨天在食物上花了50美元
我需要将信息标记为Reason : 'food'
,Cost : 50
和Time: <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回答为什么使用特定方法更好。 即使特定方法可能不符合时间限制,请随意分享,因为它可能会使其他人受益。
答案 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框架: