deepcs233 / jieba_fast

Use C Api and Swig to Speed up jieba 高效的中文分词库
MIT License
631 stars 75 forks source link

在使用自定义词典时,jieba_fast和jieba的分词结果不同 #18

Open QingGo opened 5 years ago

QingGo commented 5 years ago

作者你好。我在使用jieba_fast的时候发现一个问题,就是在使用自定义词典,jieba_fast的分词结果会和jieba的分词结果有所不同。系统版本为ubuntu18.04,库的版本信息如下:

jieba                              0.39       
jieba-fast                         0.53  

复现代码如下:

import jieba
import jieba_fast

sentence = '从一开始的不被看好到逆袭,拼多多只用了3年的时间。虽然上周的优惠券漏洞让拼多多被薅了千万羊毛,但却并未对其股价造成不利影响。25日拼多多市值报318.38亿美元,超过京东313.51亿的市值。拼多多股价周四大涨。截至收盘时,拼多多股价收于28.74美元,上涨2.07美元,涨幅达7.76%。而京东股价收于22.1美元,上涨0.13美元,涨幅为0.59%,成为中国第二大电商平台。拼多多股价在过去的半年里波动强烈:IPO定价于19美元,首日收盘价就达到26.70美元,涨幅达40.5%;之后不断下跌至17.22美元,然后就一路上涨,创造目前历史最高价30.48美元,但随后再次下跌,达到历史最低价16.53美元;此后公司股票在22美元附近震荡。拼多多股价波动强烈拼多多近日遭遇两大利空,一方面,拼多多被曝出现重大漏洞,引来大批用户“薅羊毛”,导致公司声誉和资金遭到重大损失。另一方面,拼多多股票的禁售期将于1月22日结束。届时,将有大量拼多多股东二级市场出售股票进行套现。虽然有很多人不喜欢拼多多,但是不得不说拼多多近来发展确实不错,而京东今年则比较坎坷,但在物流和服务方面还是口碑不错的。此前刘强东曾称京东和拼多多的商业模式不同。黄峥则回应称要多向电商前辈学习。'
a1 = jieba.lcut(sentence, HMM=False)
b1 = jieba_fast.lcut(sentence, HMM=False)
print(a1==b1)
jieba.set_dictionary('./word_list_nnlm_128.txt')
a2 = jieba.lcut(sentence, HMM=False)
jieba_fast.set_dictionary('./word_list_nnlm_128.txt')
b2 = jieba_fast.lcut(sentence, HMM=False)
print(a2==b2)
print(a2)
print(b2)

