宋词自动生成系统和中文分词系统

简介: 宋词自动生成系统和中文分词系统

这是根据自然语言处理相关知识实现宋词自动生成系统和中文分词系统。

实现语言为java,编译器eclipse,系统平台windows,算法为基本nlp算法

代码和相应语料库Ci.txt 、词性标注%40人民日报199801.txt

完整代码:https://download.csdn.net/download/weixin_55771290/87897158

第一部分 宋词词频统计

语料库:ci.txt 对应实验一代码

自动分析统计ci.txt,统计宋词的单字词,双字词和三字词。统计后,输出是单字词,双字词和三字词的词典文件。文件中包括相应的词和频度(次数)。

  • 首先为了统计宋词词频,处理语料库中存在许多标点符号,编写StringOperate.java 在StringOperate类中对字符串使用String类的split方法实现删去标点符号功能lineErase函数。
    同时为了生成宋词要统计单字词,双字词和三字词词频,这就需要对去掉标点字符串按规模进行切割,设计stringCut函数实现。同时语料库中含有扒取时的不是中文的字符,编写判断是否为中文字符函数isChinese,在进行切割时运到非中文字符舍去。
  • 之后编写进行文件读写操作FileOperate.java。在FileOperate类中实现readInput读取文件操作。其中solution是LineSolution类的对象,在LineSolution中调用StringOperate.lineErase,通过参数HashMap<String,Integer>dictFreq来统计词和对应词频。如下
