2015-11-05 136 views
3

我需要在C語言中實現一個算法,它使短語匹配/短語識別。具體來說,我有一個循環運行的函數,它輸出通過字符串篩選一個單詞。我把每個輸出字放在一個緩衝區中。 我也有這樣的一組短語的文件:逐字詞組匹配

詞組1:早上好先生[姓氏] [名字]你有[金額] $在您的帳戶。

短語2:成員[姓氏] [名字]選擇了[選項]從列表中。

所以從我的組短語具有已知的形式中,由一個固定部分和一個動態(「[「‘]’之間)組成。關於動態部分,我只知道組成它的單詞的數量。例如,在第2句中,第一個動態部分有2個詞,第二個動態部分有一個詞。

由於我的緩衝區中充滿了來自函數輸出的單詞,因此我需要確定列表中的哪個短語與緩衝區匹配。

我需要一個關於可以使用的算法的建議,如果已經有了這樣的算法,如果沒有,那麼在C中做到這一點的最好方法是什麼?

謝謝。

+0

你嘗試過什麼?你可以發佈一些代碼嗎?這個問題的措辭是有點尷尬,我不是很確定你想達到什麼 – Guillaume

+0

如果我理解正確的話,你的唯一信息是緩衝應該包含匹配短語的單詞數。假設字符是由SPACE分隔的字符串,您可以計算出緩衝區中有多少單詞,並找到相應的短語。或者我誤解了這個問題? – Guillaume

+0

我有一個循環功能。在每次迭代中,一個新的單詞被添加到緩衝區中。單詞由空格分隔。所以我知道每個時刻的緩衝區內容,並且我也知道我正在尋找的列表中的短語。 –

回答

1

我將開始與字符指針的交錯數組這樣

char *phrase1[] = { "Good", "morning", "Mr.", "", "", "you", "have", "", "$", "in", "your", "account.", NULL }; 
char *phrase2[] = { "Member", "", "", "has", "chosen", "", "from", "the", "list.", NULL }; 
char **phrases[] = { phrase1, phrase2, NULL }; 

在每個短語,有

  • 話,必須精確匹配,例如"morning"
  • 空字符串""標誌着動態項
  • NULL指針標誌着短語

的端部當使用該陣列的位置,是phrases[p][i]在短語p第i字,
phrases[p][i][0]是詞組p中第i個詞的第一個字符。

因此,爲了檢查是否有動態項的代碼是

if (phrases[p][i][0] == '\0') 
    // this is a dynamic item 

要檢查短語的端

if (phrases[p][i] == NULL) 
    // this is the end of the phrase 

否則,比較字

if (strcmp(phrases[p][i], word) == 0) 
    // the word matches 
+0

謝謝,我明白了,從這一點應該沒問題。非常感謝! –

+0

@LucianGeorgescu不客氣,與代碼祝你好運! – user3386109

0

假設遺漏的單詞遵循已知的regex模式,例如[\w\d]+,你可以在下面的表格創建正則表達式:

^(Good morning Mr. [\w\d]+ [\w\d]+ you have [\w\d]+ \$ in your account.) 
|(Member [\w\d]+ [\w\d]+ has chosen [\w\d]+ from the list.) 
|(...)$ 

然後匹配與輸入這個表達式會告訴你哪些子表達式匹配,子表達式的指標是匹配的索引短語。

這正是flex內部做。因此,另一種可能性是寫你的匹配短語正則表達式的flex文件,並要求柔性爲您生成的匹配。