2012-06-29 40 views
5

Tôi có dự án C++ cá nhân này của tôi và hiện tôi đang bị kẹt. Có vẻ như rất nhiều người đã đặt câu hỏi về chủ đề này và tôi muốn xin lỗi nếu đó là câu hỏi lặp lại.C++ chat bot xếp hạng dựa trên trả lời?

Dù sao, dự án này là bot trò chuyện sẽ trả lời dựa trên dữ liệu nhập của người dùng. Hiện tại là vì nó là viết tắt của nó, nó lấy toàn bộ truy vấn và tìm kiếm một kết quả phù hợp sử dụng các dòng dài, không hiệu quả của các câu lệnh if. Nếu nó tìm thấy một trận đấu, nó sẽ trả lời với một câu trả lời nhất định.

Lý do tại sao tôi đến đây là vì tôi bị bệnh và mệt mỏi khi viết các câu lệnh rất tốn thời gian và không hiệu quả với các câu hỏi if thậm chí không bắt được tất cả các biến thể của cùng một câu hỏi. Tôi không tìm kiếm mã hoặc giải pháp lấy dữ liệu từ Wikipedia hoặc một cái gì đó như thế. Những gì tôi muốn là cho bot trò chuyện để chỉ trả lời một số câu hỏi đơn giản.

Trong thời gian tôi bị vứt bỏ với các câu lệnh if, tôi nảy ra ý tưởng. Tại sao tôi không sử dụng các từ khóa giống như một công cụ tìm kiếm xếp hạng các trang web?

Tôi đã viết mã cho đến nay để đếm số lần một từ khóa (hoặc một vài từ khóa khác nhau) tồn tại trong truy vấn. Vấn đề là làm thế nào để đi về xếp hạng chúng để tìm câu trả lời tốt nhất? Tôi sẽ cho rằng các câu trả lời và từ khóa sẽ cần phải được lưu trữ một cách đặc biệt.

danh sách của tôi về câu trả lời cho câu hỏi chính của tôi cho đến nay là:

1. Khi một truy vấn được nhận, xếp hạng nó thông qua một tập tin này, nơi nó có từ khóa (s) trong khóa, và trả lời như giá trị của nó. Nếu có nhiều câu trả lời, hãy thực hiện một từ khóa khác và tìm kiếm từ khóa đó cũng như từ khóa gốc (giảm phạm vi). Làm điều này đủ thời gian sẽ mang lại câu trả lời đúng.

Ưu điểm: Phù hợp với những gì tôi cần làm và đó là điều tôi có thể nắm bắt trong C++.

Nhược điểm: vẻ dài và không hiệu quả, gần như lặn vào nếu báo cáo một lần nữa ...

2. Sử dụng một cơ sở dữ liệu SQL, nói với nó để tìm ra câu trả lời thích hợp. Tuy nhiên, bạn không chắc chắn về cách thực hiện điều đó.

Ưu điểm: Nó sẽ có trọng lượng nhẹ, vì máy tính cơ sở dữ liệu sẽ xử lý tìm kiếm và có thể khá chi tiết.

Nhược điểm: Có thể gây ra một chút đau đớn đối với tôi vì tôi đã treading nước khá cao với C++. Tuy nhiên, tôi bắt đầu nghĩ rằng nó sẽ kết thúc giống như các câu lệnh if.

3. Câu trả lời hay nhất mà ai đó có thể đề xuất ở đây là AIML (là discussed here).

Ưu điểm: Được sử dụng để phát triển chương trình trò chuyện thông minh và khá mạnh mẽ.

Nhược điểm: Có vẻ quá "nặng" đối với dự án đơn giản của tôi và tôi không thể tìm ra một mã tìm hiểu dễ dàng cho một bot lấy AIML.

Tôi hy vọng một người nào đó có thể đề xuất một tuyến đường thông minh để thực hiện vì tôi không thực sự là người hâm mộ của C++ và tôi cảm thấy như tôi đã giẫm nước sâu với dự án này. Tuy nhiên vào mùa hè này, tôi cảm thấy như cắn lưỡi, đi ra khỏi vùng thoải mái của mình và một khi đã làm một cái gì đó hữu ích trong C++. Tôi có thể làm điều này một cách nhanh chóng trong PHP, nhưng để gửi tin nhắn, tôi phải sử dụng C++.

+0

Nếu bạn có thể thực hiện nó trong php, điều gì khiến bạn không thể làm điều đó trong C++? Ngoài ra, bạn có lẽ nên tập trung nhiều hơn vào ngữ cảnh hơn xếp hạng từ khóa nếu bạn muốn nó xuất hiện thông minh. – gcochard

+1

Khi nói đến việc tạo ra trí tuệ nhân tạo ít nhất là "thông minh", sẽ có rất nhiều công việc liên quan. Giai đoạn đầu của đau buồn là sự chấp nhận. –

+0

Bối cảnh sẽ là một cái gì đó đơn giản, tôi đã nghĩ nó qua. Nó chỉ là làm thế nào để tìm câu trả lời chính xác hoặc tốt nhất. Khi Alex lớn lên, tôi sợ rằng bất kỳ loại trí thông minh nhân tạo nào cũng không dễ dàng làm được. Tôi không giỏi nhất ở C++, nhưng đồng thời tôi cũng không thu thập thông tin. Tôi không được sử dụng để C + + và tôi vẫn gói đầu của tôi xung quanh một số khái niệm. –

Trả lời

0

Tôi đã làm điều gì đó tương tự với bot IRC một thời gian trước đây và tôi đã sử dụng AIML cho việc này. Đếm số lần từ khóa xuất hiện trong câu không có vẻ là một cách rất chính xác. Sử dụng AIML có lẽ là cách để đi. Nếu bạn đã sử dụng AIML, bạn sẽ không phải bận tâm nhiều với việc viết mã C++, vì "bộ não" thực tế (như nó có thể được gọi) được viết trong AIML. Một chiết xuất nhỏ từ mã mà tôi (tôi cũng nghĩ rằng nó đến từ các ví dụ cho một bộ phận lớn) đã viết để tải libaiml.xml (tập tin chứa mã AIML cho bot của bạn):

#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; 
} 

tôi sau đó đã sử dụng interpreter->respond(message, "name", result); để nhận phản hồi. Tôi liên kết với libaiml (nhu cầu libxml2), có thể được tìm thấy tại http://www.alicebot.org/downloads/programs.html.(scroll xuống đến C++, bạn nên tìm libaiml ở đó; chú ý rằng bạn cũng phải cài đặt std_utils). Có thể mã của tôi không còn hoạt động vì các bản cập nhật trong thư viện, tôi không biết. May mắn thay, libaiml cũng chứa một ví dụ tốt đẹp rất hữu ích vào thời điểm đó đối với tôi.

Bạn sẽ có thể tìm thấy khá nhiều tài liệu về chính định dạng XML, ví dụ: http://www.alicebot.org/TR/2011/. Tôi khuyên bạn hãy xem ví dụ tôi đã đề cập ở trên (kèm theo libaiml).

Chúc các bạn may mắn!