输出如下:

Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 3.847 seconds.
Prefix dict has been built succesfully.
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 2.129 seconds.
Prefix dict has been built succesfully.
Building prefix dict from /home/zeng/Code/work/jixin/PublicMonitoring/NoteBook/word_list_nnlm_128.txt ...
Loading model from cache /tmp/jieba.u2fcc826b59ac43bb4127b88239445c58.cache
True
Loading model cost 8.175 seconds.
Prefix dict has been built succesfully.
Building prefix dict from /home/zeng/Code/work/jixin/PublicMonitoring/NoteBook/word_list_nnlm_128.txt ...
Loading model from cache /tmp/jieba.u2fcc826b59ac43bb4127b88239445c58.cache
Loading model cost 6.771 seconds.
Prefix dict has been built succesfully.
False
['从', '一', '开始', '的', '不', '被', '看好', '到', '逆袭', ',', '拼', '多多', '只', '用', '了', '3', '年', '的', '时间', '。', '虽然', '上周', '的', '优惠', '券', '漏洞', '让', '拼', '多多', '被', '薅', '了', '千万', '羊毛', ',', '但却', '并未', '对其', '股价', '造成', '不利', '影响', '。', '25', '日', '拼', '多多', '市值', '报', '318', '.', '38', '亿', '美元', ',', '超过', '京东', '313', '.', '51', '亿', '的', '市值', '。', '拼', '多多', '股价', '周四', '大涨', '。', '截至', '收盘', '时', ',', '拼', '多多', '股价', '收', '于', '28', '.', '74', '美元', ',', '上涨', '2', '.', '07', '美元', ',', '涨幅', '达', '7', '.', '76', '%', '。', '而', '京东', '股价', '收', '于', '22', '.', '1', '美元', ',', '上涨', '0', '.', '13', '美元', ',', '涨幅', '为', '0', '.', '59', '%', ',', '成为', '中国', '第二', '大', '电', '商', '平台', '。', '拼', '多多', '股价', '在', '过去', '的', '半年', '里', '波动', '强烈', ':', 'IPO', '定价', '于', '19', '美元', ',', '首', '日', '收盘', '价', '就', '达到', '26', '.', '70', '美元', ',', '涨幅', '达', '40', '.', '5', '%', ';', '之后', '不断', '下跌', '至', '17', '.', '22', '美元', ',', '然后', '就', '一路上', '涨', ',', '创造', '目前', '历史', '最高', '价', '30', '.', '48', '美元', ',', '但', '随后', '再次', '下跌', ',', '达到', '历史', '最低价', '16', '.', '53', '美元', ';', '此后', '公司', '股票', '在', '22', '美元', '附近', '震荡', '。', '拼', '多多', '股价', '波动', '强烈', '拼', '多多', '近日', '遭遇', '两大', '利空', ',', '一方面', ',', '拼', '多多', '被曝', '出现', '重大', '漏洞', ',', '引来', '大批', '用户', '“', '薅', '羊毛', '”', ',', '导致', '公司', '声誉', '和', '资金', '遭到', '重大', '损失', '。', '另一方面', ',', '拼', '多多', '股票', '的', '禁售', '期', '将于', '1', '月', '22', '日', '结束', '。', '届时', ',', '将', '有', '大量', '拼', '多多', '股东', '二级', '市场', '出售', '股票', '进行', '套现', '。', '虽然', '有', '很多', '人', '不', '喜欢', '拼', '多多', ',', '但是', '不得不', '说', '拼', '多多', '近来', '发展', '确实', '不错', ',', '而', '京东', '今年', '则', '比较', '坎坷', ',', '但', '在', '物流', '和服', '务', '方面', '还是', '口碑', '不错', '的', '。', '此前', '刘强', '东', '曾', '称', '京东', '和', '拼', '多多', '的', '商业', '模式', '不同', '。', '黄', '峥', '则', '回应', '称', '要', '多', '向', '电', '商', '前辈', '学习', '。']
['从', '一', '开始', '的', '不', '被', '看好', '到', '逆袭', ',', '拼', '多多', '只', '用', '了', '3', '年', '的', '时间', '。', '虽然', '上周', '的', '优惠', '券', '漏洞', '让', '拼', '多多', '被', '薅', '了', '千万', '羊毛', ',', '但却', '并未', '对其', '股价', '造成', '不利', '影响', '。', '25', '日', '拼', '多多', '市值', '报', '318', '.', '38', '亿', '美元', ',', '超过', '京东', '313', '.', '51', '亿', '的', '市值', '。', '拼', '多多', '股价', '周四', '大涨', '。', '截至', '收盘', '时', ',', '拼', '多多', '股价', '收', '于', '28', '.', '74', '美元', ',', '上涨', '2', '.', '07', '美元', ',', '涨幅', '达', '7', '.', '76', '%', '。', '而', '京东', '股价', '收', '于', '22', '.', '1', '美元', ',', '上涨', '0', '.', '13', '美元', ',', '涨幅', '为', '0', '.', '59', '%', ',', '成为', '中国', '第二', '大', '电', '商', '平台', '。', '拼', '多多', '股价', '在', '过去', '的', '半年', '里', '波动', '强烈', ':', 'IPO', '定价', '于', '19', '美元', ',', '首', '日', '收盘', '价', '就', '达到', '26', '.', '70', '美元', ',', '涨幅', '达', '40', '.', '5', '%', ';', '之后', '不断', '下', '跌至', '17', '.', '22', '美元', ',', '然', '后就', '一路', '上涨', ',', '创造', '目前', '历史', '最', '高价', '30', '.', '48', '美元', ',', '但', '随后', '再次', '下跌', ',', '达到', '历史', '最低价', '16', '.', '53', '美元', ';', '此后', '公司', '股票', '在', '22', '美元', '附近', '震荡', '。', '拼', '多多', '股价', '波动', '强烈', '拼', '多多', '近日', '遭遇', '两大', '利空', ',', '一方面', ',', '拼', '多多', '被曝', '出现', '重大', '漏洞', ',', '引来', '大批', '用户', '“', '薅', '羊毛', '”', ',', '导致', '公司', '声誉', '和', '资金', '遭到', '重大', '损失', '。', '另一方面', ',', '拼', '多多', '股票', '的', '禁售', '期', '将于', '1', '月', '22', '日', '结束', '。', '届时', ',', '将', '有', '大量', '拼', '多多', '股东', '二级', '市场', '出售', '股票', '进行', '套现', '。', '虽然', '有', '很', '多人', '不', '喜欢', '拼', '多多', ',', '但是', '不得不', '说', '拼', '多多', '近来', '发展', '确实', '不错', ',', '而', '京东', '今年', '则', '比较', '坎坷', ',', '但', '在', '物流', '和', '服务', '方面', '还是', '口碑', '不错', '的', '。', '此前', '刘强', '东', '曾', '称', '京东', '和', '拼', '多多', '的', '商业', '模式', '不同', '。', '黄', '峥', '则', '回应', '称', '要', '多', '向', '电', '商', '前辈', '学习', '。']

