2012-06-29 26 views
5

Bu kişisel C++ projem var ve şu anda takılıyorum. Pek çok insanın bu konuyla ilgili sorular sorduğu ve tekrarlanan bir soru ise şimdi özür dilemek istediği anlaşılıyor.C++ sohbet sıralaması tabanlı cevaplama?

Her neyse, bu proje kullanıcı girdisini temel alarak yanıtlayacak bir sohbet botudur. Şu anda olduğu gibi, tüm sorguyu alır ve if ifadelerinin uzun, verimsiz satırlarını kullanarak bir eşleşme arar. Bir eşleşme bulursa, belirli bir cevap ile cevap verecektir.

Buraya gelmemin sebebi, aynı sorunun tüm varyasyonlarını bile yakalamayan çok zaman alıcı ve verimsiz if ifadeleri yazmaktan bıktım. Vikipedi'den veri alan ya da böyle bir şey alan kod veya çözümler aramıyorum. İstediğim şey, sohbet botunun sadece bazı basit soruları yanıtlamasıdır.

Zamanlarımda if ifadeleriyle uğraşırken, bir fikir buldum. Neden arama motoru gibi web sayfalarını sıralarken anahtar kelimeleri kullanmıyorum?

Sorguda bir anahtar kelimenin (veya birkaç farklı seçeneğin) kaç kez sayılacağını yazmak için kod yazdım. Sorun, en iyi cevabı bulmak için onları sıralamaktan nasıl geçilir? Cevapların ve anahtar kelimelerin özel bir şekilde saklanması gerekeceğini varsayardım.

benim ana sorunun cevaplarından listem şu ana kadar şunlardır:

bir sorgu alınır

1., bu anahtarında anahtar kelime (ler) olan bir ini dosyası yoluyla rütbe ve bunun değeri olarak cevap verin. Birden fazla cevap varsa, başka bir anahtar kelime seçin ve bunun yanı sıra orijinali de (kapsamı azaltarak) arayın. Bu yeterli zamanı yapmak doğru cevabı vermelidir.

Artıları: Yapmam gerekeni yerine getiriyor ve C++'da kavrayabildiğim bir şey.

Eksileri: neredeyse yine eğer ifadeleri içine dalma gibi, uzun ve verimsiz görünüyor ...

2. SQL veritabanını kullanarak, yürürlükteki cevap bulmak için bunu söylemek. Bunun nasıl yapılacağından emin değilim.

Artıları: Veritabanı bilgisayarı arama işlemek ve oldukça ayrıntılı olabilir, hafif olurdu.

Cons: C++ ile oldukça yüksek suları treading ettiğim için benim için oldukça acıya neden olabilir. Bununla birlikte, sanırım bunun ifadeler gibi gerçekleşeceğini düşünmeye başladım.

3. Birisinin burada önerebileceği en iyi cevap AIML'dir ( discussed here).

Artılar: Akıllı sohbet botları geliştirmek için kullanılır ve oldukça güçlüdür.

Eksiler: Basit projem için çok "ağır" görünüyor ve AIML alan bir bot için kolay anlaşılır bir kod bulmayı sağlayan bir aramayı bozamam.

Umarım birileri gerçekten C++ hayranı olmadığım için aldığım akıllıca bir rota önerebilir ve bu projeyle zaten derin bir su akıtıyormuş gibi hissediyorum. Ancak bu yaz için dilimi ısırmak, konfor bölgemden çıkmak ve bir zamanlar C++ 'da yararlı bir şeyler yapmak gibi hissettim. Bunu PHP'de hızlı bir şekilde yapabilirdim, ancak mesajları göndermek için C++ kullanmalıyım.

+0

Eğer php ile yapmış olsaydınız, C++ 'da bunu yapmanın sizi durduran şey nedir? Ayrıca, akıllı görünmesini istiyorsanız, muhtemelen anahtar kelime sıralamasından daha çok içeriğe odaklanmalısınız. – gcochard

+1

En azından bir şekilde "akıllı" yapay zeka yapmak söz konusu olduğunda, çok fazla iş olacak. Yasanın ilk aşaması kabul edilir. –

+0

Bağlam basit bir şey olurdu, şimdiden düşündüm. Doğru ya da en iyi cevabı nasıl bulabiliriz. Alex'in ortaya çıkardığı gibi, herhangi bir yapay zekanın yapılmasının kolay olmayacağından korkuyorum. C++ 'da en iyi ben değilim, ama aynı zamanda emeklemiyorum. Ben C++ için alışkın değilim ve hala bazı kavramlar etrafında kafamı sarar. –

cevap

0

Bir süre önce bir IRC botuna benzer bir şey yaptım ve bunun için AIML kullandım. Bir cümle içinde bir anahtar kelimenin gerçekleştiği süreyi saymak çok doğru bir yol gibi görünmüyor. AIML kullanarak muhtemelen gitmek için yoldur. Eğer AIML kullandıysanız, C++ kodu yazarak çok fazla uğraşmanıza gerek kalmayacaktır, çünkü gerçek "beyin" (AÇILABİLECEĞİ gibi) AIML'de yazılmıştır. Sonra

#include <aiml.h> 
// ... 
using namespace aiml; 

// setup Ai bot: 
cInterpreter* interpreter = cInterpreter::newInterpreter(); 

try { 
    if(!interpreter->initialize("libaiml.xml")) 
     throw 1; 
} catch(int _ret) { 
    cout << "ERROR: " << interpreter->getErrorStr(interpreter->getError()) 
     << " (" << interpreter->getError() << ")" << endl; 
    if(!interpreter->getRuntimeErrorStr().empty()) 
     cout << "Runtime Error: " << interpreter->getRuntimeErrorStr() << endl; 
} 

I: I (Ben bu büyük bir kısmı için örnek geldiğini düşünüyoruz) koddan küçük özü libaiml.xml (sizin bot için AIML kodunu içeren dosyayı) yüklemek için yazdım Bir yanıt almak için interpreter->respond(message, "name", result); kullanılır. Ben libaiml ile bağlı (libxml2 ihtiyacı), http://www.alicebot.org/downloads/programs.html.(scroll C++ 'da bulunabilir, orada libaiml bulunmalıdır; std_utils'i de yüklemeniz gerektiğini unutmayın). Kodumun artık kitaplıktaki güncellemeler nedeniyle çalışmadığı, bilmiyorum. Neyse ki, libaiml de benim için çok yararlı olan güzel bir örnek içeriyor. Örneğin, XML formatının kendisi hakkında oldukça fazla dokümantasyon bulabilmeniz gerekir, örn. http://www.alicebot.org/TR/2011/. Yukarıda bahsettiğim örneğe (libaiml ile birlikte) da bakmanızı tavsiye ederim.

Size iyi şanslar diliyorum!