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> wordTFList = Segmentation.getWordTFList(str);
for (Map.Entry entry : wordTFList) {
System.out.println(entry.getKey() + "," + entry.getValue());
}
// List wordList = Segmentation.getWordList(str);
// for (String word : wordList) {
// System.out.println(word);
// }
// HashMap 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 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 getWordList(String text) {
List> list = getWordTFList(text);
List wordList = new ArrayList();
for (int i = 0; i < list.size(); i++) {
wordList.add(list.get(i).getKey());
}
return wordList;
}
//
public static List> getWordTFList(String text) {
HashMap wordMap = getWordMap(text);
//
List> list = new ArrayList>(
wordMap.entrySet());
Collections.sort(list, new Comparator>() {// sort
// by
// tf
@Override
public int compare(Entry o1,
Entry o2) {
return o2.getValue() - o1.getValue();
}
});
return list;
}
// , kernel code of segmentation
public static HashMap getWordMap(String text) {
initDiction();
HashMap wordMap = new HashMap();
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 getDictionary(){
HashMap dictonary = new HashMap();
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 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