中国語分詞ウィジェット(ソースコードダウンロード)


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を実装

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;
	}

}