自己实现的一个简单文本分词,最大粒度,后向分词



Segmentation_test.java

package segmentation;

import java.util.List;
import java.util.Map;

public class Segmentation_test {

	public static void main(String[] args) {
		String str = "RunningZ testing,爱是一本书,陈奕迅,爱的样子像什么,几亿万人都不懂,你今天在做什么,你是怎样回忆我,故事书 写的很美,谈爱情的人类,总是要掉眼泪,可是爱比逻辑厉害,我们都要自由也要彼此的未来,这好奇怪,结局的状态 被时间吹歪,很久很久之后会,把来龙和去脉,写下来,我们会来读 爱这本书,怎样才会幸福 爱谁清楚,两颗心 在记录,从热到冷 多辛苦,Baby~~~,我们会来读 爱这本书,哪个人先结束 爱 好残酷,到分开那一天,我才真正的领悟,莫非你 也孤独~~,爱加恨等于什么,你用多久忘了我,读后心得给了谁,反正在几年内,总是会有点醉,不是爱比逻辑厉害,我们都要自由也要彼此的未来,这好奇怪,结局的状态,被时间吹歪,很久很久之后 会把来龙和去脉,写下来,我们会来读 爱这本书,怎样才会幸福 爱谁清楚,两颗心 在记录,从热到冷 多辛苦,Baby~~,我们会来读 爱这本书,哪个人先结束 爱 好残酷,到分开那一天,我才真正的领悟,莫非~你~也孤独~~,(melody),我们会来读 爱这本书,怎样才会幸福 爱谁清楚,两颗心 在记录,从热到冷 多辛苦,Baby~~,我们会来读 爱这本书,哪个人先结束 爱 好残酷,到分开那一天,我才真正的领悟,莫非你~也孤独~~";
		//String str = "爱的样子像什么";
		
		System.out.println(Segmentation.segmentation(str));
		List<Map.Entry<String, Integer>> wordTFList = Segmentation.getWordTFList(str);
		for (Map.Entry<String, Integer> entry : wordTFList) {
			System.out.println(entry.getKey() + "," + entry.getValue());
		}
		
//		List<String> wordList = Segmentation.getWordList(str);
//		for (String word : wordList) {
//			System.out.println(word);
//		}
		
//		HashMap<String, Integer> wordMap = Segmentation.getWordMap(str);
//		for(String key : wordMap.keySet()) {
//			System.out.println(key + "," + wordMap.get(key));
//		}
		
	}
}


Segmentation.java

package segmentation;

import java.util.*;
import java.util.Map.Entry;

/**
 * 
 * @author RunningZ 2016-10-20 17:44:21
 */
public class Segmentation {
	// dictionary
	static boolean initDictionary = false;
	public static HashMap<String, Integer> dictionary;

	// segmentation params
	public static int wordMaxLength = 10; // the max length of one words

	public static void initDiction() {
		if (!initDictionary) {
			initDictionary = true;
			dictionary = GetDictionary.getDictionary();
		}
	}

	public static List<String> getWordList(String text) {
		List<Map.Entry<String, Integer>> list = getWordTFList(text);
		List<String> wordList = new ArrayList<String>();
		for (int i = 0; i < list.size(); i++) {
			wordList.add(list.get(i).getKey());
		}
		return wordList;
	}

	// <word, tf>
	public static List<Map.Entry<String, Integer>> getWordTFList(String text) {
		HashMap<String, Integer> wordMap = getWordMap(text);

		// <word, tf>
		List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(
				wordMap.entrySet());
		Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {// sort
					// by
					// tf
					@Override
					public int compare(Entry<String, Integer> o1,
							Entry<String, Integer> o2) {
						return o2.getValue() - o1.getValue();
					}
				});
		return list;
	}

	// <word, tf>, kernel code of segmentation
	public static HashMap<String, Integer> getWordMap(String text) {
		initDiction();
		HashMap<String, Integer> wordMap = new HashMap<String, Integer>();

		int begin = 0;
		int cur = begin + wordMaxLength;
		int end = text.length();
		String key = "";

		while (begin < end) {
			cur = cur < end ? cur : end;
			key = text.substring(begin, cur);

			if (dictionary.containsKey(key)) {
				if (!wordMap.containsKey(key)) {
					wordMap.put(key, 0);
				}
				wordMap.put(key, wordMap.get(key) + 1);
				begin = cur;
				cur = begin + wordMaxLength;
			} else {
				cur--;
				if (cur - begin <= 0) {
					begin++;
					cur = begin + wordMaxLength;
				}
			}
		}
		return wordMap;
	}

	// from text to word1|word2|word3|, kernel code of segmentation
	public static String segmentation(String text) {
		initDiction();
		StringBuffer ans = new StringBuffer();

		int begin = 0;
		int cur = begin + wordMaxLength;
		int end = text.length();
		String key = "";

		while (begin < end) {
			cur = cur < end ? cur : end;
			key = text.substring(begin, cur);

			if (dictionary.containsKey(key)) {
				ans.append(key + "|");
				begin = cur;
				cur = begin + wordMaxLength;
			} else {
				cur--;
				if (cur - begin <= 0) {
					String stopWords = " "; // can use a stopWord dictionary
					if (!key.equals(stopWords)) {
						ans.append(key + "|");
					}
					begin++;
					cur = begin + wordMaxLength;
				}
			}
		}
		return ans.toString();
	}
}



