blmoistawinde / HarvestText

文本挖掘和预处理工具(文本清洗、新词发现、情感分析、实体识别链接、关键词抽取、知识抽取、句法分析等),无监督或弱监督方法
MIT License
2.42k stars 329 forks source link

新词发现大规模预料处理速度好像比较慢? #14

Open QI-charles opened 4 years ago

QI-charles commented 4 years ago

配置 8G内存,跑5W条预料(简历招聘文本),用了大概2小时。 还有请问新词发现列出的新词是按指标排序好的么?是什么指标排序的?词频或者聚合度还是其他指标?

blmoistawinde commented 4 years ago

分别回答两个问题:

  1. 速度慢的问题

算法基本是固定的,没有太多优化空间。可能的话,建议从数据层面优化速度,比如把这些语料按照行业/公司/岗位先分类,然后分别执行新词发现。因为算法的时间复杂度大约是平方级别的,分而治之可以提升效率,还可能为不同的维度提供不同的发现。

  1. 指标排序问题

目前没有默认进行排序,不过这里为发现的新词提供了多个指标,可以按照需要选择合适的指标排序。

对于new_words_info = ht.word_discover(para)得到的new_words_info,它是一个这样的dataframe:

          freq  left_ent  right_ent         agg     score
text                                                     
父亲    0.008442  1.033562   2.397895  118.454545  0.060068
看见    0.005372  1.747868   1.549826   69.098485  0.032588
我的    0.003837  1.332179   1.609438    4.431973  0.007299
了一    0.003070  1.039721   1.039721   14.849003  0.007480
他们    0.003070  1.039721   1.039721   21.186992  0.008465
桔子    0.003070  1.039721   1.386294  100.230769  0.014902
自己    0.003070  1.386294   1.386294  162.875000  0.018826
茶房    0.003070  1.386294   1.386294  325.750000  0.021388
不能    0.002302  1.098612   1.098612   34.901786  0.007805
北京    0.002302  1.098612   1.098612  156.360000  0.011100
走到    0.002302  1.098612   1.098612   29.613636  0.007444
送我    0.002302  1.098612   1.098612   26.591837  0.007208

其中第一列是词频,二三列是词语与上下文区别度的左右交叉熵,第四列是词语内部的聚合度,而第五列是上面几项指标的一个综合评分。

如要按照词频排序,则可以用new_words_info = new_words_info.sort_values(by='freq', ascending=False),再得到具体词语就是new_words = new_words_info.index.tolist()

不过,也许设置一个默认的排序标准确实会更易于使用,我会考虑在后面更新一个默认排序标准上去。

EmbolismSoil commented 4 years ago

我看了一下,跑起来是单进程的,可以考虑多进程+共享内存或者用C++多线程重写一下?