2015-02-09 42 views
1

以下句子映射正则表达式匹配到原始的字符串

我有一辆红色轿车

可以转化为这个字符串

代词动词限定词形容词名词

我想要的是找到部分原件句子是名词短语(NP)。一个NP的简单模式是(定义)*(形容词)*(名词)(其中*表示该组可能出现零次或多次)。实际正则表达式是:

public static string Regex = "((?:Determiner.?)*(?:Adjective.?)*(?:Noun.?))"; 

使用下面的代码就可以提取所有的NP:

 MatchCollection NPmatches = Regex.Matches(structure, NounPhrase.Regex); 
     foreach(Match match in NPmatches) 
     { 
      foreach (Capture NPcapture in match.Captures) 
      { 
       Console.WriteLine(NPcapture.Value.ToString()); 
      } 
     } 

输出将是:

限定词形容词名词

什么我真的需要的是对应于该结构的原始句子的部分( NP),在这种情况下,这将是

一辆红色轿车

我可以找出某种方式在正则表达式匹配的位置,并计算从那里字数,但它是混乱和错误俯卧。如果可以使用一些LINQ表达式与正则表达式结合起来,那将是非常好的,以便保持转换的来源。任何虽然?

PS。一个句子使用此代码

RawSentence.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Select(i=>i.Type.ToString()).Aggregate((x,y) => x + " " + y); 
+0

不能说我明白你在问什么。 match * does *返回原始语句的匹配部分。如果您使用命名组,您甚至可以按名称引用组。 – 2015-02-09 11:13:36

+0

这里的问题是我想要我的原始句子的相应部分。我正在执行的正则表达式操作的字符串是* not *原始字符串,它是一个转换后的字符串。在这种情况下,我原来的句子是“我有一辆红色的车”。对于这种分析,我需要将其转换为以下字符串:“代词动词Determiner形容词名词”。当我找到我的名词短语时,我没有一个清楚的方式来知道我原来的句子的哪一部分对应于它(“一辆红色的汽车”)。 – Sturm 2015-02-09 11:17:12

+0

没有时间详细说明,但想知道我会做什么:您可以使用第二个正则表达式,将用空格分隔的未变换句子的每个单词分组,然后使用捕获变换句子的匹配组,而不是那些不捕获的“(?:determineiner。?)”,然后在第二个正则表达式中使用你现有的匹配组。 – 2015-02-09 11:23:06

回答

1

我想你会需要的不仅仅是一个映射更从原句的话“的代名词”,“动词”,“限定词”,“形容词”转变为类型,并“名词”。你确实指出某些词类(即你的确定者,形容词和名词)可能会出现零次或多次。如果它们不止一次出现,那么即使您确实有从原始语句到您的词类的映射,您也无法回到原始文本,因为您会有一对多关系。你需要标记你的判定者,形容词和名词,如determininer1,determininer2,adjective1,noun1,noun2,noun3等等。一旦你有了独特的映射,你就可以轻松地往任何一个方向走。

+0

谢谢!实际上,我最终以类似的方式做到了:变换后的句子是'0Pronoun 1Verb 2Determiner 3Adjective 4Noun' Extracted NP:'2Determiner 3Adjective 4Noun''。从这个最后一个字符串中提取数字给出了原文中的单词索引:2-3-4 - >'一辆红色的汽车'。 – Sturm 2015-02-10 07:27:42

相关问题