GetDictionary.java

package segmentation;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetDictionary {
	public static HashMap<String, Integer> getDictionary(){
		HashMap<String, Integer> dictonary = new HashMap<String, Integer>();
		
		String dictionaryPath = "src/segmentation/dictionary_RunningZ.txt";
		String dictionaryStr = readStr(dictionaryPath);
		//String regularExpression = "[\u4e00-\u9fa5]+"; // only Chinese
		String regularExpression = "[\\w\u4e00-\u9fa5]+"; // both Chinese and English
		Pattern pattern = Pattern.compile(regularExpression);;
		Matcher matcher = pattern.matcher(dictionaryStr);;

		while (matcher.find()) {
			String key = matcher.group();
			if(!dictonary.containsKey(key)){
				dictonary.put(key, 0);
			}
			dictonary.put(key, dictonary.get(key) + 1);
		}
		return dictonary;
	}
	
	public static String readStr(String path){
		StringBuffer str = new StringBuffer();
		try {
			BufferedReader br = new BufferedReader(new FileReader(new File(path)));
			String line = null;
			while((line = br.readLine()) != null) {
				str.append(line + "\n");
			}
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return str.toString();
	}

	// test read dictionary
	public static void main(String argv[]) {
		HashMap<String, Integer> dictonary = getDictionary();
		System.out.println(dictonary.size());
		System.out.println(dictonary.containsKey("RunningZ"));
	}
}


Segmentation_test.java 运行结果

RunningZ|testing|,|爱|是|一本书|,|陈奕迅|,|爱|的|样子|像|什么|,|几亿|万人|都不|懂|,|你|今天在|做什么|,|你是|怎样|回忆|我|,|故事书|写|的|很美|,|谈|爱情|的人|类|,|总是|要|掉|眼泪|,|可是|爱|比|逻辑|厉害|,|我们|都要|自由|也要|彼此|的|未来|,|这|好奇|怪|,|结局|的|状态|被|时间|吹|歪|,|很久很久|之后|会|,|把|来|龙|和|去|脉|,|写下来|,|我们|会来|读|爱|这本书|,|怎样|才会|幸福|爱|谁|清楚|,|两颗心|在记|录|,|从|热|到|冷|多|辛苦|,|B|a|b|y|~|~|~|,|我们|会来|读|爱|这本书|,|哪个|人|先|结束|爱|好|残酷|,|到|分开|那一天|,|我|才|真正|的|领悟|,|莫非|你|也|孤独|~|~|,|爱|加|恨|等于|什么|,|你|用|多久|忘了|我|,|读后心得|给了谁|,|反正|在|几年|内|,|总是会|有点|醉|,|不是|爱|比|逻辑|厉害|,|我们|都要|自由|也要|彼此|的|未来|,|这|好奇|怪|,|结局|的|状态|,|被|时间|吹|歪|,|很久很久|之后|会把|来|龙|和|去|脉|,|写下来|,|我们|会来|读|爱|这本书|,|怎样|才会|幸福|爱|谁|清楚|,|两颗心|在记|录|,|从|热|到|冷|多|辛苦|,|B|a|b|y|~|~|,|我们|会来|读|爱|这本书|,|哪个|人|先|结束|爱|好|残酷|,|到|分开|那一天|,|我|才|真正|的|领悟|,|莫非|~|你|~|也|孤独|~|~|,|(|m|e|l|o|d|y|)|,|我们|会来|读|爱|这本书|,|怎样|才会|幸福|爱|谁|清楚|,|两颗心|在记|录|,|从|热|到|冷|多|辛苦|,|B|a|b|y|~|~|,|我们|会来|读|爱|这本书|,|哪个|人|先|结束|爱|好|残酷|,|到|分开|那一天|,|我|才|真正|的|领悟|,|莫非|你|~|也|孤独|~|~|
爱,17
我们,8
会来,6
这本书,6
怎样,4
在记,3
莫非,3
孤独,3
两颗心,3
哪个,3
幸福,3
那一天,3
真正,3
分开,3
辛苦,3
人,3
残酷,3
领悟,3
才会,3
结束,3
清楚,3
什么,2
状态,2
也要,2
自由,2
逻辑,2
很久很久,2
之后,2
写下来,2
时间,2
都要,2
厉害,2
结局,2
好奇,2
彼此,2
未来,2
很美,1
一本书,1
读后心得,1
万人,1
几年,1
眼泪,1
加,1
都不,1
回忆,1
忘了,1
testing,1
可是,1
给了谁,1
总是会,1
的人,1
会把,1
爱情,1
反正,1
你是,1
故事书,1
不是,1
RunningZ,1
几亿,1
做什么,1
总是,1
今天在,1
有点,1
多久,1
陈奕迅,1
等于,1
样子,1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值