Open sfsm565826960 opened 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.
非常感谢,已经解决
在使用过程中,我遇到了一些问题,想请教下: 目的:从用户访问的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
DeepClassify授权文件已过期 @Dr-Kevin-Zhang
目的: 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代码例子让我分析对比,非常感谢!
代码: