java读取中文分词工具(四)

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.StringTokenizer;

/*
 * 文件格式:已分词的中文文本,每个词语空格分割,每行一个段落。
 * 这个类适合读取每行数量较少的文本,比如分好段落的文本,一个段落一行存储。
 * 读取一行,步长为1,返回词组。不会跨段落生成词组。
 * 3种模式:
 * 1 读到文件末尾,结束
 * 2 读到文件末尾,从头再来
 * 3 一行循环多次,浏览到文本末尾就完了
 */
public class ParaWordReader implements Reader
{
	static final int normalMode = 0;//浏览到文本末尾就完了
	static final int againMode = 1;//浏览到文本末尾,从头再来
	static final int paraAgainMode = 2 ;//一行循环多次,浏览到文本末尾就完了
	private int currentMode = 0;

	private RandomAccessFile raf= null;
	private File file;
	private ArrayList<String> paraWords = null;

	private StringTokenizer tokenizer;
	private int currentPara = -1;
	private int paraPos = 0;
	private int paraIter = 0;
	private int paraIters = 1;
	public  ParaWordReader(String fileName) throws IOException
	{
		file=new File(fileName);
		raf = new RandomAccessFile(file,"r") ;
		paraWords = new ArrayList<String>();
	}	

	public void setMode(int m)
	{
		currentMode = m;
	}

	public void setParaIters(int iters)
	{
		paraIters = iters;
		setMode(paraAgainMode);
	}

	public int paraIndex()
	{
		return currentPara;
	}
	private boolean readPara() throws IOException
	{
		String line = raf.readLine();
		if(line == null)//到文件末尾了
		{
			if(currentMode == normalMode || currentMode == paraAgainMode)
			{
				return false;
			}
			else
			{
				System.out.println("文件太大可能不支持");
				raf.seek(0);
				currentPara = -1;
				return readPara();
			}
		}
		paraWords.clear();
		line = new String(line.getBytes("iso8859-1"),"utf-8");
		tokenizer= new StringTokenizer(line," ");
		while(tokenizer.hasMoreTokens())
		{
			paraWords.add(tokenizer.nextToken());
		}
		currentPara++;
		paraPos = 0;
		return true;
	}

	public String[] getNextWords(int count) throws IOException
	{
		if(paraPos+count >= paraWords.size())//到了段落末尾
		{
			if(currentMode == paraAgainMode && paraIter< paraIters)//段落从头再来
			{
				paraPos = 0;
				paraIter++;
				return getNextWords(count);
			}
			else
			{
				paraIter =0;
				if(readPara())//读取新的段落
				return getNextWords(count);
				else return null;
			}
		}
		String[] words = new String[count];
		for(int i=0;i<count;i++)
		{
			words[i] = paraWords.get(paraPos+i);

		}
		paraPos++;
		return words;
	}

	public static void main(String[] args) throws IOException
	{
		// TODO Auto-generated method stub
		ParaWordReader wordReader = new ParaWordReader("/media/linger/G/sources/ParaModel/electronic_seg.txt");
		wordReader.currentMode = ParaWordReader.againMode;
		//while(true)//614005行
		for(int i=0;i<614005*2;i++)
		{
			String[] words = wordReader.getNextWords(5);
			if(words == null) break;
			System.out.printf("%s,%s,%s,%s,%s \n",words[0],words[1],words[2],words[3],words[4]);
		}
		System.out.println(wordReader.currentPara);

	}

}

本文作者:linger

本文链接:http://blog.csdn.net/lingerlanlan/article/details/38337707

java读取中文分词工具(四),布布扣,bubuko.com

时间: 2024-12-19 09:40:12

java读取中文分词工具(四)的相关文章

java读取中文分词工具(三)

import java.io.EOFException; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.ArrayList; /* * 文件格式:已分词的文本,词语之间用空格,换行等空白符分割. * 到了文件末尾就结束 * 适合读取一行很大的文本,因为这里的缓冲不是一行,

java读取中文分词工具(2)

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; /* * 文件格式:已分词的中文文本,每个词语空格分割,每行一个段落. * 这个类适

java读取中文分词工具

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.util.StringTokenizer; /* * 文本格式:已分词的中文文本,空格分割.有若干行,每行为一个段落.

NLP(十三)中文分词工具的使用尝试

??本文将对三种中文分词工具进行使用尝试,这三种工具分别为哈工大的LTP,结巴分词以及北大的pkuseg. ??首先我们先准备好环境,即需要安装三个模块:pyltp, jieba, pkuseg以及LTP的分词模型文件cws.model.在用户字典中添加以下5个词语: 经 少安 贺凤英 F-35战斗机 埃达尔·阿勒坎 ??测试的Python代码如下: # -*- coding: utf-8 -*- import os import jieba import pkuseg from pyltp i

中文分词工具简介与安装教程(jieba、nlpir、hanlp、pkuseg、foolnltk、snownlp、thulac)

2.1 jieba 2.1.1 jieba简介 Jieba中文含义结巴,jieba库是目前做的最好的python分词组件.首先它的安装十分便捷,只需要使用pip安装:其次,它不需要另外下载其它的数据包,在这一点上它比其余五款分词工具都要便捷.另外,jieba库支持的文本编码方式为utf-8. Jieba库包含许多功能,如分词.词性标注.自定义词典.关键词提取.基于jieba的关键词提取有两种常用算法,一是TF-IDF算法:二是TextRank算法.基于jieba库的分词,包含三种分词模式: 精准

11大Java开源中文分词器的使用方法和分词效果对比

本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断. 11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: /** * 获取文本的所有分词结果, 对比不同分词器结果 * @author 杨尚川 */ public interface WordSegmenter {

9大Java开源中文分词器的使用方法和分词效果对比

本文的目标有两个: 1.学会使用9大Java开源中文分词器 2.对比分析9大Java开源中文分词器的分词效果 9大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: /**  * 获取文本的所有分词结果, 对比不同分词器结果  * @author 杨尚川  */ public interface WordSegmenter {     /**      * 获取文本的所有分词结果      * @param text 文本      * @retur

java读取XML文件的四种方式

java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>河南省郑州市</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>河南省郑州市二七区&

基于开源中文分词工具pkuseg-python,我用张小龙的3万字演讲做了测试

做过搜索的同学都知道,分词的好坏直接决定了搜索的质量,在英文中分词比中文要简单,因为英文是一个个单词通过空格来划分每个词的,而中文都一个个句子,单独一个汉字没有任何意义,必须联系前后文字才能正确表达它的意思. 因此,中文分词技术一直是nlp领域中的一大挑战.Python 中有个比较著名的分词库是结巴分词,从易用性来说对用户是非常友好的,但是准确度不怎么好.这几天发现另外一个库,pkuseg-python,看起来应该是北大的某个学生团队弄出来的,因为这方面没看到过多的介绍,pkuseg-pytho