正则表达式:C#在文本中提取问题

时间:2012-12-05 21:09:26

标签: c# regex extract

我需要一个正则表达式来检测文本中的问题。

示例输入:

  

请告诉我如何做到这一点 ......或如何做到正确!等等....

我需要输出:

  
      
  1. 怎么做
  2.   
  3. 如何做对
  4.   

现在我用这个: (?<q>(how to|how match|how many).*)(\s|\.|;|!|\?|( \-)|(\- )|‾|:|…|_|\||@|~|…|–|—|¯|»|•|●|{|}|\(|\)|\\|\]|\[|>|<|→|'|""|`|$)但不起作用

我只需如何问题

3 个答案:

答案 0 :(得分:4)

您尝试完成的任务属于与正则表达式有关的不同类别。

要解决从文本中提取任意问题的问题,您需要的不仅仅是一些好的正则表达式。您应该开始寻找一个好的自然语言处理工具包。也许首先要做一些词性标注。然后,从那里你需要做一些语法和句子解析,然后继续尝试回答这个问题:“这句话是一个问题吗?”通过检查你的NLP管道已经确定的每个句子。

有了这些知识,至少你应该明白你想要完成的任务是相当困难的,虽然并非不可能,但需要进行大量微调以获得良好的性能(通常用Accuracy and Precision metrics来衡量) 。你很可能不会接近100%,但你应该能够通过一个好的PoS标记器和一个好的句子解析器获得不错的结果。

修改

根据您最近编辑的问题,您可以通过RegExs和手写规则获得一些基本的报道,但您仍然无法区分更复杂的案例。对于更通用的解决方案,自然语言处理工具包路由仍然是首选。

不要花太多时间试图提出银弹正则表达式来匹配自然语言。 自然语言不常规 - 所以它不会起作用!使用正则表达式来识别某些关键字是可以的,但除此之外,您最好通过简单的手写规则,并在一个良好的自然语言管道的标记中进行标记..

<强>更新

如果您真的认真对待这项任务,请以sharpnlp.codeplex.com为出发点。如果您不需要使用C#,还有其他NLP工具包,其中NLTK会成为流行的工具包。作为第二步,给自己一本关于NLP的入门书。这个主题非常广泛而且非常酷。我从很多方面学到的一本好书将是:Speech and Language Processing,由Jurafski和Martin。

作为最后的想法,这就是我至少要做的事情:

  1. 执行规范化(删除任何不需要的符号,并重复)
  2. 尝试进行基本句子分割(在标点符号中分割:. , ; ? !
  3. 将所有字母转换为小写
  4. 用标签替换所有号码(即)
  5. 对每个规范化句子执行词性标注
  6. 然后您可以继续尝试确定文本中所有“如何”问题的位置。
  7. 获得位置后,您应该能够将它们映射回原始文本并从那里提取原始的“如何”问题
  8. 祝你好运!

答案 1 :(得分:0)

也许这会有所帮助。它可以检测直接问题,即以问号结尾的句子。

@"[^\.!]*?(?!\?)"

这匹配除了点,问号和感叹号之外的每个字符,直到找到问号为止(注意*量词是贪婪的,而问号是负面的前瞻)

答案 2 :(得分:0)

我不能告诉你如何解析所有问题。这将为您提供一些可以解析的问题,但有些问题会被遗漏。当其他句子不是问题时,可能会选择其他非问题的句子。那可以吗?

([^\.?!]*(?:how|what|where|when|why)[^\.?!]*[\.?!]|[^\.?!]*\?)

在上面的文本中运行它并返回:

我无法告诉你如何来解析所有问题。 其他非问题的句子可能会被选中 时它们不是问题。 是OK * *