NLPIR-team / NLPIR

http://www.nlpir.org/
3.41k stars 2.02k forks source link

2016版DeepClassify DC_Init失败(非授权文件问题) #79

Open sfsm565826960 opened 7 years ago

sfsm565826960 commented 7 years ago

目的: 2014版的DeepClassify已经测试通过(Github/project中的例子),但DC_Classify缺少置信度,因此想改用最新版的DC_ClassifyEx。

方法: 从Github上下载最新的Data、Lib、授权文件,在DeepClassifyLibrary.java添加public String DC_ClassifyEx(String sText),修改DeepClassifyTest.java的DC_Classify为DC_ClassifyEx。

先上LOG:windows 8.1 // Win10 amd64 // 64位系统 deepClassifier初始化成功 // 成功调用了DC_Init // DC_Init 无错误 deep classifier not init! // 调用DC_AddTrain失败,调用DC_GetLastErrorMsg输出 deep classifier not init! // 调用DC_AddTrain失败,调用DC_GetLastErrorMsg输出

请问原因是什么,如何解决?也可发2016或2017版的Java代码例子让我分析对比,非常感谢!

代码:

public interface DeepClassifierLibrary extends Library{

       DeepClassifierLibrary Instance  = (DeepClassifierLibrary)Native.loadLibrary(
                OSinfo.getSysAndBit("DeepClassifier"), DeepClassifierLibrary.class);

        public boolean DC_Init(String sDataPath,int encode,int nFeatureCount,String sLicenceCode);
        public boolean DC_Exit();

        public boolean  DC_AddTrain(String sClassName,String sText);
        public boolean DC_AddTrainFile(String sClassName,String sFilePath);

        public boolean  DC_Train();
        public boolean  DC_LoadTrainResult();

        public String DC_Classify(String sText);
        public String DC_ClassifyEx(String sText);
        public String DC_ClassifyFile(String sFilename);

        public String DC_GetLastErrorMsg();

        public static final int ENCODING_GBK = 0;
        public static final int ENCODING_UTF8 = 1;
}

public void didTrain(int v) throws IOException {
        //1、训练过程--初始化
        boolean flag = DeepClassifierLibrary.Instance.DC_Init("", DC_ENCODING, DC_FEATURE_COUNT, "");
        if (flag) {
                System.out.println("deepClassifier初始化成功");
        } else {
                System.out.println("deepClassifier初始化失败:" + DeepClassifierLibrary.Instance.DC_GetLastErrorMsg());
                System.exit(1);
        }
        System.out.println(DeepClassifierLibrary.Instance.DC_GetLastErrorMsg());

        //2、训练过程--训练数据划分
        ClassifyData data = new ClassifyData(v);
        ClassifyUser user;
        for(int i = 0,l = trainList.size(); i < l; i++){
                user = trainList.get(i);
                data.put(user.labels.get("sex"), user.value);
        }

        //2、训练过程--导入数据
        boolean addOk = false;
        for(String label : data.getLabels()){
                String[] values = data.getValues(label);
                for(int i = 0; i < values.length; i++){
                        if (values[i] != null){
                                addOk = DeepClassifierLibrary.Instance.DC_AddTrain(label, values[i]);
                                if (!addOk) System.out.println(DeepClassifierLibrary.Instance.DC_GetLastErrorMsg());
                        }
                }
        }

        //3、训练过程--开始训练
        DeepClassifierLibrary.Instance.DC_Train();

        //4、训练过程--训练结束,退出
        DeepClassifierLibrary.Instance.DC_Exit();
}
Dr-Kevin-Zhang commented 7 years ago

注意使用 DC_NewInstance初始化一个分类器实例,为了支持多分类器才加的。

Best wishes 张华平 博士 副教授 研究生导师 大数据搜索挖掘实验室(北京市海量语言信息处理与云计算应用工程技术研究中心) 主任 地址:北京海淀区中关村南大街5号 100081 电话:+86-10-68918642 Email:kevinzhang@bit.edu.cn MSN: pipy_zhang@msn.com; 网站: http://www.nlpir.org (自然语言处理与信息检索共享平台) http://www.bigdataBBS.com (大数据论坛) 微博:http://www.weibo.com/drkevinzhang/ 微信:drkevinzhang 微信公众号:大数据千人会 Dr. Kevin Zhang (张华平,Zhang Hua-Ping) Associate Professor, Graduate Supervisor Director, Big Data Search and Mining Lab. Beijing Engineering Research Center of Massive Language Information Processing and Cloud Computing Application Beijing Institute of Technology Add: No.5, South St.,Zhongguancun,Haidian District,Beijing,P.R.C PC:100081 Tel: +86-10-68918642 Email:kevinzhang@bit.edu.cn MSN: pipy_zhang@msn.com; Website: http://www.nlpir.org (Natural Language Processing and Information Retrieval Sharing Platform) http://www.bigdataBBS.com (Big Data Forum) Twitter: http://www.weibo.com/drkevinzhang/ Webchat: drkevinzhang Subscriptions: Thousands of Big Data Experts

