2016-12-05 30 views
0

你好我想單詞列表上讀取標籤,列表中有一個像(TMConnects(MEN)什麼(WP)發生(VB)字(TO)你(ADV)我(ADV)tm(N)網站(N)i(N)can(ADV)access(N)to(TO)view(N)my(ADV)bills(N))我試圖使用if語句和正則表達式閱讀每個標籤,以便我可以適當地對這些詞進行分類。如果用不同的正則表達式語句參數

這裏是我試過

foreach (string word in tokensList) 
     { 
      //Verbs 
      Match match_verb = Regex.Match(word, @"[a-zA-Z]+\(vb\)"); 
      if (match_verb.Success) 
      { 
       Console.WriteLine(word + "v"); 
       Verbs.Add(word); 
      } 
      else 
      { 
       //Nouns 
       Match match_noun = Regex.Match(word, @"[a-zA-Z]+\(n\)"); 
       if (match_noun.Success) 
       { 
        Console.WriteLine(word + "n"); 
        Nouns.Add(word); 
       } 
       else 
       { 
        //Adverb(Ad) 
        Match match_adverb = Regex.Match(word, @"[a-zA-Z]+\(adv\)"); 
        if (match_adverb.Success) 
        { 
         Console.WriteLine(word + "adv"); 
         Adverbs.Add(word); 
        } 
        else 
        { 
         //Adjective(Adj) 
         Match match_adj = Regex.Match(word, @"[a-zA-Z]+\(adj\)"); 
         if (match_adj.Success) 
         { 
          Console.WriteLine(word + "adj"); 
          Adjectives.Add(word); 
         } 
         else 
         { 
          //Mention(Men) 
          Match match_men = Regex.Match(word, @"[a-zA-Z]+\(men\)"); 
          if (match_men.Success) 
          { 
           Console.WriteLine(word + "men"); 
           Mentions.Add(word); 
          } 
          else 
          { 
           //Object(KNK) 
           Match match_obj = Regex.Match(word, @"[a-zA-Z]+\(knk\)"); 
           if (match_obj.Success) 
           { 
            Console.WriteLine(word + "obj"); 
            Objects.Add(word); 
           } 
           else 
           { 
            //Features(KT) 
            Match match_feature = Regex.Match(word, @"[a-zA-Z]+\(kt\)"); 
            if (match_feature.Success) 
            { 
             Console.WriteLine(word + "ft"); 
             Features.Add(word); 
            } 
            else 
            { 
             //break; 
            } 
           } 
          } 
         } 
        } 
       } 

請幫助我的代碼。

+0

你期待什麼幫助?我可以建議的一點是,輸入「word」一次只能屬於一個類別,但不能超過一個。因此,你可以使用'if-else'循環來代替嵌套的'if-else'循環, –

+1

幫助你做什麼?你沒有告訴我們什麼不工作。大寫的標籤,就像你的例子一樣?正則表達式默認是區分大小寫的(沒有'RegexOptions.IgnoreCase')。似乎有一個單一的正則表達式提取單詞和標籤,並打開標籤,或者可能有一個標籤作爲關鍵字和列表作爲值的字典會更清晰? – Mark

+0

我正在嘗試閱讀單詞上的標籤,然後再對單詞進行分類,但問題似乎有些if語句被忽略。 (例如我上面給出的單詞列表應該已經找到它們並打印出來,但它只能找到(我的(adv)adv 網站(n) can(adv) 我的(副) – Blavejr21

回答

0

如果我是小寫所有從你提供的列表中括號內的文字,我得到的所有正確的結果返回。所以,我要承擔的問題是Mark suggested:你有你的正則表達式是大小寫敏感的,並修復所有你需要做的就是提供RegexOptions.IgnoreCase選項的問題。

因此,而不是Regex.Match(word, @"[a-zA-Z]+\(vb\)") 它會是這樣的Regex.Match(word, @"[a-z]+\(vb\)", RegexOptions.IgnoreCase)

然而,在一次標誌的建議,你是最有可能在多數民衆贊成照顧太多具體的解決方案的方式接近問題。也就是說,不是每個條件都有一個if-else語句(每次嘗試執行正則表達式匹配),您可以使用更通用的正則表達式執行單個匹配,並利用.NET提供的工具來創建一個更靈活的方案。

foreach (var match in 
     tokensList.Select(
      word => 
       // Two capturing groups: "word" (unnecessary in your case) and "type", 
       // where "word" contains the word only (e.g. TMConnects) and "type" contains the type only (e.g. MEN). 
       Regex.Match(
        word, 
        // Match any letters appearing one or more times followed by an opening bracket ('('), anything that 
        // isn't a closing bracket and a closing bracket (')'). 
        @"^(?<word>[a-z]+)\((?<type>[^\)]+)\)$", 
        // Tell the regular expression engine to ignore the casing. 
        RegexOptions.IgnoreCase)) 
        // Filter out words that don't match the regular expression. 
        .Where(match => match.Success)) 
    { 
     // The whole word (including the type. 
     var word = match.Value; 
     // The type lower-cased, for convenience. 
     var type = match.Groups["type"].Value.ToLowerInvariant(); 
     switch (type) 
     { 
      case "vb": 
       Console.WriteLine(word + "v"); 
       Verbs.Add(word); 
       break; 
      case "n": 
       Console.WriteLine(word + "n"); 
       Nouns.Add(word); 
       break; 
      case "adv": 
       Console.WriteLine(word + "adv"); 
       Adverbs.Add(word); 
       break; 
      case "adj": 
       Console.WriteLine(word + "adj"); 
       Adjectives.Add(word); 
       break; 
      case "men": 
       Console.WriteLine(word + "men"); 
       Mentions.Add(word); 
       break; 
      case "knk": 
       Console.WriteLine(word + "obj"); 
       Objects.Add(word); 
       break; 
      case "kt": 
       Console.WriteLine(word + "ft"); 
       Features.Add(word); 
       break; 
     } 
    } 
+0

謝謝@eitamal但問題仍然存在,有些詞完全被忽略,例如單詞tm(N)網站(N)我(N)訪問(N)查看(N)票據(N)都是名詞,因此應該添加到名詞列表,但當我在列表中打印出來時,它只包含網站這個詞,我不明白爲什麼它跳過所有其他詞,循環應該貫穿所有這些詞。 – Blavejr21

+0

你可以看看這裏: https://dotnetfiddle.net/OHMCxl] – eitamal

+0

,看看您是否能明確指出您遇到的問題。我的猜測是,令牌列表比我使用的是一個有點不同。 – eitamal