jieba.lcut()的并行分词问题

uubf1zoe  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(77)

简单查看了一下 jieba.enable_parallel() 部分的源代码

def enable_parallel(processnum=None):
    """
Change the module's `cut` and `cut_for_search` functions to the
parallel version.
Note that this only works using dt, custom Tokenizer
instances are not supported.
"""
    global pool, dt, cut, cut_for_search
    from multiprocessing import cpu_count
    if os.name == 'nt':
        raise NotImplementedError(
            "jieba: parallel mode only supports posix system")
    else:
        from multiprocessing import Pool
    dt.check_initialized()
    if processnum is None:
        processnum = cpu_count()
    pool = Pool(processnum)
    cut = _pcut
    cut_for_search = _pcut_for_search

其中只是改写了 cutcut_for_search ,请问可不可以理解为即使调用了 enable_parallel() ,使用 lcut 类的函数还是单进程运行?
以及,Windows系统下Python同样支持 from multiprocessing import Pool ,请问为什么一定要限制在 os.name != 'nt' 下才能使用?

qzwqbdag

qzwqbdag1#

自己回答吧
虽然不知道为什么原作者不在 Windows 下开启多进程模式,但是自己改写了一个粗略版。
思想就是暴力多进程,而且有可能严重消耗内存,适合数据量大同时主机内存空间较大使用

#-*-coding:utf-8-*- 
import jieba
from multiprocessing import Pool,cpu_count

def cut(sentence):
	if sentence!=None:
		sentence = jieba.lcut(sentence,cut_all=False)
		return [i for i in sentence]
	else :
		return None

if __name__ == '__main__':
        path = raw_input("Enter the path: ")
        f = open(path,'r')
        # 读取数据
	data = f.readlines()
        f.close()
        # 创建进程池
	pool = Pool(cpu_count())
	data = pool.map(cut, data)
	pool.close()
	pool.join()

这里要求data为可迭代对象,返回值为多维列表

camsedfj

camsedfj2#

自己回答吧
虽然不知道为什么原作者不在 Windows 下开启多进程模式,但是自己改写了一个粗略版。
思想就是暴力多进程,而且有可能严重消耗内存,适合数据量大同时主机内存空间较大使用

#-*-coding:utf-8-*- 
import jieba
from multiprocessing import Pool,cpu_count

def cut(sentence):
	if sentence!=None:
		sentence = jieba.lcut(sentence,cut_all=False)
		return [i for i in sentence]
	else :
		return None

if __name__ == '__main__':
        path = raw_input("Enter the path: ")
        f = open(path,'r')
        # 读取数据
	data = f.readlines()
        f.close()
        # 创建进程池
	pool = Pool(cpu_count())
	data = pool.map(cut, data)
	pool.close()
	pool.join()

这里要求data为可迭代对象,返回值为多维列表

我测试了下,修改了jieba并行分词的源码,如果在win下运行并行分词,会出现错误,而错误貌似是python-x86/x64下才会出现的问题

相关问题