发件人: sfsm565826960 发送时间: 2017-10-25 09:19 收件人: NLPIR-team/NLPIR 抄送: Subscribed 主题: [NLPIR-team/NLPIR] 2016版DeepClassify DC_Init失败(非授权文件问题) (#79) 目的: 2014版的DeepClassify已经测试通过(Github/project中的例子),但DC_Classify缺少置信度,因此想改用最新版的DC_ClassifyEx。 方法: 从Github上下载最新的Data、Lib、授权文件,在DeepClassifyLibrary.java添加public String DC_ClassifyEx(String sText),修改DeepClassifyTest.java的DC_Classify为DC_ClassifyEx。 先上LOG:windows 8.1 // Win10 amd64 // 64位系统 deepClassifier初始化成功 // 成功调用了DC_Init // DC_Init 无错误 deep classifier not init! // 调用DC_AddTrain失败,调用DC_GetLastErrorMsg输出 deep classifier not init! // 调用DC_AddTrain失败,调用DC_GetLastErrorMsg输出 请问原因是什么,如何解决?也可发2016或2017版的Java代码例子让我分析对比,非常感谢! 代码: public interface DeepClassifierLibrary extends Library{ DeepClassifierLibrary Instance = (DeepClassifierLibrary)Native.loadLibrary( OSinfo.getSysAndBit("DeepClassifier"), DeepClassifierLibrary.class); public boolean DC_Init(String sDataPath,int encode,int nFeatureCount,String sLicenceCode); public boolean DC_Exit();

public boolean  DC_AddTrain(String sClassName,String sText);
public boolean DC_AddTrainFile(String sClassName,String sFilePath);

public boolean  DC_Train();
public boolean  DC_LoadTrainResult();
public String DC_Classify(String sText);
public String DC_ClassifyEx(String sText);
public String DC_ClassifyFile(String sFilename);
public String DC_GetLastErrorMsg();
public static final int ENCODING_GBK = 0;
public static final int ENCODING_UTF8 = 1;

} public void didTrain(int v) throws IOException { //1、训练过程--初始化 boolean flag = DeepClassifierLibrary.Instance.DC_Init("", DC_ENCODING, DC_FEATURE_COUNT, ""); if (flag) { System.out.println("deepClassifier初始化成功"); } else { System.out.println("deepClassifier初始化失败:" + DeepClassifierLibrary.Instance.DC_GetLastErrorMsg()); System.exit(1); } System.out.println(DeepClassifierLibrary.Instance.DC_GetLastErrorMsg()); //2、训练过程--训练数据划分 ClassifyData data = new ClassifyData(v); ClassifyUser user; for(int i = 0,l = trainList.size(); i < l; i++){ user = trainList.get(i); data.put(user.labels.get("sex"), user.value); } //2、训练过程--导入数据 boolean addOk = false; for(String label : data.getLabels()){ String[] values = data.getValues(label); for(int i = 0; i < values.length; i++){ if (values[i] != null){ addOk = DeepClassifierLibrary.Instance.DC_AddTrain(label, values[i]); if (!addOk) System.out.println(DeepClassifierLibrary.Instance.DC_GetLastErrorMsg()); } } }

//3、训练过程--开始训练
DeepClassifierLibrary.Instance.DC_Train();

//4、训练过程--训练结束,退出
DeepClassifierLibrary.Instance.DC_Exit();

} — You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

sfsm565826960 commented 7 years ago

非常感谢,已经解决

在使用过程中,我遇到了一些问题,想请教下: 目的:从用户访问的URL提取出所有中文短语,然后以用户为单位进行性别识别。

1、分类的数量是否对分类有影响?性别仅两个分类,ClassifyEx仅输出男/1.0,而并非置信度。因此我尝试采用性别+年龄段建立多个分类,然后从输出的男-大学生/9.0##女-青年/8.0##男-中年/7.0...来计算性别权重,但准确率反而更低了(┬_┬)。

2、每个分类中文件数量不同是否会影响分类?由于男性比女性的样本多(接近2:1),结果认为测试样本(性别比1:1)90%以上都是男性。。。

3、每个文件的内容长度是否有影响?我用ClassifyData类虚拟出统一的男女文件数量,由于男性较多,因此每个男性虚拟文件内容比女性的多,结果又是一边倒。。。

猜测: 1、每个分类中的文件进行横向对比,提取出比较共有的词作为该类别特征。(类似交集) 2、不同分类之间对比,排除共有的词(类似差集) 因此性别+年龄建立多个分类,反而排除了具有性别偏向的词?而文本量太低则难以提取出共同的类别特征?

经测试: 性别+年龄得出的性别几乎是男的... 将ClassifyData虚拟的文件数设为50,男用户约800,女用户约500,测试后发现设为600反而正确率更高。。

请不吝赐教,非常感谢!

public class ClassifyData {
    private int partCount;
    private HashMap<String, String[]> classify = new HashMap<String, String[]>();
    private HashMap<String, Integer> partIndex = new HashMap<String, Integer>();