try {
      FileReader fr=new FileReader("Ci.txt");
      @SuppressWarnings("resource")
      BufferedReader br=new BufferedReader(fr);
      String line="";
      int i=0;
      while(line!=null) {
        line=br.readLine();
        if(line == null){
              break;
              }
              else if(line.length()>5) {//去除词牌名
                solution.solveLine(line, scale,dictFreq);
              }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }

同时在FileOperate类中实现writeoutput输出对应规模文件操作,文件命名"统计结果"+scale+".txt"

  • 然后在CutAndCount.java的CutAndCount类中通过Word(int scale)函数调用StringOperate.java和FileOperate.java ,按照输入的规模统计词和词频到HashMap,接着通过Map.Entry<String,Integer>生成对应格式字符串entry.getKey() + "\t times: " + entry.getValue()+"\n"
  • 最后在TongJi.java编写主函数,获取用户输入的规模,是单字词,双字词和三字词。调用CutAndCount的Word函数生成对应统计结果文件夹。

第二部分 宋词自动生成

语料库:ci.txt 对应实验二代码

输入词牌,基于宋词的词典和宋词的词牌,按照语言模型,自动随机生成宋词。

  • 首先编写FileOperate.java在实现文件读取readInput函数,读取实验一已经处理好的单字词,双字词和三字词词频统计。代码与实验一相同,但在实验一基础上改进更加便捷,实验二LineSolution声明为interface接口,这样与实验一相比,之后调用readInput函数只需要在调用地方重写solveLine即可,同时这样HashMap也好存储词和词频。
  • 然后编写CreateSongCi类实现宋词自动生成。每个词牌有对应的格式,比如 醉花阴词牌词格式
露芽/初破/云腴细。玉纤/纤/亲试。香雪/透/金瓶,无限/仙风,月下/人微醉。
相如/消渴/无佳思。了知/君/此意。不信/老/卢郎,花底/春寒,赢得/空无睡。
上半与下半各五句,断句格式一样,223。212。212,22,23。
  • 因此我们要生成单字词,双字词和三字词对应的 HashMap 。创建creatNumWord函数实现,在该函数调用FileOperate.readInput重写接口LineSolution中的方法处理文件每一行。
FileOperate.readInput(new LineSolution() {
      @Override
      public void solveLine(String line) {
        // TODO Auto-generated method stub
        String[] lineSplit=line.split("\t times: ");
        if(lineSplit!=null) {
          for(int i=0;i<lineSplit.length-1;i++) {
            //System.out.print(lineSplit[i]);
            word.add(lineSplit[i]);
            times.add(lineSplit[i+1]);
          }
        ans.add(word);
        ans.add(times); 
        }
      }
    },"统计结果"+scale+".txt");
  • 获得HashMap之后还需要随机获取此词表中的高频词,用creatFrequencyPlace函数输入词的规模,获得随机生成高频词。
  • 然后编写对应词牌的词结构。本人只编写的醉花阴, 江城子 和酒泉子三个词牌
  • 最后编写creatCi(String cipai)函数,使用以上函数返回生成的String类型宋词。
  • 最后通过GUI函数实现图形化界面,使用java.awt类实现界面。

第三部分 中文词频统计

语料库 词性标注%40人民日报199801.txt 对应实验三代码

功能:1. 分析统计txt文件统计1元模型和2元模型,输出单词和词频文件,双词和词频文件。 2.用户根据输入中文,能够快速载入文件,并检索判断是单词还是双词。

  • 词性标注%40人民日报199801.txt中例如[香港/ns 特别/a 行政区/n]ns 同胞/n 、/w 澳门/ns 和/c 台湾/ns 同胞/n 、/w 海外/s是由中文/英文字母组成,因此创建ChineseAndEnglish类使用regex.Matcher和regex.Pattern实现isChinese和isEnglish两个布尔函数功能判断是中文还是英文。同时像[香港/ns 特别/a 行政区/n]ns是由内的元素组成的,处理时把替换成/,这样有新的词性nns 。
  • 首先老样子建立文件读取、输出类FileOperate。其中词性标注%40人民日报199801.txt文本格式为UTF-8,使用InputStreamReader和FileOutputStream读取和创建,创建的文本命名格式为scale+"-gram分词统计.txt"和scale+"-gram分词词性统计.txt"。
  • 接着创建TongJi类统计词性标注%40人民日报199801.txt中的单字词和双字词,与实验二相同使用LineSolution接口,统计时通过ChineseAndEnglish类判断中英文,再通过FileOperate输出统计结果文本文件。
  • 之后在创建Judge类实现判断是单词还是双词。通过读取统计后的scale+"-gram分词统计.txt",创建对应的HashMap,再判断输入字符串是否在哈希表中,从而实现单字词和双字词判断。
  • 最后通过GUI类实现图形化界面设计。

第四部分 中文词法分析系统

语料库 词性标注%40人民日报199801.txt 对应实验四代码

功能:根据构建的单词词典和双词词典,用前向最长匹配和后向最长匹配算法实现对用户输入句子进行划分。

  • 首先建立文件读取FileOperate类,使用InputStreamReader用UTF-8格式读取输入的路径地址文件,使用接口LineSolution方法solveLine进行行处理。
  • 然后创建Judge类判断是否是1-gram分词统计.txt里面的词。使用FileOperate.readInput函数时重写接口LineSolution的方法solveLine进行行处理。
  • 之后创建Algorithm类通过调用Judge类方法实现FMM和BMM算法。
  • 最后通过GUI类实现图形化界面设计。
相关文章
|
编译器
GEE脚本——GEE中如何查询历史脚本和防丢失记录
GEE脚本——GEE中如何查询历史脚本和防丢失记录
948 4
|
人工智能 自然语言处理 前端开发
基于RAG和LLM的水利知识大语言模型系统开发有感
在数字化时代,水利行业的智能化管理尤为重要。本文介绍了基于大语言模型(LLM)和检索增强生成(RAG)技术的水利知识问答系统的开发过程。该系统结合了前沿AI技术和水利专业知识,通过构建全面的水利知识库,优化用户体验,确保系统的灵活性和可扩展性。项目展示了AI技术在垂直领域的巨大潜力,为水利行业的智能化发展贡献力量。
|
运维 监控 安全
宝塔Windows面板:轻松管理服务器的图形化神器
宝塔Windows面板是一款专为Windows服务器用户设计的图形化管理工具,旨在简化IIS配置、环境搭建与安全管理等复杂操作。它支持一键部署全栈运行环境(如IIS/Apache、PHP、MySQL等),提供可视化站点管理、安全防护与监控功能,并拥有丰富的插件生态。无论是个人站长、开发者还是中小企业,都能通过这款免费工具快速搭建网站、优化性能并强化安全性。尽管在高版本IIS兼容性和插件丰富度上略逊于Linux版,但其零门槛操作和全面功能仍使其成为理想的入门级服务器管理解决方案。
1187 5
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
7967 8
|
Linux 数据安全/隐私保护 C++
如何使用Cython对python脚本加密成pyd/so
如何使用Cython对python脚本加密成pyd/so
859 0
如何使用Cython对python脚本加密成pyd/so
|
Shell Linux 网络安全
【Python】已完美解决:(pip提示升级)WARNING: There was an error checking the latest version of pip.,
【Python】已完美解决:(pip提示升级)WARNING: There was an error checking the latest version of pip.,
6245 0
|
存储 安全 算法
真实世界的密码学(一)(2)
真实世界的密码学(一)
528 0
|
Ubuntu Python
python3安装clickhouse_sqlalchemy(greenlet) 失败
如果上述方法仍然无法解决问题,建议查阅相关错误信息和官方文档,以获取更详细的帮助。确保你的Python环境和依赖库都在最新版本,有时问题可能会因为版本不兼容而导致安装失败。
770 0
|
存储 负载均衡 Linux
FastDFS介绍-1
FastDFS介绍
628 1
|
弹性计算 并行计算 Linux
【玩转AIGC系列】从0快速搭建个人版“对话大模型”
本教程介绍如何在阿里云GPU云服务器上基于Alpaca大模型快速搭建个人版“对话大模型”。
【玩转AIGC系列】从0快速搭建个人版“对话大模型”