2015-08-14 38 views
1

我有點建立一個電報機器人人工智能,目前我正在嘗試處理文本並對用戶作出響應,就像人類一樣。在使用javascript日常聊天中的字符串邏輯

例如;

「我要註冊」

據我們瞭解用戶希望註冊人。

所以我想處理使用javascript的indexOf尋找希望,且該文本寄存器

var user_text = message.text; 
if (user_text.indexOf('want') >= 0) { 
    if (user_text.indexOf('register') >= 0) { 
     console.log('He wants to register?') 
    } 
} 

但是,如果文本包含某個字符串中?當然,我會爲數十億個案例提供數十個條件。編寫這種邏輯會很累人。

我的問題是 - 有沒有其他優雅的方式來做到這一點?我真的不知道關鍵字谷歌這...

回答

2

您正在尋找的概念是natural language processing,是一個非常廣泛的領域。完整的NLP非常複雜且複雜,涉及各種問題。

我建議先從一個更簡單的解決方案開始,將您的輸入分解爲單詞。你可以使用String.prototype.split method做一些調整。過濾掉你不關心的令牌,不要對命令做出貢獻,比如「the」,「a」,「an」。拿其餘的標記,尋找否定(「不」,「不」)和關鍵字。如果您有一些雙字命令,則可能需要組合相鄰的令牌。

這可能看起來像:

var user_text = message.text; 
var tokens = user_text.split(' '); // split on spaces, very simple "word boundary" 
tokens = tokens.map(function (token) { 
    return token.toLowerCase(); 
}); 

var remove = ['the', 'a', 'an']; 
tokens = tokens.filter(function (token) { 
    return remove.indexOf(token) === -1; // if remove array does *not* contain token 
}); 

if (tokens.indexOf('register') !== -1) { 
    // User wants to register 
} else if (tokens.indexOf('enable') !== -1) { 
    if (tokens.indexOf('not') !== -1) { 
    // User does not want to enable 
    } else { 
    // User does want to enable 
    } 
} 

這不是一個完整的解決方案:你最終要運行通過一個真實的標記生成器和串甚至可能a full parser,並且可能需要使用a rule engine簡化邏輯。

如果您可以限制需要了解的輸入(數量有限的句子形式和名詞/動詞),那麼您可以使用一個簡單的解析器和幾條規則來處理大多數命令。強制一個可預測的句子結構與刪除的文章將使您的生活更容易

你也可以拿上面的例子,用白名單替換過濾器(只包括已知的單詞)。這會給你帶來一小部分已知的標記,但是會引入剝去有用單詞和誤解命令的可能性,所以你應該在運行任何東西之前與用戶確認。

+0

這是一個很好的方向。我喜歡! – rolodex

+0

我也有興趣在這樣的Siri,柯塔娜和谷歌確認並瞭解我們的命令。就像你所說的那樣,我將在命令中向用戶確認,並記錄文本以讓我的程序在下次學習該指令。我會從小開始。再次 感謝您的見解。有價值! – rolodex

1

如果你真的想分析和理解以自然語言表達的句子,你應該看看natural language processing的主題。這通常是通過訓練某種神經網絡來「理解」句子的不同變體(又稱機器學習)來完成的,因爲指定語言的所有不同語法和語義規則似乎是一項艱鉅的任務。

然而,如果這些句子的變化量是有限的,那麼你可以在常用的單詞組合的形式指定一些規則,甚至可能正則表達式會做最簡單的情況。