自然语言处理与分析(two)

接着自然语言处理与分析(one)


笔者现在推荐一款在线编辑器。

我就是用来写代码的。

data:text/html, <style type="text/css">#e{position:absolute;top:0;right:0;bottom:0;left:0;}</style><div id=%22e%22></div><script src=%22http://d1n0x3qji82z53.cloudfront.net/src-min-noconflict/ace.js%22 type=%22text/javascript%22 charset=%22utf-8%22></script><script>var e=ace.edit(%22e%22);e.setTheme(%22ace/theme/monokai%22);e.getSession().setMode(%22ace/mode/java%22);</script>

这个粘帖到浏览器地址。


public void train() throws IOException {
		for (int i = 0; i < categories.length; ++i) {
			String category = categories[i];
			Classification classification = new Classification(category); //新建类别
			File dir = new File(pDir, categories[i]);
			File[] trainFiles = dir.listFiles();
			for (int j = 0; j < trainFiles.length; ++j) {
				File trainFile = trainFiles[j];
				if (isTrainingFile(trainFile)) { //判断一下是为了让一部分数据作为训练集、一部分作为测试集
					String review = Files.readFromFile(trainFile, "ISO-8859-1");
					Classified classified = new Classified(
							review, classification); //指定内容和类别
					classifer.handle(classified); //训练
				}
			}
		}
	}



这里说明一下isTrainingFile方法。我们需要一份测试集和一个训练集,但是我们只有一个语料库,只有人为分割。我原本是每次随机数一下来干的,但是有点影响速度,这里直接用文件名作为判断依据了。



boolean isTrainingFile(File file) {
		return file.getName().charAt(2) != '1'; //如果第2位为1就是测试集
	}


训练完成后使用classifer就可以进行极性分析了。


public void evaluate() throws IOException {
		int numTests = 0;
		int numCorrect = 0;
		for (int i = 0; i < categories.length; ++i) {
			String category = categories[i];
			File file = new File(pDir, categories[i]);
			File[] testFiles = file.listFiles();
			for (int j = 0; j < testFiles.length; ++j) {
				File testFile = testFiles[j];
				if (!isTrainingFile(testFile)) {
					String review = Files.readFromFile(testFile, "ISO-8859-1");
					++numTests;
					Classification classification = classifer.classify(review);
					String resultCategory = classification.bestCategory();
					if (resultCategory.equals(category))
						++numCorrect;
				}
			}
		}
		System.out.println("测试总数:" + numTests);
		System.out.println("正确数:" + numCorrect);
		System.out.println("正确率" + ((double) numCorrect)
				/ (double) numTests);
	}



效果:

lingpipe1lingpipe1

将isTrainingFile修改一下


boolean isTrainingFile(File file) {
		return file.getName().charAt(2) != '2'; //如果第2位为2就是测试集
	}


lingpipi2lingpipi2

就正确率而言怎么划分训练集和测试集影响不大。

还可以这样划分


boolean isTrainingFile(File file) {
		return (file.getName().charAt(2) != '2')&&(file.getName().charAt(2) != '1');
	}


扩展

基本极性分析只是文本倾向性分析一个很简单的部分,如果需要深入的话,LingPipe还可以实现主观性分析、层次极性分析等。

如果需要支持中文的话,请下载words-zh-as.CompiledSpellChecker。

最后附上三篇参考文献:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值