中国語分詞ウィジェット(ソースコードダウンロード)
1.インタフェース
インタフェースCutを定義しjava.io.Serializableを実装
次に抽象クラスAbstractCutでCutインタフェースを実装するので、AbstractCutサブクラスはオブジェクトのシーケンス化操作を実装することができる
2.抽象
MaxRightCut(最大右分詞)とMaxleftCut(最大左分詞)はAbstraactCutを継承します.
3.実現
MaxRightCutとMaxleftCutはそれぞれAbstractCutの抽象的な方法abstract DLNode cut(Set set,String doc)を実現した.
4.組み合わせ
定義クラスCutManagerには2つのプロパティがあります.Cut(分詞メソッドが使用可能)とSet(辞書セット)
辞書、HashSetについて(散乱表);あらかじめバイナリファイルにシーケンス化し、それを用いて逆シーケンス化を行い、主にオブジェクトシーケンス化の方式で、分詞方法と辞書の置換を実現する.
5.インタフェース
インタフェース操作、主にswing技術を用いる.CutFrameはjavax.swing.JFrameを継承
CutFrameは属性CutManagerを持ち、CutManagerのCutインタフェースが提供する方法、分詞を操作する
1.インタフェース
インタフェースCutを定義しjava.io.Serializableを実装
次に抽象クラスAbstractCutを用いてCutインタフェースを実装するので,AbstractCutサブクラスはオブジェクトのシーケンス化動作を実装し,実装されていない抽象メソッドcut(Set,String doc)を定義することができる.
3.実現
MaxleftCutはAbstractCutの抽象的な方法abstract DLNode cut(Set set,String doc)をそれぞれ実現した.
3.実現
MaxRightCutはAbstractCutの抽象的な方法abstract DLNode cut(Set set,String doc)を実現した.
4.組み合わせ
定義クラスCutManagerには2つのプロパティがあります.Cut(分詞メソッドが使用可能)とSet(辞書セット)
インタフェースCutを定義しjava.io.Serializableを実装
次に抽象クラスAbstractCutでCutインタフェースを実装するので、AbstractCutサブクラスはオブジェクトのシーケンス化操作を実装することができる
2.抽象
MaxRightCut(最大右分詞)とMaxleftCut(最大左分詞)はAbstraactCutを継承します.
3.実現
MaxRightCutとMaxleftCutはそれぞれAbstractCutの抽象的な方法abstract DLNode cut(Set set,String doc)を実現した.
4.組み合わせ
定義クラスCutManagerには2つのプロパティがあります.Cut(分詞メソッドが使用可能)とSet(辞書セット)
辞書、HashSetについて(散乱表);あらかじめバイナリファイルにシーケンス化し、それを用いて逆シーケンス化を行い、主にオブジェクトシーケンス化の方式で、分詞方法と辞書の置換を実現する.
5.インタフェース
インタフェース操作、主にswing技術を用いる.CutFrameはjavax.swing.JFrameを継承
CutFrameは属性CutManagerを持ち、CutManagerのCutインタフェースが提供する方法、分詞を操作する
1.インタフェース
インタフェースCutを定義しjava.io.Serializableを実装
package com.cut.util;
import java.util.Set;
public interface Cut extends java.io.Serializable{
public String doCut(Set set,String doc) ;
}
次に抽象クラスAbstractCutを用いてCutインタフェースを実装するので,AbstractCutサブクラスはオブジェクトのシーケンス化動作を実装し,実装されていない抽象メソッドcut(Set,String doc)を定義することができる.
package com.cut.util.cut;
import java.util.Set;
import com.cut.util.Cut;
public abstract class AbstractCut implements Cut {
/**
*
*/
private static final long serialVersionUID = 6243250356503179429L;
StringBuffer newDoc = new StringBuffer(" ");
// ,
protected abstract DLLNode cut(Set set, String doc);
public String doCut(Set hashSet, String doc) {
// TODO Auto-generated method stub
//
long t1=System.nanoTime();
DLLNode qs=cut(hashSet, doc);
long t2=System.nanoTime();
System.out.println(" :"+(t2-t1));
// doc
doDoc(qs);
String temp = newDoc.toString();
// newDoc ,
clear();
return temp;
}
// doc
private void doDoc(DLLNode link) {
while(link!=null){
String word = (String) link.data;
if (isAddtSpaces(newDoc, word)) {
newDoc.append(" " + word);
} else {
newDoc.append(word);
}
link=link.next;
}
}
// ,
private boolean isAddtSpaces(StringBuffer newDoc, String word) {
// ( )
char flag1 = word.charAt(0);
// ( )
char flag2 = newDoc.charAt(newDoc.length() - 1);
// ,
if (isDigit(flag1) && isDigit(flag2)
|| isLetter(flag1) && isLetter(flag2)) {
return false;
}else {
return true;
}
}
//
private boolean isDigit(char c) {
if (c >= '0' && c <= '9') {
return true;
} else {
return false;
}
}
//
private boolean isLetter(char c) {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
return true;
} else {
return false;
}
}
// newDoc
private void clear() {
newDoc.delete(1, newDoc.length());
}
//
protected class DLLNode {
Object data; // the data wrapped in the node
DLLNode prev; // reference to the previous Node
DLLNode next; // reference to the next Node
// default constructor,empty node
public DLLNode() {}
// constructor for node with given object
public DLLNode(Object obj) { data = obj; }
// general constructor
public DLLNode(Object obj, DLLNode prevLink, DLLNode nextLink) {
data = obj;
prev = prevLink;
next = nextLink;
}
public String toString()
{ return data.toString(); }
}
}
3.実現
MaxleftCutはAbstractCutの抽象的な方法abstract DLNode cut(Set set,String doc)をそれぞれ実現した.
package com.cut.util.cut;
import java.util.Set;
public class MaxleftCut extends AbstractCut {
/**
*
*/
private static final long serialVersionUID = -1107138974220147102L;
//
public DLLNode cut(Set set, String doc) {
// Queue queue=new ArrayQueue();
DLLNode cur = new DLLNode(" ");
//
int wordLength = 7;
//
int len = doc.length();
//
for (int right = len; right > 0; right--) {
for (int left = right - wordLength; left < len; left++) {
if (left <0) {
left = 0;
}
String word = doc.substring(left, right);
if (set.contains(word)) {
cur.prev = new DLLNode(word);
cur.prev.next = cur;
cur = cur.prev;
right = left+1;
break;
} else if (right - left == 1) {
cur.prev = new DLLNode(word);
cur.prev.next = cur;
cur = cur.prev;
break;
}
}
}
return cur;
}
}
3.実現
MaxRightCutはAbstractCutの抽象的な方法abstract DLNode cut(Set set,String doc)を実現した.
package com.cut.util.cut;
import java.util.Set;
public class MaxRightCut extends AbstractCut {
/**
*
*/
private static final long serialVersionUID = -4574704989104601717L;
//
protected DLLNode cut(Set set,String doc) {
//Queue queue=new ArrayQueue();
DLLNode cur=new DLLNode(" ");
DLLNode head=cur;
//
int wordLength = 7;
//
int len=doc.length();
//
for (int left = 0; left < len; left++) {
for (int right = left + wordLength; right > left; right--) {
if (right > len) {
right = len;
}
String word = doc.substring(left, right);
if (set.contains(word)) {
cur.next=new DLLNode(word);
cur=cur.next;
left = right - 1;
break;
} else if (right-left == 1) {
cur.next=new DLLNode(word);
cur=cur.next;
break;
}
}
}
return head;
}
}
4.組み合わせ
定義クラスCutManagerには2つのプロパティがあります.Cut(分詞メソッドが使用可能)とSet(辞書セット)
package com.cut.main;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Set;
import com.cut.util.Cut;
public class CutManager {
public CutManager() {
set = (Set) dodeserialize("serialize// .dat");
cut=(Cut)dodeserialize("serialize// .dat");
}
private Cut cut;
private Set set;
public String doCut(String doc) {
return cut.doCut(set, doc);
}
//
public void SelecteSet(String name) {
set = (Set) dodeserialize("serialize//" + name + ".dat");
}
//
public void SelecteCut(String name) {
cut = (Cut) dodeserialize("serialize//" + name + ".dat");
}
//
public void doSerialize(Object o, String URL) {
try {
FileOutputStream outFile = new FileOutputStream(URL);
ObjectOutputStream outStream = new ObjectOutputStream(outFile);
outStream.writeObject(o);
outStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//
public Object dodeserialize(String URL) {
Object o = null;
try {
FileInputStream inFile = new FileInputStream(URL);
ObjectInputStream inStream = new ObjectInputStream(inFile);
o = inStream.readObject();
inStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return o;
}
}