2013-03-24 112 views
1

我有點困惑如何確定英文字母標註。在這種情況下,我假定英語中的一個單詞有一種類型,例如單詞「book」被識別爲NOUN,而不是VERB。我想根據時態來識別英語句子。例如,「我發送了這本書」被認爲是過去式。根據數據庫文件確定英文字母標註

說明:

我有一些數據庫(* .txt)文件:NounList.txt,verbList.txt,adjectiveList.txt,adverbList.txt,conjunctionList.txt,prepositionList.txt,art​​icleList.txt 。如果輸入的單詞在數據庫中可用,我假定可以結束這些單詞的類型。但是,如何開始在數據庫中查找?例如,「我發送了這本書」:如何開始在數據庫中搜索每個單詞,「I」作爲名詞,「發送」爲動詞,「the」作爲文章,「book」作爲名詞?比搜索每個數據庫中的每個單詞都更好的方法嗎?我懷疑每個數據庫都有獨特的元素。

我附上我的觀點。

private List<string> ParseInput(String allInput) 
{ 
    List<string> listSentence = new List<string>(); 

    char[] delimiter = ".?!;".ToCharArray(); 
    var sentences = allInput.Split(delimiter, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()); 

    foreach (var s in sentences) 
     listSentence.Add(s); 

     return listSentence; 
} 

private void tenseReviewMenu_Click(object sender, EventArgs e) 
    { 
     string allInput = rtbInput.Text; 

     List<string> listWord = new List<string>(); 
     List<string> listSentence = new List<string>(); 

     HashSet<string> nounList = new HashSet<string>(getDBList("nounList.txt")); 
     HashSet<string> verbList = new HashSet<string>(getDBList("verbList.txt")); 
     HashSet<string> adjectiveList = new HashSet<string>(getDBList("adjectiveList.txt")); 
     HashSet<string> adverbList = new HashSet<string>(getDBList("adverbList.txt")); 

     char[] separator = new char[] { ' ', '\t', '\n', ',' etc... };   

     listSentence = ParseInput(allInput); 

     foreach (string sentence in listSentence) 
     { 
      foreach (string word in sentence.Split(separator)) 
       if (word.Trim() != "") 
        listWord.Add(word);    
     } 

     string testPOS = ""; 

     foreach (string word in listWord) 
     { 
      if (nounList.Contains(word.ToLowerInvariant())) 
       testPOS += "noun "; 
      else if (verbList.Contains(word.ToLowerInvariant())) 
       testPOS += "verb "; 
      else if (adjectiveList.Contains(word.ToLowerInvariant())) 
       testPOS += "adj "; 
      else if (adverbList.Contains(word.ToLowerInvariant())) 
       testPOS += "adv "; 

     } 
     tbTest.Text = testPOS; 
    } 

POS標記是我在作業中的次要解釋。所以我使用一種簡單的方法來確定基於數據庫的POS標籤。但是,如果有一個更簡單的方法:易於使用,易於理解,易於獲得僞代碼,易於設計...來確定POS標籤,請讓我知道。

+0

我不明白這個問題。顯然,許多單詞可能不僅僅是POS(例如,「書」可能是一個動詞,因爲我想預訂一個旅館房間_)。問題是如何處理的?什麼是緊張與這一切有關? 「基於時態來識別句子」是什麼意思?或者你只是在尋找一個POS標記的介紹(在這種情況下,Stackoverflow不會去的地方)? – jogojapan 2013-03-30 08:49:32

回答

1

我希望下面呈現的僞代碼對您有幫助。如果我找到時間,我也會爲你寫一些代碼。

這個問題可以通過下面的步驟來解決:

  1. 創建所有在英語中常用的句型的字典。例如,主題+動詞是英文模式,並且所有句子如I sleep,​​和Ship will arrive匹配S-V模式。你可以找到最常見的英語模式列表here。請注意,有一段時間,您可能需要不斷修改本詞典以提高程序的準確性。

  2. 嘗試,以適應輸入句子在詞典中,你上面創建,例如,如果輸入的句子是Snakes, unlike elephants, are venomous.,那麼你的代碼必須能夠找到與之相匹配的模式的模式之一:Subject,不像AnotherSubject,VerbObjectS-S,與-SO,-VO不同。要成功執行此步驟,您可能需要編寫代碼,該代碼擅長髮現結構標記,像一樣,不像,在此例句中。

  3. 當您在模式字典中爲輸入句子找到匹配項時,可以輕鬆地爲句子中的每個單詞指定一個標籤。例如,在我們的句子,單詞Snakes將被標記爲主題,就像字elephants,字are將被標記爲動詞最後字venomous將被標記爲對象

  4. 一旦您爲您的句子中的每個單詞分配了一個唯一標記,就可以在您已有的適當文本文件中查找單詞並確定您的句子是否有效。

  5. 如果你的句子不匹配任何句型,那麼你有兩個選擇:

    一)收藏此無法識別句子的模式在模式字典,如果它是一個有效的英語句子。 b)或者,丟棄輸入的句子作爲無效的英語句子。

之類的東西你想達到什麼樣的使用機器學習技術,使系統可以學習任何新的模式最好的解決。因此,您可能需要包含一個培訓師系統,只要發現有效的英語句子與任何現有模式不匹配,就會爲模式字典添加新模式。我沒有想太多如何做到這一點,但現在,你可以手動修改你的Sentence Pattern字典。

我很樂意聽到您對這個僞代碼的意見,並可以進一步集思廣益。

+0

這太神奇了@Pankaj Sharma先生.. 前幾天我決定使用OpenNLP來解決這個問題。因爲通過使用暴力解決問題(手動)看起來像業餘學生。我不知道講座讓我使用OpenNLP或不是,但我想嘗試.. 到目前爲止,OpenNLP運行良好,但我在我的任務中面臨新問題,它是句型。在定義POS標記後,我想嘗試分析句型,如最常見的時態,現在,過去時等...... – 2013-04-01 04:47:24

+0

現在,爲了檢查句型,我使用CKY算法(Cocke-Younger-卡薩米)。我必須用喬姆斯基範式(CNF)設計句型。到目前爲止,我很難在CNF中設計它。這裏是英語中最常用的句型,例如: S - > NP VP, NP - > Det N | NAME, PP - > PREP NP, VP - > V | V NP | V NP PP | V PP – 2013-04-01 04:48:16

+0

我很樂意聽取您的意見,並與您進行討論。因爲我是學生。任何建議Sir @Pankaj Sharma爵士? – 2013-04-01 04:49:09