2013-03-07 30 views
5

Sử dụng mahout Tôi có thể phân loại tình cảm của dữ liệu. Nhưng tôi bị mắc kẹt với một ma trận nhầm lẫn.Mahout để phân tích tình cảm

Tôi đang sử dụng mahout 0.7 thuật toán bay ngây thơ để phân loại tình cảm của tweet. Tôi sử dụng trainnbtestnb phân loại vịnh ngây thơ để đào tạo trình phân loại và phân loại tình cảm của các tweet là 'dương', 'âm' hoặc 'trung tính'.

Mẫu đào tạo tích cực thiết lập

 'positive','i love my i phone' 
     'positive' , it's pleasure to have i phone' 

mẫu huấn luyện Tương tự như vậy tôi đã chuẩn bị các tiêu cực và trung lập, nó là một tập hợp dữ liệu khổng lồ.

Các mẩu dữ liệu thử nghiệm mẫu mà tôi đang cung cấp không bao gồm tình cảm.

'it is nice model' 
    'simply fantastic ' 

Tôi có thể chạy thuật toán phân loại mahout, và nó cho đầu ra của các trường hợp được phân loại là ma trận nhầm lẫn.

Bước tiếp theo, tôi cần tìm hiểu xem tweet nào đang hiển thị tình cảm tích cực và âm tính. đầu ra dự kiến ​​bằng cách sử dụng phân loại: để gắn thẻ văn bản với tình cảm.

 'negative','very bad btr life time' 
     'positive' , 'i phone has excellent design features' 

Trong thuật toán nào tôi cần thực hiện để nhận kết quả ở định dạng trên. hoặc bất kỳ triển khai nguồn tùy chỉnh nào là bắt buộc.

Để hiển thị dữ liệu 'vui lòng' đề xuất cho tôi các thuật toán mà apache mahout cung cấp, sẽ phù hợp với phân tích tình cảm dữ liệu twitter của tôi.

Trả lời

3

Nói chung để phân loại một số văn bản bạn cần để chạy Naive Bayes với các chuyên gia khác nhau (tích cực và tiêu cực trong trường hợp của bạn) và sau đó chỉ cần chọn một kết quả có giá trị lớn hơn.

This excerpt từ sách Mahout có một số ví dụ. Xem Liệt kê 2:

Parameters p = new Parameters(); 
p.set("basePath", modelDir.getCanonicalPath());9 
Datastore ds = new InMemoryBayesDatastore(p); 
Algorithm a = new BayesAlgorithm(); 
ClassifierContext ctx = new ClassifierContext(a,ds); 
ctx.initialize(); 

.... 

ClassifierResult result = ctx.classifyDocument(tokens, defaultCategory); 

Kết quả này phải giữ nhãn "dương" hoặc "âm".

1

Tôi không chắc chắn tôi sẽ có thể giúp bạn đầy đủ nhưng tôi hy vọng tôi sẽ có thể cung cấp cho bạn một số điểm vào. Nói chung, lời khuyên của tôi cho bạn là tải xuống mã nguồn của Mahout và xem các ví dụ và các lớp đích được triển khai như thế nào. Đây không phải là dễ dàng nhưng bạn nên sẵn sàng rằng Mahout không có cửa ra vào dễ dàng. Nhưng một khi bạn nhập vào thì đường cong học tập sẽ nhanh chóng.

Trước hết, nó phụ thuộc vào phiên bản của Mahout bạn đang sử dụng. Tôi đang sử dụng 0,7 bản thân mình, vì vậy lời giải thích của tôi sẽ liên quan đến 0,7.

public void classify(String modelLocation, RawEntry unclassifiedInstanceRaw) throws IOException { 

    Configuration conf = new Configuration(); 

    NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelLocation), conf); 
    AbstractNaiveBayesClassifier classifier = new StandardNaiveBayesClassifier(model); 

    String unclassifiedInstanceFeatures = RawEntry.toNaiveBayesTrainingFormat(unclassifiedInstanceRaw); 

    FeatureVectorEncoder vectorEncoder = new AdaptiveWordValueEncoder("features"); 
    vectorEncoder.setProbes(1); // my features vectors are tiny 

    Vector unclassifiedInstanceVector = new RandomAccessSparseVector(unclassifiedInstanceFeatures.split(" ").length()); 

    for (String feature: unclassifiedInstanceFeatures) { 
     vectorEncoder.addToVector(feature, unclassifiedInstanceVector); 
    } 

    Vector classificationResult = classifier.classifyFull(unclassifiedInstanceVector); 

    System.out.println(classificationResult.asFormatString()); 

} 

gì xảy ra ở đây:

1) Trước tiên, bạn tải các mô hình mà bạn nhận được bằng cách làm trainnb. Mô hình này đã được lưu ở nơi bạn đã chỉ định bằng tham số -o khi gọi trainnb. Mô hình là tệp .bin.

2) StandardNaiveBayesClassifier được tạo ra sử dụng mô hình của bạn

3) RawEntry là lớp tùy chỉnh của tôi mà chỉ là một wrapper xung quanh chuỗi nguyên dữ liệu của tôi. toNaiveBayesTrainingFormar nhận chuỗi Tôi muốn phân loại, loại bỏ nhiễu từ nó dựa trên nhu cầu của tôi và chỉ đơn giản trả về một chuỗi các tính năng 'word1 word2 word3 word4'. Vì vậy, chuỗi thô chưa được phân loại của tôi đã được chuyển đổi thành định dạng phù hợp để phân loại.

4) Bây giờ chuỗi các tính năng cần được mã hóa như Vector Mahout vì phân loại đầu vào duy nhất là trong Vector

5) Vượt qua vector để phân loại - kỳ diệu.

Đây là phần đầu tiên. Bây giờ, classifier trả về cho bạn Vector chứa các lớp (tình cảm trong trường hợp của bạn) với xác suất. Bạn muốn đầu ra cụ thể. Các đơn giản nhất để thực hiện (nhưng tôi giả sử không phải là hiệu quả nhất và phong cách) sẽ làm gì tiếp theo:

1) Bạn tạo MapReduce công việc mà đi qua tất cả các dữ liệu bạn muốn phân loại

2) Đối với mỗi Ví dụ bạn gọi phương thức phân loại (đừng quên làm vài thay đổi không tạo StandardNaiveBayesClassifier cho mọi trường hợp)

3) có vector kết quả phân loại bạn có thể dữ liệu đầu ra trong bất cứ định dạng mà bạn whish trong bản đồ của bạn giảm việc

4) Thiết lập hữu ích ở đây là jC.set ("mapreduce.textoutputformat.separator", ""); trong đó jC là JobConf. Điều này cho phép bạn chọn dấu phân cách cho tệp đầu ra của bạn từ công việc Mapreduce. Trong trường hợp của bạn, đây là ",".

Một lần nữa, tất cả điều này áp dụng cho Mahout 0.7. Không đảm bảo nó sẽ làm việc cho bạn như vậy. Nó làm việc cho tôi mặc dù.

Nói chung, tôi chưa bao giờ làm việc với Mahout từ dòng lệnh và cho tôi Mahout từ Java là con đường để đi.