2011-11-29 44 views
5

Tôi đang phát triển một người quản lý tài chính trong thời gian rảnh với Java và Swing GUI. Khi người dùng thêm mục nhập mới, anh ta được nhắc điền: Tiền thưởng, Ngày, Nhận xét và Mục (ví dụ: Ô tô, Lương, Máy tính, Thực phẩm, ...)Phân tích và phân loại chuỗi

Các phần được tạo "nhanh". Khi người dùng nhập một phần mới, nó sẽ được thêm vào phần-jcombobox để lựa chọn thêm. Điểm khác là, các bình luận có thể bằng các ngôn ngữ khác nhau. Vì vậy, danh sách các từ cứng và từ đồng nghĩa sẽ rất lớn.

Vì vậy, câu hỏi của tôi là, có thể phân tích nhận xét (ví dụ: "Nhiên liệu", "Dịch vụ ô tô", "Ăn trưa tại **") và chọn một phần phù hợp. Suy nghĩ đầu tiên của tôi là làm điều đó với một mạng nơron và học từ đầu vào, nếu người dùng chọn một phần khác.

Nhưng vấn đề của tôi là, tôi không biết bắt đầu như thế nào. Tôi đã thử "encog" với Eclipse và đã làm một số hướng dẫn (XOR, ...). Nhưng tất cả chúng chỉ sử dụng đôi như trong/đầu ra.

Bất cứ ai cũng có thể cho tôi gợi ý cách bắt đầu hoặc bất kỳ giải pháp khả thi nào khác cho điều này?

Here là một JAR runable (nhà nước phát triển hiện nay, đòi hỏi Java7) và Sourceforge Page

+0

+1 Câu hỏi hay. – gprathour

Trả lời

1

Quên về mạng thần kinh. Đây là lĩnh vực kỹ thuật và chuyên môn cao về trí thông minh nhân tạo, có lẽ không phù hợp với vấn đề của bạn và đòi hỏi chuyên môn vững chắc. Bên cạnh đó, có rất nhiều giải pháp đơn giản và tốt hơn cho vấn đề của bạn.

Giải pháp rõ ràng đầu tiên, xây dựng danh sách các từ và từ đồng nghĩa cho tất cả các phần của bạn và phân tích cú pháp cho các từ đồng nghĩa này. Sau đó, bạn có thể thu thập nhận xét trực tuyến để phân tích từ đồng nghĩa hoặc sử dụng phân tích nhận xét/phần được cung cấp bởi người dùng để phát hiện mối quan hệ giữa các từ, v.v ... một cách thống kê

Có một số lượng vô hạn các giải pháp khả thi, từ đơn giản đến mức tối đa nhất. Bây giờ bạn cần phải xác định nếu tính năng này của hệ thống của bạn là rất quan trọng (prefilling? Có lẽ không, sau đó) ... và những gì bất kỳ nỗ lực phát triển sẽ mang lại cho bạn. Một giờ làm việc có thể mang lại cho bạn một tính năng đáp ứng 80%, trong khi nhắm tới 90% sẽ tốn một tuần làm việc. nó thật sự đáng giá thế sao?

Đi cho giải pháp đơn giản nhất và giải quyết thử thách thực sự của bất kỳ dự án dev nào: phân phối. Sau khi ứng dụng của bạn được phân phối, bạn luôn có thể quay lại và cải thiện khi cần.

+0

Tôi nghĩ danh sách từ sẽ quá lớn, do việc tạo phần động và có thể Đối với một sự hiểu biết tốt hơn có liên kết trong bài đầu tiên. (JAR + Nguồn) –

+0

Với các máy móc hiện đại của chúng tôi, tôi sẽ nói không có thứ gì như một danh sách từ quá lớn ... Ngay cả một từ điển các từ đồng nghĩa có thể dễ dàng phù hợp với trí nhớ. – solendil

+0

Có thể lưu trữ tất cả các từ được sử dụng trong các bình luận ngoại trừ các từ bị chặn (trong, và,, ...) trong DB và sau đó gán phần được chọn cho nó và khi người dùng thêm nhận xét, hãy đi qua (BIG DB) và chọn phần theo mục nhập cho các từ? Tôi nghĩ hiệu suất sẽ khá thấp, do lượng lớn dữ liệu. –

0
String myString = new String(paramInput); 

if(myString.contains("FUEL")){ 
//do the fuel functionality 
} 
+0

Xem nhận xét tại câu trả lời của GP Singh –

0

Trong một ứng dụng đơn giản, nếu bạn sẽ chỉ có một số phần cụ thể trong ứng dụng của bạn sau đó bạn có thể nhận được chuỗi từ nhận xét và kiểm tra xem nó có chứa một số từ khóa từ khóa và sau đó theo nó thay đổi giá trị của Mục.

+0

