Chinese_segment_augment icon indicating copy to clipboard operation
Chinese_segment_augment copied to clipboard

想了解一下算法的复杂度是多少?是否还有提升的空间

Open nactran opened this issue 7 years ago • 23 comments

文本变长以后非常耗时

nactran avatar Sep 22 '18 06:09 nactran

有的,主要是预先jieba分词的时候没有并行处理。另外字典树取值也可以并行化。这个只是一个demo,欢迎大家一起改进

zhanzecheng avatar Sep 22 '18 06:09 zhanzecheng

node的child从list改成dict就可以了,算法复杂度从O(n)提升为O(1),瓶颈在child的遍历访问

urna avatar Sep 24 '18 08:09 urna

兄弟,程序以否优化一下性能,400M语料搞了2晚上不成功,node的child从list改成dict速度也快不起来,能否修改成并行执行,目前程序只能单核跑,太慢了

agilelab avatar Sep 25 '18 12:09 agilelab

兄弟,程序以否优化一下性能,400M语料搞了2晚上不成功,node的child从list改成dict速度也快不起来,能否修改成并行执行,目前程序只能单核跑,太慢了

附件是我改过的文件,应该可以的,不管这个方案太吃内存了,我用的4G内存只能处理20M的数据

model.py.txt

urna avatar Sep 25 '18 13:09 urna

兄弟,程序以否优化一下性能,400M语料搞了2晚上不成功,node的child从list改成dict速度也快不起来,能否修改成并行执行,目前程序只能单核跑,太慢了

附件是我改过的文件,应该可以的,不管这个方案太吃内存了,我用的4G内存只能处理20M的数据

model.py.txt

node的child从list改成dict了,非常感谢,我也修改了一版model.py,但是功夫不到家,还是很慢 # 正常加载 for count, char in enumerate(word): found_in_child = False # 在节点中找字符 if char in node.child: node = node.child[char] found_in_child = True

agilelab avatar Sep 25 '18 13:09 agilelab

兄弟,程序以否优化一下性能,400M语料搞了2晚上不成功,node的child从list改成dict速度也快不起来,能否修改成并行执行,目前程序只能单核跑,太慢了

附件是我改过的文件,应该可以的,不管这个方案太吃内存了,我用的4G内存只能处理20M的数据

model.py.txt

试了您的代码,236M文本,32G内存,挂了,内存不够,程序估计还有问题,我修改的,能跑下去,但是慢不少

agilelab avatar Sep 25 '18 15:09 agilelab

大佬们有什么改进吗 我这边也是速度太慢了

SefaZeng avatar Oct 13 '18 07:10 SefaZeng

建议大佬们,你们既然优化了,就提交pr,这样方便迭代优化!(不做伸手党)

  1. 把词典内容改小一点,取前100个就行(主要是项目提供词库太大了)
  2. 然后使用python多进程,我最高能开到1000个进程

3427条句子 -- 1min 9s

image

我还在加功能,可以遍历tree 的,测试稳定后,提交pr

jiangzhonglian avatar Oct 18 '18 06:10 jiangzhonglian

model.py.txt 你们优化过的报错 AttributeError: 'list' object has no attribute 'get' 什么鬼

yuanjie-ai avatar Nov 29 '18 10:11 yuanjie-ai

瓶颈主要在很多地方遍历树每一级的子节点。修改方式先把树的构建给改了,改成字典格式。上面mode.py在读的时候没有修改。我这里提交各可运行的文件吧。运行前需删除data目录的root.pkl

model.py.txt

BucherLi avatar Dec 25 '18 13:12 BucherLi

瓶颈主要在很多地方遍历树每一级的子节点。修改方式先把树的构建给改了,改成字典格式。上面mode.py在读的时候没有修改。我这里提交各可运行的文件吧。运行前需删除data目录的root.pkl

model.py.txt

201行函数名要改成find_word,不然报错

Verinoy avatar Apr 27 '19 07:04 Verinoy

感觉作者的代码分享,将child由list改为dict的时候,其他地方同步修改(比如循环判断,获取child等),5w条评论文本由5小时变为10秒

lujingqiao avatar Mar 11 '20 03:03 lujingqiao

瓶颈主要在很多地方遍历树每一级的子节点。修改方式先把树的构建给改了,改成字典格式。上面mode.py在读的时候没有修改。我这里提交各可运行的文件吧。运行前需删除data目录的root.pkl model.py.txt

201行函数名要改成find_word,不然报错

改了之后也有问题 word[0], word[1], word[2] = word[1], word[2], word[0] TypeError: 'tuple' object does not support item assignment

zgw540 avatar Apr 27 '20 05:04 zgw540

瓶颈主要在很多地方遍历树每一级的子节点。修改方式先把树的构建给改了,改成字典格式。上面mode.py在读的时候没有修改。我这里提交各可运行的文件吧。运行前需删除data目录的root.pkl model.py.txt 201行函数名要改成find_word,不然报错

改了之后也有问题 word[0], word[1], word[2] = word[1], word[2], word[0] TypeError: 'tuple' object does not support item assignment

a, b, c = word[1], word[2], word[0] word = (a, b, c) 这样再改一下

xiaolinpeter avatar Jun 18 '20 13:06 xiaolinpeter

没想到大家还在更新hhhh

nactran avatar Jun 18 '20 18:06 nactran

建议大佬们,你们既然优化了,就提交pr,这样方便迭代优化!(不做伸手党)

  1. 把词典内容改小一点,取前100个就行(主要是项目提供词库太大了)
  2. 然后使用python多进程,我最高能开到1000个进程

3427条句子 -- 1min 9s

image

我还在加功能,可以遍历tree 的,测试稳定后,提交pr

我测试多进程的时候,因为只有同一颗树root,多个进程运行的时候就找不到root了,想请教你是怎么做的呢? 报错内容如下: root.add(d) NameError: name 'root' is not defined

hnqhnq avatar Oct 13 '20 03:10 hnqhnq

感觉作者的代码分享,将child由list改为dict的时候,其他地方同步修改(比如循环判断,获取child等),5w条评论文本由5小时变为10秒

请问可以分享一下你修改的代码么?谢谢。

w-zm avatar Apr 25 '21 06:04 w-zm

我这里会报错出现 KeyError: 某个词不在 left与right 中 result[key] = (values[0] + min(left[d], right[d])) * values[1]

enze5088 avatar Jul 07 '22 04:07 enze5088

瓶颈主要在很多地方遍历树每一级的子节点。修改方式先把树的构建给改了,改成字典格式。上面mode.py在读的时候没有修改。我这里提交各可运行的文件吧。运行前需删除data目录的root.pkl

model.py.txt

厉害了。从一个小时到十多秒。感谢感谢。

bigheaven avatar Jul 14 '22 01:07 bigheaven

我这里会报错出现 KeyError: 某个词不在 left与right 中 result[key] = (values[0] + min(left[d], right[d])) * values[1]

碰到了同样的问题

zhuchenxi avatar Jul 19 '22 09:07 zhuchenxi

model.py.txt 你们优化过的报错 AttributeError: 'list' object has no attribute 'get' 什么鬼

删除data目录的root.pkl

ReadyTeresa avatar Dec 01 '22 03:12 ReadyTeresa

我这里会报错出现 KeyError: 某个词不在 left与right 中 result[key] = (values[0] + min(left[d], right[d])) * values[1]

碰到了同样的问题

想知道怎么解决的呀

ReadyTeresa avatar Dec 01 '22 12:12 ReadyTeresa