其中词典文件来源于tensorhub上的一个nnlm中文预训练词向量模型,我把所有词的词频设为1并放入word_list_nnlm_128.txt文件中。我把它上传到百度网盘了。 链接:https://pan.baidu.com/s/1C-z2mJl6y8qRZEFO1_cqeA 提取码:s9ia

jieba-fast的分词结果和jieba的确差异不大。然而我通过原版jieba分词库在其分词结果的基础上训练了一个情感倾向判断模型,可能是我的模型不够稳健的原因,两个库对这句话的分词结果在模型中预测得到的情感倾向还是有明显差异的,jieba为正面倾向0.9,jieba-fast为正面倾向0.6。

deepcs233 commented 5 years ago

用一个分词库训练出来的模型肯定是只适用于该分词库的,可以理解成分词模型也是整个模型的一部分,所以你这种尝试理论上就不太对。然后你训练的模型泛化性可能也不强,我看了一下你的example里的差异的地方,感觉效果差不多,谈不上谁好谁坏。 目前产生差异的问题估计主要是自定义词典的问题,有新的进展我会update上来。

QingGo commented 5 years ago

多谢回复~ 你做的jieba_fast分词效率的确是比原版高不少。只是本来我还想着偷个懒无缝迁移的,看到还是得重新训练一下模型了。

come-come commented 5 years ago

用一个分词库训练出来的模型肯定是只适用于该分词库的,可以理解成分词模型也是整个模型的一部分,所以你这种尝试理论上就不太对。然后你训练的模型泛化性可能也不强,我看了一下你的example里的差异的地方,感觉效果差不多,谈不上谁好谁坏。 目前产生差异的问题估计主要是自定义词典的问题,有新的进展我会update上来。

您好,请问jieba_fast和jieba 在posseg.cut()上有没有对比过运行时间?是否会更高效呢?

ben-8878 commented 5 years ago

长文本分词: jieba_fast: 7m15.049s jieba: 7m16.053s

deepcs233 commented 5 years ago

长文本分词: jieba_fast: 7m15.049s jieba: 7m16.053s

加速接口仅支持jieba.lcut, jieba.lcut