在进行中文分词的时候,我们如何利用多核提升分词速度呢?
计算机很早就进入多核心时代了,不充分利用多核CPU是对计算资源的一种极大的浪费。
在对一段文本进行分词的时候,word分词器的处理步骤如下:
1、把要分词的文本根据标点符号分割成句子;
2、以分割后的句子为基本单位进行分词;
3、把各个句子的分词结果按原来的句子顺序组合起来;
word分词器充分考虑到了利用多核提升分词速度这个问题,在第1步完成后,如果分割出了多个句子,那么这多个句子就可以同时(并行)进行分词,这样就能充分利用多核CPU来提升分词速度。
word分词器提出了两种解决方案,我们分别来介绍:
1、多线程
在Java中,多线程可以帮助我们充分利用CPU,我们可以根据自己的机器情况及其应用特点在配置文件word.conf中指定合适的线程池大小:
#配置分词使用的固定线程池大小,根据机器的情况设置合适的值 thread.pool.size=4
代码实现核心片段如下:
private static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(WordConfTools.getInt("thread.pool.size", 4)); @Override public List<Word> seg(String text) { List<String> sentences = Punctuation.seg(text, KEEP_PUNCTUATION); if(sentences.size() == 1){ return segSentence(sentences.get(0)); } //如果是多个句子,可以利用多线程提升分词速度 List<Future<List<Word>>> futures = new ArrayList<>(sentences.size()); for(String sentence : sentences){ futures.add(submit(sentence)); } sentences.clear(); List<Word> result = new ArrayList<>(); for(Future<List<Word>> future : futures){ List<Word> words; try { words = future.get(); if(words != null){ result.addAll(words); } } catch (InterruptedException | ExecutionException ex) { LOGGER.error("获取分词结果失败", ex); } } futures.clear(); return result; } /** * 将切分句子的任务提交给线程池来运行 * @param sentence 句子 * @return 切分结果 */ private Future<List<Word>> submit(final String sentence){ return EXECUTOR_SERVICE.submit(new Callable<List<Word>>(){ @Override public List<Word> call() { return segSentence(sentence); } }); }
2、Parallel Stream
Java8 support functional-style operations on streams of elements,if we use "parallelStream()" instead of "stream()" , the serial process can automatic change to parallel process.
Java8的内置的并行处理功能,通过上面的简短的介绍我们应该有所了解,使用这种方案的好处是,随着JDK的改进,程序的性能会间接受益,而且我们的代码可以更简单,虽然我们不再能够控制并行度,比如上面我们能指定线程数,但是我们可以放心JRE会做出合理的调度与优化,而且人为指定线程数很多时候都不是最合理的。
我们可以在配置文件word.conf中指定是否启用并行分词:
#是否利用多核提升分词速度 parallel.seg=true
上面多线程的代码可以简化为:
private static final boolean PARALLEL_SEG = WordConfTools.getBoolean("parallel.seg", true); @Override public List<Word> seg(String text) { List<String> sentences = Punctuation.seg(text, KEEP_PUNCTUATION); if(sentences.size() == 1){ return segSentence(sentences.get(0)); } if(!PARALLEL_SEG){ //串行顺序处理,不能利用多核优势 return sentences.stream().flatMap(sentence->segSentence(sentence).stream()).collect(Collectors.toList()); } //如果是多个句子,可以利用多核提升分词速度 Map<Integer, String> sentenceMap = new HashMap<>(); int len = sentences.size(); for(int i=0; i<len; i++){ //记住句子的先后顺序,因为后面的parallelStream方法不保证顺序 sentenceMap.put(i, sentences.get(i)); } //用数组收集句子分词结果 List<Word>[] results = new List[sentences.size()]; //使用Java8中内置的并行处理机制 sentenceMap.entrySet().parallelStream().forEach(entry -> { int index = entry.getKey(); String sentence = entry.getValue(); results[index] = segSentence(sentence); }); sentences.clear(); sentences = null; sentenceMap.clear(); sentenceMap = null; List<Word> resultList = new ArrayList<>(); for(List<Word> result : results){ resultList.addAll(result); } return resultList; }
如果对更多的细节感兴趣,请点击这里查看代码的源文件。
相关推荐
本文将深入探讨jieba分词库的并行分词功能,以及如何利用Python的multiprocessing模块来提升分词效率。 jieba分词库是Python中的一款强大的中文分词工具,它不仅提供了精确模式、全模式和搜索引擎模式等多种分词...
总的来说,Delphi实现的这个简单中文分词系统虽然存在速度慢的问题,但它提供了一个基础平台,可以通过进一步优化算法和引入更先进的技术,来提升分词的效率和准确度,更好地服务于各种NLP应用场景。
- **并行处理**:利用多核CPU或GPU进行并行分词,提高处理速度。 - **自学习能力**:训练模型自动学习新的词汇和模式,提升分词准确性。 这个C++实现的中文分词系统提供了基础的分词功能,但对于实际应用,可能...
paoding采用了动态编译策略,能够在运行时生成字节码,从而提高分词速度。此外,它还支持自定义词典,可以适应各种领域的分词需求。 2. **应用场景** paoding广泛应用于搜索引擎、推荐系统、信息检索、文本挖掘等...
此外,它还支持并行分词,可以有效利用多核处理器提高处理速度,对于大数据量的文本处理尤为有利。 总的来说,dotnet-jieba是.NET Core开发者处理中文文本的强大工具,它集成了jieba分词器的精华,为.NET社区贡献了...
4. **并行处理**:分词结果可以方便地进行并行处理,利用多核CPU的优势,进一步提升搜索效率。 5. **精准匹配**:分词可以提高搜索结果的精确性,用户输入的关键词更可能与分词后的词汇相匹配,从而提供更准确的...
"Go-gse"库的核心是采用高效的分词算法,如基于词典的精确匹配法和动态规划算法等,确保了在处理大量文本时的速度和准确性。分词是自然语言处理的第一步,它将连续的字符序列分割成具有语义的独立单元,例如单词或...
1. 结巴分词还支持分词并行化,利用多核CPU提升分词速度。 2. 提供了基于pandas的DataFrame接口,方便在大数据分析中集成使用。 3. 可以将分词结果转换成多种格式,如json、txt等,便于数据交换和存储。 五、jieba...
通过构建Trie树,可以高效地进行关键词匹配,减少不必要的比较操作,提升分词速度。 2. **HMM模型**:隐马尔科夫模型(Hidden Markov Model,简称HMM)是统计学中的一个重要概念,常用于自然语言处理中的词性标注和...
1. 分词器的并行化:利用多核CPU进行并发处理,提高整体速度。 2. 缓存策略:对频繁查询的词语进行缓存,减少重复计算。 3. 配置合适的Elasticsearch索引设置,如分片和副本的数量,以适应不同的硬件资源和负载情况...
- **并行分词**:jieba提供多线程分词接口,可以利用多核CPU提升分词速度。 - **自定义分词模式**:除了默认的精确模式,还有全模式和搜索引擎模式,用户可根据需求选择。 - **第三方扩展**:jieba与其他库结合,...
3. 性能优化:对于大规模文本处理,可以考虑并行化分词,利用多核CPU提升处理速度。 4. 结果评估:通过标准的评测集(如CTB、SIGHAN等)对分词结果进行评估,以衡量分词的准确性。 总之,Smallseg是一个为Python ...
此外,为了提高处理速度,`jieba`还支持并行处理,可以利用多核CPU的优势加快处理速度。 总结来说,这个项目展示了如何使用Python的`jieba`库对文件夹中的所有文件进行批量分词处理,这在处理大量中文文本数据时...
5. **并行处理**:利用多核CPU进行并行分词,进一步提升处理效率。 6. **标点符号处理**:库内置了对标点符号的处理逻辑,可以按照需求保留或忽略标点符号。 7. **高效内存管理**:Tokenizers库采用零拷贝技术,...
库还支持并行分词,可以利用多核CPU的优势,显著提高处理速度。这在处理大量文本时,如批量处理语料库或者在线服务,能大幅提升效率。 **6. 兼容性与安装** `tokenizers-0.5.0-cp37-cp37m-manylinux1_x86_64.whl` ...
单线程模式适用于简单快速的分词需求,而多线程模式则可以有效利用多核处理器资源,提高大规模文本处理的效率。此外,IKAnalyzer还支持动态加载词典,这意味着在程序运行时可以实时更新词典,适应不断变化的词汇环境...
1. **速度**:`tokenizers`利用了C++后端,使得分词过程非常快速,相比其他纯Python实现有显著性能提升。 2. **内存效率**:该库采用流式处理和动态内存管理策略,即使处理大型文本也能保持低内存占用。 3. **可定制...
1. **快速分词**:Tokenizers利用C++后端实现,使得其分词速度远超纯Python库,尤其在大规模文本处理时,性能提升显著。 2. **并行处理**:支持多线程并行化,能够充分利用现代多核处理器的优势,提高处理效率。 3...
HanLP库的优势在于它采用了高性能的并行计算框架,能够有效地利用多核CPU进行并行处理,从而在保持高准确率的同时,实现了快速的文本处理速度。此外,HanLP的设计十分注重易用性,提供了清晰的API文档和丰富的示例...
线程过多可能会导致系统资源的过度消耗,而线程过少则无法充分利用多核处理器的优势。通常,线程池的大小可以根据可用CPU核心数进行设定。 总结来说,Lucene的多线程多目录索引创建是通过将任务分解,利用线程池...