NLP碎碎念

来源:互联网 发布:实验数据分析怎么写 编辑:程序博客网 时间:2024/06/01 07:11

最近都在搞中文自然语言处理方面的事情,大概有三星期了吧,总结一下。
用的是java+myeclipse开发。
中文的话,首先要分词,用的是复旦的fnlp。做文本分类,由于数据量不是很多,因此用libsvm,其实效果很差啦。。但是,还算可以吧。
讲一下关于fnlp和libsvm的一些内容吧。

  • fnlp的分词效果不是很好,但是我用ansj分词效果半斤八两,因此就手动添加词典,
    StopWords sw= new StopWords("data/stop_words.txt");
    CWSTagger seg = new CWSTagger("models/seg.m",new Dictionary("models/dict.txt"));
    AbstractExtractor key = new WordExtract(seg,sw);

    stop_words.txt和和dict.txt都是自己手动添加的~~seg.m是添加配置fnlp时候已经添加了的。
    然后分词,因为句子短,不超过10个,所以我就把它当做提取关键词了:
    Map<String, Integer> keywords = key.extract(ts, 10);

  • fnlp也有词向量,不过它训练词向量的原理是ngram。

  • 用svm做自然语言处理,我的内心是拒绝的,但是svm真的很好用,训练准确率挺高的。懒人用笨办法说的就是我==。用svm的话要给每个文本构造一个向量,然后训练。安装libsvm的时候有提供两个示例调用文件svm_train.java和svm_predict.java,我觉得太麻烦了,因为它限制了输入和输出的格式,就自己简单写了调用文件。有一些参数设置参照了示例文件的。。
    svm_problem problem = new svm_problem();
    problem.l = Nodes.length; //numbers of vectors
    problem.x = new svm_node[problem.l][];
    for(int i=0;i<problem.l;i++)
    problem.x[i] = vx.elementAt(i);
    problem.y = new double[problem.l];
    for(int i=0;i<problem.l;i++)
    problem.y[i] = vy.elementAt(i);
    svm_parameter param = new svm_parameter();
    param.svm_type = svm_parameter.C_SVC;
    param.kernel_type = svm_parameter.RBF;
    param.degree = 3;
    param.gamma = 0; // 1/num_features
    param.coef0 = 0;
    param.nu = 0.5;
    param.cache_size = 100;
    param.C = 1;
    param.eps = 1e-3;
    param.p = 0.1;
    param.shrinking = 1;
    param.probability = 0;
    param.nr_weight = 0;
    param.weight_label = new int[0];
    param.weight = new double[0];
    if(param.gamma == 0 && num_features> 0)
    param.gamma = 1.0/num_features;

    其中:
    Vector<svm_node[]> vx = new Vector<svm_node[]>();
    Vector<Double> vy = new Vector<Double>();

  • 就这样吧。。感觉写得不清不楚的,给自己看。
原创粉丝点击