seg:NLP之正向最大匹配分词

article/2025/8/23 13:26:03

已迁移到我新博客,阅读体验更佳seg:NLP之正向最大匹配分词
完整代码实现放在我的github上:click me

一、任务要求

  • 实现一个基于词典与规则的汉语自动分词系统。

二、技术路线

  • 采用正向最大匹配(FMM)方法对输入的中文语句进行分词,具体的实现可以分为下面几个步骤:
    1. 对输入的一个中文语句,首先在程序中判断并确保语句中不包含数字或者字母
    2. 在句子中的当前位置开始取与词典dic_ce.txt中最大匹配长度的词作为一个分词段,如果没有在词典中成功匹配到就将句子在当前匹配位置的这个字作为一个分词段并将匹配位置向前挪一个位置
    3. 重复第2步直到匹配位置移到句末
  • 下面是用FMM方法分词的具体实现:
//param@seg:保存分词段结果的vector
//param@st:带分词的中文语句
void segment(vector<string> &seg, string st) {int pos = 0;int sz = st.length();string t;int cnt = 0, spos;while (pos < sz) {cnt = pos;spos = pos;t = "";while (st[cnt]) {t += st.substr(cnt, 2);if (wordmap.find(t) != wordmap.end())pos = cnt + 2;cnt += 2;}if (pos == spos) {seg.push_back(st.substr(spos, 2));pos += 2;}else {seg.push_back(st.substr(spos, pos - spos));}}return;
}

三、数据说明

  • 汉英词典dic_ce.txt,读取其中的汉词用于与句中词进行匹配,词典采用GBK编码,下面是给出文件内容示例:
//gbk编码,每行第一个词是汉词,后面是它对应的英译单词,以','分隔
阿弥陀佛,Amitabha
阿米巴,amoeba,amoebae
阿姆斯特丹,Amsterdam
阿斯匹林,aspirin

四、性能分析

  • 假设输入中文语句长度为n,程序时间复杂度最坏情况下是O(n^2),最好情况是O(n),下面是程序分析结果及分词耗时评测的截图:

1541992901499

五、运行环境

  • 将执行文件seg.exe与数据字典dic_ce.txt放在同一个目录下,然后点击seg.exe即可正常运行,进入运行窗口后根据提示进行输入即可得到分词结果。

转载于:https://www.cnblogs.com/brooksj/p/10765656.html


http://chatgpt.dhexx.cn/article/6XBR8wIt.shtml

相关文章

Elasticsearch搜索技术实战

elasticsearch下载安装 本篇前述的ES版本是7.14.2&#xff0c;实现了与Mysql的数据同步&#xff0c;ES端的搜索与分词&#xff1b;后来由于和Springcloud&#xff08;spring-data-elasticsearch:3.0.6&#xff09;集成发现版本问题&#xff0c;换成ES5.5.0&#xff0c;所以完整…

Docker技术

在这里插入代码片# Docker 官方文档地址:https://www.docker.com/get-started 中文参考手册:https://docker_practice.gitee.io/zh-cn/ 1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are…

Elasticsearch - 文档分析,IK分词器;文档冲突(十二)

阅读本文前可先参考 Elasticsearch - Elasticsearch详解&#xff1b;安装部署&#xff08;一&#xff09;_MinggeQingchun的博客-CSDN博客 https://blog.csdn.net/MinggeQingchun/article/details/126855747 一、文档分析 文档分析过程如下&#xff1a; 1、将一块文本分成适…

springboot+Elasticsearch实现word,pdf,txt内容抽取并高亮分词全文检索

文章目录 需求 一、环境 二、功能实现 1.搭建环境 2.文件内容识别 三.代码 需求 产品希望我们这边能够实现用户上传PDF,WORD,TXT之内得文本内容&#xff0c;然后用户可以根据附件名称或文件内容模糊查询文件信息&#xff0c;并可以在线查看文件内容 一、环境 项目开发环境&…

使用lucce分词怎么_ElasticSearch 分词器,了解一下

这篇文章主要来介绍下什么是 Analysis &#xff0c;什么是分词器&#xff0c;以及 ElasticSearch 自带的分词器是怎么工作的&#xff0c;最后会介绍下中文分词是怎么做的。 首先来说下什么是 Analysis&#xff1a; 什么是 Analysis&#xff1f; 顾名思义&#xff0c;文本分析就…

自然语言处理 # 中文分词技术 概述

定义 中文分词&#xff08;Chinese Word Segmentation&#xff09;就是将连续的字序列按照一定的规范重新组合成词序列的过程。 Ques:为什么要分词&#xff1f; Ans: 词是最小的能够独立运用的语言单位 Ques:什么是独立运用呢&#xff1f; Ans:它可以解释为“单独做句法成分或…

Python 中 concurrent.futures 模块使用说明