Cảm ơn mọi câu trả lời của bạn. Nhưng vấn đề là, các phần được tạo ra "trên bay". Khi người dùng nhập một phần mới, nó sẽ được thêm vào phần-jcombobox để lựa chọn thêm. Vì vậy, nó không phải là dễ dàng: (Điều khác là, các ý kiến ​​có thể bằng các ngôn ngữ khác nhau. –

0

Nếu bạn có nhiều danh mục, tôi sẽ sử dụng một cái gì đó như Apache Lucene, nơi bạn có thể lập chỉ mục tất cả các danh mục với tên và cụm từ/từ khóa tiềm năng có thể xuất hiện trong mô tả người dùng. Sau đó, bạn có thể chỉ cần chạy mô tả thông qua Lucene và sử dụng danh mục được so khớp hàng đầu dưới dạng "phỏng đoán tốt nhất".

P.S. Các đầu vào và đầu ra của mạng thần kinh sẽ luôn luôn là đôi hoặc nổi với giá trị từ 0 đến 1. Đối với cách thực hiện khớp String, tôi thậm chí không biết bắt đầu từ đâu.

+0

Xem nhận xét tại câu trả lời của GP Singh –

0

Dường như với tôi rằng sau đây sẽ làm:

  • thống kê từ cứng
  • có thể là một lớp bắt nguồn (Tiếng Anh/Tây Ban Nha) làm giảm một từ như "ăn trưa" để "ăn trưa".
  • danh sách thường xuyên nhất không lời (, tại, một, cho, ...)

Các phù hợp nhất là một vấn đề tuyến tính, phù hợp để lý thuyết cho một mạng lưới thần kinh, nhưng tại sao không mất ngay lập tức phù hợp với số tốt nhất.

0

Thuật toán học máy như mạng nơron nhân tạo dường như không phải là giải pháp tốt nhất ở đây. ANN có thể được sử dụng để phân loại nhiều lớp (tức là 'các lớp được đào tạo trước được cung cấp nào làm đầu vào đại diện cho' không chỉ 'đầu vào đại diện cho X?') Phù hợp với trường hợp sử dụng của bạn. Vấn đề là chúng được giám sát các phương pháp học tập và vì vậy bạn cần phải cung cấp một danh sách các cặp từ khóa và các lớp (Phần) kéo dài mọi đầu vào có thể mà người dùng của bạn sẽ cung cấp. Điều này là không thể và trong thực tế, các ANN được đào tạo lại khi có nhiều dữ liệu hơn để tạo ra kết quả tốt hơn và tạo ranh giới/biểu diễn quyết định chính xác hơn về chức năng ánh xạ đầu vào cho đầu ra. Điều này cũng giả định rằng bạn biết tất cả các lớp có thể trước khi bạn bắt đầu và mỗi lớp đó có các giá trị đầu vào đào tạo mà bạn cung cấp.

Vấn đề là đầu vào cho ANN của bạn (danh sách ký tự hoặc băm số của chuỗi) không cung cấp ngữ cảnh để phân loại. Không có thông tin cấp cao hơn được cung cấp để mô tả ý nghĩa của từ đó. Điều này có nghĩa là một từ khác nhau có giá trị gần bằng số có thể bị phân loại sai nếu không có đủ dữ liệu đào tạo.

(Như maclema nói, đầu ra từ một ANN sẽ luôn nổi với mỗi giá trị đại diện cho sự gần gũi với một lớp -. Hoặc một lớp học với một mức độ không chắc chắn)

Một giải pháp tốt hơn là nên sử dụng một số loại của quan hệ từ hoặc biểu đồ đồng nghĩa. A Bag of words model có thể hữu ích ở đây.

Chỉnh sửa: Theo nhận xét của bạn rằng bạn không biết Phần trước, giải pháp dễ dàng cho chương trình sẽ là cung cấp danh sách từ khóa trong tệp được cập nhật khi mọi người sử dụng chương trình. Chỉ cần lưu trữ ánh xạ các nhận xét được cung cấp -> Các phần mà bạn đã có trong cơ sở dữ liệu của mình, sẽ cho phép bạn lọc ra các từ khóa không (và, hoặc,, ...). Một tùy chọn là sau đó tìm danh sách của từng Phần mà từ khóa đã nhập thuộc về và đề xuất nhiều Phần và cho phép người dùng chọn một. Phản hồi mà bạn nhận được từ các lựa chọn của người dùng sẽ cho phép cải thiện các đề xuất trong tương lai. Một cách khác là tính số Bayesian probability - xác suất mà từ này thuộc về Phần X cho các ánh xạ được lưu trước đó - cho tất cả các từ khóa và Phần và lấy phần Phương thức hoặc chuẩn hóa trên mỗi từ khóa duy nhất và lấy giá trị trung bình. Tính toán xác suất sẽ cần phải được cập nhật khi bạn thu thập thêm thông tin ofcourse, có lẽ điều này có thể được thực hiện với mỗi bổ sung mới trong một chủ đề nền.