1.接口
定义一个接口 Cut ,并实现 java.io.Serializable
然后用抽象类 AbstractCut 实现 Cut 接口,所以 AbstractCut 子类可以实现对象序列化操作
2.抽象
MaxRightCut(最大向右分词) 和 MaxleftCut (最大向左分词) 继承 AbstractCut
3.实现
MaxRightCut 和 MaxleftCut 分别实现了AbstractCut 的抽象方法 abstract DLLNode cut(Set set, String doc);
4.组合
定义类 CutManager 具有两个属性,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 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 DLLNode 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 DLLNode 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 具有两个属性,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;
}
}
分享到:
- 2009-04-08 09:11
- 浏览 1513
- 评论(0)
- 论坛回复 / 浏览 (0 / 3191)
- 查看更多
相关推荐
基于PFR语料库的CRF中文分词程序python源码+文本数据(中文信息处理小作业).zip 基于PFR语料库的CRF中文分词程序python源码+文本数据(中文信息处理小作业).zip 基于PFR语料库的CRF中文分词程序python源码+文本数据...
下载并研究这个Java源码,不仅可以深入理解分词的实现原理,还可以为自己的项目提供高质量的分词工具。对于Java开发者来说,这是一个学习自然语言处理的好资源,对于提升自身的编程能力和算法理解都有着积极的意义。
输入任意一篇中文文档,能够分析出里面可能的词组,然后输出,输入的文档越多,结果越准确, 不需要外部字典,输出的重点词汇用"*"开头,可以调整关键参数来调整准确率,附完整的源代码和测试文档(输入 的学习文档...
在IT行业中,中文分词是自然语言处理(NLP)中的关键步骤,它涉及到将连续的汉字序列分割成有意义的词汇单元,以便计算机能够理解和分析文本。本话题将聚焦于如何使用C#语言来编写一个简单的中文分词程序。C#是一种...
基于小程序云开发的垃圾分类微信小程序源码+项目说明.zip 【主要功能】 垃圾名称搜索(分词搜索),下拉到底部可加载更多,专题页面 使用云开发 + 小程序前端框架开发,数据都存储在数据库+存储空间內 垃圾名称搜索...
### VBA编写的分词程序知识点解析 #### 一、VBA简介 VBA(Visual Basic for Applications)是Microsoft Office套件中的一种基于过程的编程语言。它允许用户自定义功能并通过编写脚本来扩展应用程序的功能。VBA广泛...
3. **多渠道销售**:该版本支持PC端、移动端(如H5、小程序、APP)等多渠道销售,适应了消费者多元化购物习惯。 4. **支付集成**:内置多种支付接口,如支付宝、微信支付等主流支付方式,方便商家和消费者进行交易...
分词组件V2.3.1源码 程序介绍: 盘古分词是一个中英文分词组件。作者eaglet 曾经开发过KTDictSeg 中文分词组件,拥有大量用户来自51ASPX。 作者基于之前分词组件的开发经验,结合最新的开发技术重新编写了盘古...
藏头诗题作诗微信小程序源码是一款专为微信用户设计的应用程序,它允许用户通过输入特定的文字,自动生成符合这些文字首字母的诗词作品。这个小程序源码的开发涉及了多个IT领域的知识,包括前端开发、后端服务、...
【标题】:“可搜题的微信小程序(含前端后端)” 这个项目是一个全面的教育类微信小程序,它集成了多种功能,旨在帮助用户轻松搜索和解答各类问题。该小程序的核心特性包括题目上传、关键词识别、聊天交互、积分...
在自然语言处理(NLP)领域,中文分词是预处理的关键步骤,因为中文没有明显的空格来区分单词,所以需要通过特定算法将连续的汉字序列切分成具有语义意义的词汇单元。 【描述】:“直接更改扩展名为jar即可”意味着...
HanLP:分词工具 PageHelper:MyBatis分页插件 weixin-java-miniapp:微信开发工具包 模块功能简介: api_mall: 商城模块,整合淘宝、拼多多、唯品会、蘑菇街平台的SDK,抹除各个平台间的差异,提供了统一的API api...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
不过在大量分词中,由于边分词边完成词库载入,因此内容越多,反而会觉得速度越快,这是正常现象,对于支持PHP-APC的服务器,本程序支持对词典进行缓存,这样做之后理论的速度并不慢于那些带组件的分词程序了。...
词库比较小,分词精度估计不高大,建议实际应用的时候才用更大,跟完整的词库,最好根据内容的相关性这样最好. 提供一个我自己用的词库,主要用于购物网站的分词的,在程序文件夹得kic1.txt里面 修改成kic.txt 然后重新...
这包括用户在小程序内输入的关键词,以及对这些关键词进行预处理,如分词、去停用词等,以便更好地匹配数据库中的内容。 2. **搜索引擎搭建**:为了实现检索功能,需要构建一个能够高效搜索文本的引擎。这通常涉及...
【标题】"基于Java的实例源码-中文分词工具包 smallseg.zip"指的是一个包含Java编程语言实现的中文分词工具包。分词是自然语言处理中的关键步骤,它将连续的文本字符串分解成有意义的词语单元,这对于信息检索、机器...
该补丁仅适用于友价商城源码,正版用户请登录后台直接在线升级 以下是本次补丁的修复内容: 手机端: 1、优化实名认证模块(通过手机扫描认证,并且提现主体必须跟实名认证一致) 电脑端: 2、商品搜索实现分词...
word分词器java源码描述 Completely是一个 Java 自动完成库。 自动完成涉及根据部分查询预测用户可能键入的单词或短语。 目标是在用户制定查询时提供即时反馈并避免不必要的输入。 性能是一个关键问题,因为用户的...
标题 "sorlr + tomcat+ 庖丁解牛中文分词 配置文档" 提到的是一个关于在Apache Solr中集成Tomcat服务器,并利用庖丁解牛中文分词工具进行中文处理的配置教程。这个配置过程对于搭建支持中文搜索的Solr环境至关重要。...