Python 中 concurrent.futures 模块使用说明 转载请注明出处&#xff1a;https://blog.csdn.net/jpch89/article/details/87643972 文章目录 Python 中 concurrent.futures 模块使用说明0. 参考资料1. 概述2. Executor Object 执行器对象3. ThreadPoolExecutor 线程池执行器4.…

【ruoyi】java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoo

前言 ruoyi 4.6.0jdk1.8 错误 11:48:16.879 [http-nio-9031-exec-25] INFO c.r.f.s.r.UserRealm - [doGetAuthenticationInfo,128] - 对用户[admin]进行登录验证..验证未通过{} java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThre…

【学习积累】Queue 与 ConcurrentQueue性能测试

在 C# 中&#xff0c;关于队列&#xff08;Queue&#xff09;有两种&#xff0c;一种就是我们普通使用的队列&#xff0c;另一种是线程安全的队列 ConcurrentQueue<T> 。 ConcurrentQueue表示线程安全的先进先出 (FIFO) 集合。https://learn.microsoft.com/zh-cn/dotnet…

Python报错ModuleNotFoundError: No module named ‘concurrent‘

在测试Python的多线程时&#xff0c;根据官方的说法&#xff0c;concurrent.futures在Python3中已经内置了&#xff0c;不需要下载安装&#xff0c;如果是Python2则需要运行pip install futures进行安装。。。 这样导入&#xff0c;两种写法均可 import concurrent.futures #…

go语言工具_Concurrent Map

Concurrent Map 背景 map是平时项目中经常用到的数据类型&#xff0c;但是如果多个协程去读写同一个map时&#xff0c;为了不发生数据错误&#xff0c;经常去将其和锁封装成一个新的map。像以下两种示例。 type LockMap struct { m map[interface{}]interface{} l…

C#线程安全队列ConcurrentQueue

ConcurrentQueue成员函数 入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。 void Enqueue(T item) 入队函数&#xff0c;当队列已满时会自动增加队列容量。 bool TryDequeue(T* result) 尝试移除并返回并发队列开头处对象&#xff0c;…

项目优化>C++,concurrentqueue(高性能并发队列)

项目中的数据队列基于轮询和selep的实时性及CUP性能差&#xff0c;需要进行优化&#xff0c;尝试使用concurrentqueue进行优化。网上有一些资料介绍,可供参考。 使用后的个人理解:一个线程安全的queue&#xff0c;并且concurrentqueue的线程安全并不是一味的加锁&#xff0c;它…

ConcurrentMap

ConcurrentMap&#xff0c;它是一个接口&#xff0c;是一个能够支持并发访问的java.util.map集合&#xff1b; ConcurrentHashMap是一个线程安全&#xff0c;并且是一个高效的HashMap。 spring 缓存注解 通过查看源代码发现将数据存在ConcurrentMap中 1 Map并发集合 1.1 Co…

学习线程安全队列ConcurrentQueue

首先,基本使用&#xff1a;入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。 一、ConcurrentQueue内部结构: 1.实现原理 众所周知&#xff0c;在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2.使用链表实现的队列…

并发系列(六)-----concurrent的简单介绍

一 简介 concurrent包是jdk1.5引入的重要的包&#xff0c;主要代码由大牛Doug Lea完成。这个包下的一些类如果用好了可以很方便的保证数据在多线程下操作的正确性。就比如说线程共享的i&#xff0c;如果使用concurrent包下的Atomic系列类可以很方便的解决这个问题。这篇文章简单…

python并发之concurrent快速入门

导读&#xff1a;我很笨&#xff0c;但是我很快——计算机之所以计算能力如此出众&#xff0c;不在于其有多智能&#xff0c;而是因为它超快的执行速度&#xff0c;而多核心则可以进一步成倍的提高效率。在python中&#xff0c;concurrent库就是用于完成并发的模块之一。 01 初…

Java 并发工具包(concurrent)详解

目录 一、concurrent并发包 二、ReentrantLock&#xff08;可重入锁&#xff09; 1、锁状态中断与可重入 2、尝试非阻塞地获取锁 3、等待可中断 4、设置公平锁 三、CountDownLatch&#xff08;门栓&#xff09; 四、cyclicBarrier&#xff08;栅栏&#xff09; 五、…

JAVA中split函数的用法

JAVA中split函数的用法 只写经常使用的&#xff0c;并不完整。 1.基本用法&#xff0c;将字符串按照指定字符串进行分割&#xff0c;例如&#xff1a; public class Main {public static void main(String[] args) {String ss "abcabcdefg";String[] split ss.sp…

C语言实现split函数

实现类似JAVA编程语言中split函数&#xff1a; &#xff08;这里以空格为分隔符进行演示&#xff09; 函数的声明&#xff1a;void split(char *src,const char *separator,char **dest,int *num) {}变量&#xff1a; 1.*src&#xff1a;要进行分割的字符串地址&#xff0c; 2…