自然语言处理基于java实现(1) 之 中文分词

下一篇<自然语言处理基于java实现(2) 之 词性注释>
程序源码下载
一. 题目如下:
1、针对人民日报语料,编写程序:
抽取词表
统计总词数、不同的词及其次数。输出文件格式:
第一行是语料库中的总词数,之后每行一个词及其次数,按照词频从小到大排序。如:
总词数:10000
#韩国:169
#民族:571
……
去除语料中的分词和词性标记,形成未加工的语料(原始文本)
2、基于上述词表,编写一个正向最大匹配分词程序。程序功能:
输入:没有分过词的文件或一段文本
输出:分过词的文件或一段文本。
3、编写一个评价程序,自动评价分词结果的准确率。

人民日报语料截取小部分如下:
19980101-02-002-001/m 忠诚/a 的/u 共产主义/n 战士/n ,/w 久经考验/l 的/u 无产阶级/n 革命家/n 刘/nr 澜涛/nr 同志/n 逝世/v
19980101-02-002-002/m (/w 附/v 图片/n 1/m 张/q )/w
19980101-02-002-003/m 根据/p 刘/nr 澜涛/nr 同志/n 生前/t 遗愿/n 和/c 家属/n 的/u 意见/n ,/w 刘/nr 澜涛/nr 同志/n 的/u 丧事/n 从简/v ,/w 不/d 举行/v 仪式/n 、/w 不/d 保留/v 骨灰/n 。/w

二. 我们的目的是:
1. 将如”忠诚”,”的”等等(除去19980101-02-002-001/m,以及词性标注/w等等)词,进行统计
2. 对统计的词进行出现次数升序排序
3. 基于词库,用最大正向匹配算法,对任意句子进行分词
4. 写一个评价程序

三. 直接上代码:

package experiment1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


/**
 * 词库
 */
public class  Thesaurus{
   

    /**
     * 存储结构为:
     * Entry<单词,次数>
     */
    private  List<Entry<String, Integer>> list = new ArrayList<>();

    /**
     * 加载词库,初始化
     */
    public Thesaurus(String content){
        //进行分词统计
        final Map<String,Integer> MAP = createMAP(content);
        //排序并存入list中
        sortMapByValue(MAP);
    }

    /**
     * 分词
     * @param str 分词的句子
     * @param symbol 分割的符号
     * @return
     */
    public String spitWord(final String str,final String symbol){
        StringBuilder target = new StringBuilder();
        int start = 0;
        while(start<str.length()){
            boolean noWord = true;
            for(int end = str.length();end>start;end--){
                String now = str.substring(start, end);
                for(Entry<String,Integer> e:list){
                    if(e.getKey().equals(now)){
                        target.append(symbol).append(now);
                        start = end;
                        noWord = false;
                        break;
                    }
                }
            }
            if(noWord){
                target.append(symbol).append(str.charAt(start++));
            }
        }
        return target.substring(symbol.length()).toString();
    }

    public int numOfSize(){
        return list.size();
    }

    /**
     * 分词
     *
  • 8
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值