`

如何利用多核提升分词速度

阅读更多

在进行中文分词的时候,我们如何利用多核提升分词速度呢?

计算机很早就进入多核心时代了,不充分利用多核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;
}

 

如果对更多的细节感兴趣,请点击这里查看代码的源文件

 

 

 

 

 

 

 

 

3
1
分享到:
评论

相关推荐

    结巴分词含代码可运行

    本文将深入探讨jieba分词库的并行分词功能,以及如何利用Python的multiprocessing模块来提升分词效率。 jieba分词库是Python中的一款强大的中文分词工具,它不仅提供了精确模式、全模式和搜索引擎模式等多种分词...

    Delphi实现的简单中文分词

    总的来说,Delphi实现的这个简单中文分词系统虽然存在速度慢的问题,但它提供了一个基础平台,可以通过进一步优化算法和引入更先进的技术,来提升分词的效率和准确度,更好地服务于各种NLP应用场景。

    C++实现的中文分词

    - **并行处理**:利用多核CPU或GPU进行并行分词,提高处理速度。 - **自学习能力**:训练模型自动学习新的词汇和模式,提升分词准确性。 这个C++实现的中文分词系统提供了基础的分词功能,但对于实际应用,可能...

    paoding 分词

    paoding采用了动态编译策略,能够在运行时生成字节码,从而提高分词速度。此外,它还支持自定义词典,可以适应各种领域的分词需求。 2. **应用场景** paoding广泛应用于搜索引擎、推荐系统、信息检索、文本挖掘等...

    dotnet-jieba中文分词NETCore版

    此外,它还支持并行分词,可以有效利用多核处理器提高处理速度,对于大数据量的文本处理尤为有利。 总的来说,dotnet-jieba是.NET Core开发者处理中文文本的强大工具,它集成了jieba分词器的精华,为.NET社区贡献了...

    php 分词(切词)

    4. **并行处理**:分词结果可以方便地进行并行处理,利用多核CPU的优势,进一步提升搜索效率。 5. **精准匹配**:分词可以提高搜索结果的精确性,用户输入的关键词更可能与分词后的词汇相匹配,从而提供更准确的...

    Go-gse-Go语言高效分词支持英文中文日文等

    "Go-gse"库的核心是采用高效的分词算法,如基于词典的精确匹配法和动态规划算法等,确保了在处理大量文本时的速度和准确性。分词是自然语言处理的第一步,它将连续的字符序列分割成具有语义的独立单元,例如单词或...

    jieba1-0.42.1.zip

    1. 结巴分词还支持分词并行化,利用多核CPU提升分词速度。 2. 提供了基于pandas的DataFrame接口,方便在大数据分析中集成使用。 3. 可以将分词结果转换成多种格式,如json、txt等,便于数据交换和存储。 五、jieba...

    cppjieba工程源码

    通过构建Trie树,可以高效地进行关键词匹配,减少不必要的比较操作,提升分词速度。 2. **HMM模型**:隐马尔科夫模型(Hidden Markov Model,简称HMM)是统计学中的一个重要概念,常用于自然语言处理中的词性标注和...

    基于HanLP自然语言处理包的elasticsearch分词器.zip

    1. 分词器的并行化:利用多核CPU进行并发处理,提高整体速度。 2. 缓存策略:对频繁查询的词语进行缓存,减少重复计算。 3. 配置合适的Elasticsearch索引设置,如分片和副本的数量,以适应不同的硬件资源和负载情况...

    jieba-0.42.1.rar

    - **并行分词**:jieba提供多线程分词接口,可以利用多核CPU提升分词速度。 - **自定义分词模式**:除了默认的精确模式,还有全模式和搜索引擎模式,用户可根据需求选择。 - **第三方扩展**:jieba与其他库结合,...

    Smallseg for python3.5.2

    3. 性能优化:对于大规模文本处理,可以考虑并行化分词,利用多核CPU提升处理速度。 4. 结果评估:通过标准的评测集(如CTB、SIGHAN等)对分词结果进行评估,以衡量分词的准确性。 总之,Smallseg是一个为Python ...

    fenci.rar_jieba_jieba 批量

    此外,为了提高处理速度,`jieba`还支持并行处理,可以利用多核CPU的优势加快处理速度。 总结来说,这个项目展示了如何使用Python的`jieba`库对文件夹中的所有文件进行批量分词处理,这在处理大量中文文本数据时...

    Python库 | tokenizers-0.0.8-cp35-cp35m-win_amd64.whl

    5. **并行处理**:利用多核CPU进行并行分词,进一步提升处理效率。 6. **标点符号处理**:库内置了对标点符号的处理逻辑,可以按照需求保留或忽略标点符号。 7. **高效内存管理**:Tokenizers库采用零拷贝技术,...

    Python库 | tokenizers-0.5.0-cp37-cp37m-manylinux1_x86_64.whl

    库还支持并行分词,可以利用多核CPU的优势,显著提高处理速度。这在处理大量文本时,如批量处理语料库或者在线服务,能大幅提升效率。 **6. 兼容性与安装** `tokenizers-0.5.0-cp37-cp37m-manylinux1_x86_64.whl` ...

    IKAnalyzer2012FF_hf1 jar 和src源码

    单线程模式适用于简单快速的分词需求,而多线程模式则可以有效利用多核处理器资源,提高大规模文本处理的效率。此外,IKAnalyzer还支持动态加载词典,这意味着在程序运行时可以实时更新词典,适应不断变化的词汇环境...

    Python库 | tokenizers-0.8.1rc1-cp37-cp37m-manylinux1_x86_64.whl

    1. **速度**:`tokenizers`利用了C++后端,使得分词过程非常快速,相比其他纯Python实现有显著性能提升。 2. **内存效率**:该库采用流式处理和动态内存管理策略,即使处理大型文本也能保持低内存占用。 3. **可定制...

    Python库 | tokenizers-0.4.2-cp38-cp38-manylinux1_x86_64.whl

    1. **快速分词**:Tokenizers利用C++后端实现,使得其分词速度远超纯Python库,尤其在大规模文本处理时,性能提升显著。 2. **并行处理**:支持多线程并行化,能够充分利用现代多核处理器的优势,提高处理效率。 3...

    hanlp1.7jar包下载

    HanLP库的优势在于它采用了高性能的并行计算框架,能够有效地利用多核CPU进行并行处理,从而在保持高准确率的同时,实现了快速的文本处理速度。此外,HanLP的设计十分注重易用性,提供了清晰的API文档和丰富的示例...

    lucene - 副本.zip

    线程过多可能会导致系统资源的过度消耗,而线程过少则无法充分利用多核处理器的优势。通常,线程池的大小可以根据可用CPU核心数进行设定。 总结来说,Lucene的多线程多目录索引创建是通过将任务分解,利用线程池...

Global site tag (gtag.js) - Google Analytics