如果这个答案太笼统或者您无法理解某些内容,请不要担心 - 这是学术内容,需要一些基本准备。如果您愿意,请随时与我联系(在评论中询问我的邮件,我们会想办法解决的)。
我认为这个问题更适合CrossValidated。
无论如何,您需要做的第一件事就是创建一些训练集。您需要找到尽可能多的带有原因的文档并对其进行注释,并标记指定原因的短语。文件越多越好。如果您要使用用户报告 - 使用示例报告,以便训练数据和真实数据来自同一来源。这就是您为处理构建某种语料库的方式。
然后你必须指定你需要的功能。这可能是 POS 标签、n-gram 特征、引理/词干等。这需要实验和一些练习。在这里,我将使用一些 n-gram 特征(可能是 2-gram 或 3-gram),也许还有一些基于 Wordnet 的知识。
最后一步是构建你的块化器或注释器。它是一个组件,它将获取您的训练集,对其进行分析并了解它应该标记什么。你会遇到一种叫做“语义鸿沟”的东西——这个术语描述了你的程序“学习”了你想要的东西(这是一种简化)的情况。例如,您可以使用这样的一组功能,您的分块器将学会寻找“我不”短语而不是推理短语。这实际上取决于您的训练集和功能集。如果发生这种情况,您应该尝试更改您的功能集,并在一段时间后尝试处理训练集,因为它可能不具有代表性。
如何构建这样的分块器?对于您的情况,我会使用 HMM(隐马尔可夫模型)或 - 甚至更好 - CRF(条件随机场)。这两种是流注解常用的统计方法,而你的文本基本上就是一个token流。另一种方法可能是使用任何“标准”分类器(从朴素贝叶斯,通过一些决策树,NN 到 SVM)并在文本中的每个 n-gram 上使用它。
当然,选择特征集高度依赖于所选择的方法,因此请阅读一些关于它们的内容并明智地选择。
PS。这是一个过于简单的答案,遗漏了许多关于训练集准备、选择特征、预处理你的语料库、为其寻找来源等重要的事情。这不是演练——这些是你应该自己探索的基本步骤。
聚苯乙烯。不确定,但 NLTK 可能有一些 CRF 或 HMM 实现。如果没有,我可以推荐scikit-learn用于 Markov 和CRFP++用于 CRF。注意 - 后者很强大,但是很容易从 Java 或 python 安装和使用。
==编辑==
简要介绍一下功能:
首先,我们可以想象什么样的特征?
- lemma/stem - 你在语料库中找到每个单词的词干或词条,选择最重要的(通常那些频率最高,或者至少你会从那里开始),然后将每个单词/n-gram 表示为二进制向量,说明词干/词根化后表示的单词或序列是否包含该特征词根/词干
- n-grams - 与上面类似,但不是单个单词,而是选择最重要的长度为 n 的序列。“n-gram”的意思是“长度为 n 的序列”,因此例如“我坐在长凳上”的二元组(2 克)将是:“我坐在”、“坐在”、“在一个”、“一个长凳上” ”。
- skipgrams - 类似于 n-gram,但在原始句子中包含“间隙”。例如,间隙大小为 3 的 biskipgram 表示“Quick brown fox jumped over something”(抱歉,我现在不记得这个短语 :P )将是:["Quick", "over"], ["brown", “某物”]。一般来说,间隙大小为 m 的 n-skipgram 是通过获取一个单词、跳过 m、获取一个单词等获得的,除非你有 n 个单词。
- POS 标签——我一直把它们误认为是“位置”标签,但这是“词性”的首字母缩写。当您需要查找具有共同语法结构的短语而不是常见单词时,它很有用。
当然,您可以将它们组合起来 - 例如使用词条的跳过图,或词条的 POS 标签,甚至是词条的词条标签的 *-grams(选择您最喜欢的:P)。
使用引理的 POS 标签有什么意义?这将描述词的基本形式的词性,因此它将您的特征简化为“这是一个名词”而不是“这是复数女性名词”之类的事实。
请记住,选择特征是整个过程中最重要的部分之一(另一个是数据准备,但这值得整个学期的课程,并且特征选择可以在 3-4 个讲座中处理,所以我试图把这里的基础)。在“寻找”块时你需要某种直觉——例如,如果我想找到所有关于颜色的表达式,我可能会尝试使用 2 或 3 克的单词,表示为二进制向量,描述是否这样的 n- gram 包含最流行的颜色名称和修饰符(如“light”、“dark”等)和 POS 标签。即使您错过了一些颜色(例如“洋红色”),如果您的方法(我会再次使用 CRF,这是此类任务的绝佳工具)足够概括所学知识,您也可以在文本中找到它们。