    public ClassifyData(int partCount){
        this.partCount = partCount;
    }

    public void put(String label, String value){
        // 创建新的类别
        if (!classify.containsKey(label)){
            classify.put(label, new String[partCount]);
            partIndex.put(label, 0);
            classifyCount.put(label, 0);
        }
        // 放入值
        String labelPart[] = classify.get(label);
        int pIndex = partIndex.get(label);
        if (labelPart[pIndex] == null) labelPart[pIndex] = "";
        labelPart[pIndex] += value + "\n";
        classify.put(label, labelPart);
        partIndex.put(label, ++pIndex % partCount);
    }

    public Set<String> getLabels(){
        return classify.keySet();
    }

    public String[] getValues(String label) {
        return classify.get(label);
    }
}

public void didTrain(int v) throws IOException {
    //1、训练过程--初始化
    boolean flag = DeepClassifierLibrary.Instance.DC_Init(
            DeepClassifierLibrary.DATA_PATH, DC_ENCODING, DC_FEATURE_COUNT, "");
    if (flag) {
        System.out.println("deepClassifier初始化成功");
    } else {
        System.out.println("deepClassifier初始化失败:" + DeepClassifierLibrary.Instance.DC_GetLastErrorMsg());
        System.exit(1);
    }
    int DC_Handle = DeepClassifierLibrary.Instance.DC_NewInstance(DC_FEATURE_COUNT);

    //2、训练过程--训练数据划分
    ClassifyData data = new ClassifyData(v);
    ClassifyUser user;
    for(int i = 0,l = trainList.size(); i < l; i++){
        user = trainList.get(i);
                //data.put(user.labels.get("sex") + LABEL_SPLIT + user.labels.get("age"), user.value);
        data.put(user.labels.get("sex"), user.value);
    }

    //2、训练过程--导入数据
    for(String label : data.getLabels()){
        String[] values = data.getValues(label);
        for(int i = 0; i < values.length; i++){
            if (values[i] != null){
                DeepClassifierLibrary.Instance.DC_AddTrain(label, values[i], DC_Handle);
            }
        }
    }

    //3、训练过程--开始训练
    DeepClassifierLibrary.Instance.DC_Train(DC_Handle);

    // 输出训练结果
    DeepClassifierLibrary.Instance.DC_ExportFeatures(dC_FEATURES_FILE, DC_Handle);

    //4、训练过程--训练结束,退出
    DeepClassifierLibrary.Instance.DC_Exit();
}

/**
 * 分类过程
 * @throws IOException
 */
@Test
public double[] didClassify() throws IOException {

    //1、分类过程--初始化
    if (DeepClassifierLibrary.Instance.DC_Init(DeepClassifierLibrary.DATA_PATH, DC_ENCODING, DC_FEATURE_COUNT, "")) {
        System.out.println("deepClassifier初始化成功");
    } else {
        System.out.println("deepClassifier初始化失败:" + DeepClassifierLibrary.Instance.DC_GetLastErrorMsg());
        System.exit(1);
    }
    int DC_Handle = DeepClassifierLibrary.Instance.DC_NewInstance(DC_FEATURE_COUNT);

    //2、分类过程--加载训练结果
    DeepClassifierLibrary.Instance.DC_LoadTrainResult(DC_Handle);

    //3、分类过程--读取待分类的文本
    ClassifyEvaluate evaluate = new ClassifyEvaluate(); // 模型评价对象
    ClassifyUser user;
    for (int i = 0, l = testList.size(); i < l; i++) {

        user = testList.get(i);

        String classifyEx = DeepClassifierLibrary.Instance.DC_ClassifyEx(user.value, DC_Handle);
        String classifyResult = ClassifyEvaluate.parseClassifyEx(classifyEx, LABEL_SPLIT); // 返回类似:男_青年/0.61

        String[] classifyList = classifyResult.split("/");
        String[] classifyLabel = classifyList[0].split(LABEL_SPLIT);
        double classifyRate = Double.parseDouble(classifyList[1]);

        // 判断分类准确性
        String classify = classifyLabel[0];
        String label = user.labels.get("sex");
        if (label.equals(classify)) {
            evaluate.addRight(classify, classifyRate);
        } else {
            evaluate.addWrong(label, classify, classifyRate);
        }
    }

    //4、统计结果
    System.out.println(evaluate.getEvaluate());
    System.out.println("---------------置信度-----------------");
    System.out.println("男:" + evaluate.getConfidence("男"));
    System.out.println("女:" + evaluate.getConfidence("女"));
    System.out.println("男->女:" + evaluate.getConfidence("男->女"));
    System.out.println("女->男:" + evaluate.getConfidence("女->男"));

    //5、分类过程--退出
    DeepClassifierLibrary.Instance.DC_Exit();

    return evaluate.getEvaluateRate();
}

@Dr-Kevin-Zhang

sfsm565826960 commented 7 years ago

DeepClassify授权文件已过期 @Dr-Kevin-Zhang