2015-02-09 81 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