Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通过用户自定义词典来增强歧义纠错能力 #14

Closed
fxsjy opened this issue Nov 22, 2012 · 77 comments
Closed

通过用户自定义词典来增强歧义纠错能力 #14

fxsjy opened this issue Nov 22, 2012 · 77 comments

Comments

@fxsjy
Copy link
Owner

@fxsjy fxsjy commented Nov 22, 2012

你好,最近在用你的分词,发现
大连 美容美发 学校 中君 意是 你 值得 信赖 的 选择

这句话被错误地切分了,我查看了dict.txt和idf.txt都没有找到“中君”和“意是”这两个词,不知道为什么>>会有这样的错分呢?

能不能从理论上解释一下?

RE:

"大连美容美发学校中君意是你值得信赖的选择" 这句话首先会按照概率连乘最大路径来切割,因为单字有一定概率,而“中君意是”这四个字中不含词典中有的词,所以会被切割成单字:

即:大连/ 美容美发/ 学校/ 中/ 君/ 意/ 是/ 你/ 值得/ 信赖/ 的/ 选择/

然后我们认为“中/ 君/ 意/ 是/ 你/ ”这几个连续的单字 中可能有词典中没有的新词,所以再用finalseg来切一遍“中君意是你 ”,finalseg是通过HMM模型来做的,简单来说就是给单字大上B,M,E,S四种标签以使得概率最大。

很遗憾,由于训练数据的问题,finalseg最终得到的标签是:

中君 意是 你
B E B E S

即认为P(B)_P(中|B)_P(E|B)_P(君|E)_P(B|E)_P(意|B)_P(E|B)_P(是|E)_P(S|E)*P(你|S) 是所有可能的标签组合中概率最大的。

B: 开头
E:结尾
M:中间
S: 独立成词的单字

解决方案是在词典中补充“君意”这个词,并给予一个词频,不用太大,比如3即可。

==user.dict===

君意 3

==test.py==

encoding=utf-8

import sys
import jieba
jieba.load_userdict("user.dict")
print ", ".join(jieba.cut("大连美容美发学校中君意是你值得信赖的选择"))

==结果===
大连, 美容美发, 学校, 中, 君意, 是, 你, 值得, 信赖, 的, 选择

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Nov 22, 2012

Bad Case: '江州/ 市/ 长江大桥/ 参加/ 了/ 长江大桥/ 的/ 通车/ 仪式'

目前这个方面的确还比较弱。

通过在自定义词典里提高“江大桥”的词频可以做到,但是设置多少还没有公式,词频越高则成词概率越大,不宜过大。

我是这样设置的:

==user.dict==

江大桥 20000

===test1.py======

#encoding=utf-8
import sys
sys.path.append("../")
import jieba
jieba.load_userdict("user.dict")
print ", ".join(jieba.cut("江州市长江大桥参加了长江大桥的通车仪式"))

==结果===
江州, 市长, 江大桥, 参加, 了, 长江大桥, 的, 通车, 仪式

@hitalex
Copy link

@hitalex hitalex commented Jan 25, 2013

请问,在提供自定义词的时候,为什么还需要指定词频?这里的词频有什么作用?

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Jan 25, 2013

@hitalex, 频率越高,成词的概率就越大。

比如"江州市长江大桥",既可以是”江州/市长/江大桥“,也可以是”江州/市/长江大桥“。
假设要保证第一种划分的话,我们需要保证P(江州)_P(市长)_P(江大桥)> P(江州)_P(市)_P(长江大桥)

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Feb 5, 2013

注意 自定义词典不要用Windows记事本保存,这样会加入BOM标志,导致第一行的词被误读。

@macknight
Copy link

@macknight macknight commented Feb 27, 2013

通过在自定义词典里提高“江大桥”的词频可以做到,但是设置多少还没有公式,词频越高则成词概率越大,不宜过大。这里的“不宜过大”到底不宜大到什么程度,我看前面的词频也就2,3,4,怎么到“江大桥”的词频就要大到了20000??这个难道不是过大??

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Feb 27, 2013

@macknight , 这个例子比较极端,因为”长江大桥“、”市长“这些词的频率都很高,为了纠正,才把”江大桥“的词频设置的很高。而对于一般的词典中没有的新词,大多数情况下不会处于有歧义的语境中,故词频也就2,3,4就够了。

@whille
Copy link

@whille whille commented Apr 10, 2013

看到词库格式是: {word:frequency},总样本字数是多少?添加新词的频率怎么设定?
比如之前没有的词,我在5k文本中找到了"瞄星人"这个词,freq:100。 词库中怎么设置freq?
后来我又在另外10k文本中,找到了"瞄星人":30. freq怎么修改?

@alsotang
Copy link

@alsotang alsotang commented Apr 10, 2013

默认词库在这里:https://github.com/fxsjy/jieba/blob/master/jieba/dict.txt?raw=true

总样本字数??你说的是词数吧? wc -l 就好了。

一个词的举例:“一一列举 34 i”,这个词中,freq 就是 34 嘛,i 是词性。照着加进去就好。

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Apr 10, 2013

@while,不用设置那么高。
只要能保证:
P(喵星人) =max{ P(喵)*P(星)*P(人), P(喵星)*P(人), P(喵)*P(星人), P(喵星人) }

@alsotang
Copy link

@alsotang alsotang commented Apr 10, 2013

频率设个 4 就好了。

fxsjy comment:
是的,一般不用太大, 除非是歧义纠结的句子。

2013/4/10 Sun Junyi notifications@github.com

@while https://github.com/while,不用设置那么高。
只要能保证:
P(喵星人) =max{ P(喵)_P(星)_P(人), P(喵星)_P(人), P(喵)_P(星人), P(喵星人) }


Reply to this email directly or view it on GitHubhttps://github.com//issues/14#issuecomment-16159512
.

@whille
Copy link

@whille whille commented Apr 10, 2013

我想有陆续添加新词功能。 看源码里把freq取了log。 所以直接用了词频。 但是以后新的文本词频怎么整合,还想不明白?
看词库:https://github.com/fxsjy/jieba/blob/master/jieba/dict.txt?raw=true
#########
的 3188252 uj
...
龟甲 92 ns
#########
应该有个总txt长度的概念吧。

@alsotang
Copy link

@alsotang alsotang commented Apr 10, 2013

我觉得你的 comment 里,标点符号用得特别传神。

在 2013年4月10日下午3:39,whille notifications@github.com写道:

我想有陆续添加新词功能。 看源码里把freq取了log。 所以直接用了词频。 但是以后新的文本词频怎么整合,还想不明白?


Reply to this email directly or view it on GitHubhttps://github.com//issues/14#issuecomment-16159713
.

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Apr 10, 2013

@whille, 如果你添加的词语特别多的话(因为会对分母造成影响),建议直接加到dict.txt里面,否则就用jieba.load_userdict好了(这里的分母还是用的dict.txt中的总词频和,为了性能并没有重新计算一遍)。

@metalhammer666
Copy link

@metalhammer666 metalhammer666 commented Jan 21, 2014

看来dict.txt里面的词频只是为解决歧义而设置的,词典中的词频数值跟计算tf-idf时没有必然联系吧?

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Jan 22, 2014

@metalhammer666 ,没有必然联系。

@heloowird
Copy link

@heloowird heloowird commented Mar 7, 2014

在自定义词典中,明明把词性标为nr,print出来的却是x。请问怎么解决?是格式不对么?

@fxsjy
Copy link
Owner Author

@fxsjy fxsjy commented Mar 7, 2014

@heloowird , 按说不会啊,把你的词典发我看看?

@heloowird
Copy link

@heloowird heloowird commented Mar 7, 2014

image

@ZhuJiahui
Copy link

@ZhuJiahui ZhuJiahui commented Mar 22, 2014

@fxsjy “在自定义词典中,明明把词性标为nr,print出来的却是x“
我也出现了同样的问题
001

002

@hitalex
Copy link

@hitalex hitalex commented May 1, 2014

我发现一个问题:我已经将某个词加入用户自定义词典,且设置了很高的词频(例如,5),但是jieba在分词或POS时,还是没有将其作为一个词。
请问,除了设置词频外,能否保证在用户词典中的词一定能够在分词过程中被认为是一个词?

@mengyuliu
Copy link

@mengyuliu mengyuliu commented Jul 9, 2014

还有一个问题,在中文中含有英文,如何把一个词语分到一起来?

@1040223592
Copy link

@1040223592 1040223592 commented Sep 25, 2014

请问自定义字典的存放路径@fxsjy

1 similar comment
@1040223592
Copy link

@1040223592 1040223592 commented Sep 25, 2014

请问自定义字典的存放路径@fxsjy

@poryfly
Copy link

@poryfly poryfly commented Dec 10, 2014

请问自定义的字典里面可以有正则表达式吗?

@gregdeng
Copy link

@gregdeng gregdeng commented Nov 12, 2015

我在添加自定义字典时,出现这个错误UnboundLocalError: local variable 'line' referenced before assignment,请问该如何解决?

@codywsy
Copy link

@codywsy codywsy commented Jul 21, 2016

@fxsjy 我想问,我在使用自定义词典的时候,分词“藏宝阁太贵”,我成功把“藏宝阁”分成一起了,但是“太贵”却不能分成“太”和“贵”。
我尝试过将jieba的字典dict.txt中的“太贵”直接删掉,也尝试过加入语句jieba.suggest_freq(('太','贵'),True),也都没有用。
请问,怎么才能成功把“太贵”分开

@1040223592
Copy link

@1040223592 1040223592 commented Jul 21, 2016

@codywsy 个人认为有两种方式:1)你可以在字典dict.txt中先找出“太贵”的词频,然后在后面加上“太” ,“贵”,但是词频要比“太贵”高;
2)添加自定义字典,字典里写上“太” ,“贵”,分别加词频,词频设置跟前面的方法一样

@Gengxin-Zhang
Copy link

@Gengxin-Zhang Gengxin-Zhang commented Jul 29, 2016

怎么结合其他输入法之类的词库??

@zii
Copy link

@zii zii commented Sep 25, 2017

jieba.suggest_freq(u'法律与秩序:特殊受害者', True)
text = u"Butt-UglyMartians法律与秩序:特殊受害者纽约重案组蝶舞天涯橙子不是唯一的水果战争风云太空堡垒"
words = jieba.cut(text, HMM=False)
print '|'.join(words)

输出

Butt|-|UglyMartians|法律|与|秩序|:|特殊|受害者|纽约|重|案|组|蝶舞|天涯|橙子|不是|唯一|的|水果|战争|风云|太空|堡垒

带符号的名字被分割了, "法律与秩序:特殊受害"没有匹配出来。

@Qnlp
Copy link

@Qnlp Qnlp commented Dec 4, 2017

您好,我想问一下一个事情,例如“很多年”,结巴分词的精准分词是分成了”很多年“,但是由于我自己的词典中是”很多“和”年“,所以我需要分成”很多“和”年“,有什么办法吗?
我尝试做了一个自定义词典解决这个问题,但是没有起作用。

@Qnlp
Copy link

@Qnlp Qnlp commented Dec 4, 2017

@kute 您好,我用了您的方法,分词成功了,我想问一下set_dictionary和load_userdict有什么区别?

@mali-nuist
Copy link

@mali-nuist mali-nuist commented May 8, 2018

@zxqchat 请问你搞清楚了么?我想把“二手手机” 分为“二手” 和 “手机”,自定义词典后, 我用load_userdict 没有任何作用,但是用set_dictionary 就能分开了。。。

@secsilm
Copy link

@secsilm secsilm commented Jul 24, 2018

@Azusamio 看起来确实是只能用一个词典,但是我看到文档里说:

在 0.28 之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:

jieba.set_dictionary('data/dict.txt.big')

这样来看 set_dictionary 使用来设置主词典的,这就产生了两个问题:

  • 既然有主词典,是不是还有个副词典之类的?如果有,那么如何设置呢?
  • 就像 @zxqchat 所说的,set_dictionaryload_userdict 的区别是什么?我自己试了试确实是使用 load_userdict 加载不管用,分词的时候仍然显示加载的是默认词典。

@fxsjy 能否解释下?谢谢啦 😄

@c111190
Copy link

@c111190 c111190 commented Aug 6, 2018

你好, 我修改了 dict.txt 中的詞頻, 希望輸出結果為 [失|明天] 而非 [失明|天]。
seg_list = jieba.cut('失明天', HMM=False) print('|'.join(seg_list))

詞頻修改為:
失明 1 N
明天 6 N

但結果還是[失明|天],
但是直接將 失明 拿掉就可以.

請問除了載入自定義辭典, 還可以怎麼解決這個問題呢?

@JimCurryWang
Copy link
Contributor

@JimCurryWang JimCurryWang commented Aug 28, 2018

遇到了同樣的問題,如同 @zxqchat 和 @secsilm 所说的,set_dictionary 和 load_userdict 的區別是什麽?我使用 load_userdict 加載也是不管用,分詞的時候仍然顯示的是默認詞典。

目前的解法是直接 jieba.suggest_freq(term, tune=True) 去遍歷 userdict

def handler_jieba_suggest_freq(term):
    jieba.suggest_freq(term, tune=True)

# loading userdict 
loading_lst = ['夏裝','原宿風','EASY SHOP','酒紅色','冷萃蘆薈'... ... ]
result = map(handler_jieba_suggest_freq,loading_lst)
for ele in result:
    pass
@Jiancong
Copy link

@Jiancong Jiancong commented Sep 27, 2018

我在添加自定义字典时,出现这个错误UnboundLocalError: local variable 'line' referenced before assignment,请问该如何解决?
这个问题应该是你在赋值前引用了line变量把,python的问题啊

@Qnlp
Copy link

@Qnlp Qnlp commented Oct 10, 2018

@zxqchat 请问你搞清楚了么?我想把“二手手机” 分为“二手” 和 “手机”,自定义词典后, 我用load_userdict 没有任何作用,但是用set_dictionary 就能分开了。。。

@JimCurryWang @mali-nuist 已经很久没弄了,回忆了这个问题,我记得是由于词频影响的。
set_dictionary 是将自定义词典设置为分词的词典,load_userdict 是加载一个自定义词典与源词典共同构成分词的词典,假如加载的词典所定义的词频依旧低于源词典,所以就不会生效,故应当在加载的自定义词典中设置合理的词频。

@mashagua
Copy link

@mashagua mashagua commented Oct 19, 2018

你好,請問我在內建詞典或自定義詞典中,加入了《海瑞罢官》這詞,但都不能分出詞。但去掉《》後加入了 海瑞罢官 就可成詞。但我的用途是一定要分出完整《海瑞罢官》這詞才成。請問有何辦法解決呢? 謝謝

这个可以修改jieba源码中的正则表达式即可,你可以google一下

@gray19950103
Copy link

@gray19950103 gray19950103 commented Dec 4, 2018

請問Jieba有沒有辦法將英文片語分出來, 例如我要的是: "get out", 而不是"get" 和 "out" ,謝謝

@fxsjy @vkjuju @zii 发现需要切出来的词中包含符号或空格就会失败,即便添加了自定义词典。请问有什么解决办法吗?感谢。

@randyliu61
Copy link

@randyliu61 randyliu61 commented Dec 18, 2018

你好, 这句话 "有时候线上线下的活动需要请客户来"
分词-》 有时候 线 上线 下 的 活动 需要 请 客户 来
有什么方法可以将 线上线下 分成 线上 线下 ?
我试了几种方式都不行.......

@Qnlp
Copy link

@Qnlp Qnlp commented Dec 18, 2018

@randyliu61 修改词频,它是按词频来决定切分的

@leolim031
Copy link

@leolim031 leolim031 commented Mar 7, 2019

aaa
@fxsjy
原字典的看电视我删掉了,我只想分出’看‘ 和 ‘电视’,但是分出来都是x是怎么回事? 看 和 电视 的词频都很高啊一个6w 一个3k

我不想用动态调整,动态调整后也不会保存下来,每次测试都要添加一个suggest_freq太可笑了,如果要调整上千个每次弄都会死人
如果可以保存动态调整后的频率就好了,可以的话怎么做?

@EinsteIce
Copy link

@EinsteIce EinsteIce commented Mar 13, 2019

@fxsjy 您好,我在使用您的自定义词典功能后,程序分词的速度大幅提升,但是分词的结果其实变化并不大,变化率大概在3%左右,但是程序运行时间减到了一半,您觉得这个现象出现的原因是什么呢?希望您能解答,谢谢!

@123swx
Copy link

@123swx 123swx commented Jun 23, 2019

请问我用load_userdict加载了自定义词典后,还是吃 鸡,没有合并起来,如何处理呢

@123swx
Copy link

@123swx 123swx commented Jun 23, 2019

kute

您好,怎么成功了?

@123swx
Copy link

@123swx 123swx commented Jun 23, 2019

遇到了同樣的問題,如同 @zxqchat 和 @secsilm 所说的,set_dictionary 和 load_userdict 的區別是什麽?我使用 load_userdict 加載也是不管用,分詞的時候仍然顯示的是默認詞典。
目前的解法是直接 jieba.suggest_freq(term, tune=True) 去遍歷 userdict
def handler_jieba_suggest_freq(term):
jieba.suggest_freq(term, tune=True)

loading userdict

loading_lst = ['夏裝','原宿風','EASY SHOP','酒紅色','冷萃蘆薈'... ... ]
result = map(handler_jieba_suggest_freq,loading_lst)
for ele in result:
pass

貌似还是不行

@123swx
Copy link

@123swx 123swx commented Jun 23, 2019

set_dictionary

set_dictionary怎么使用啊

@LinuxerAlan
Copy link

@LinuxerAlan LinuxerAlan commented Jul 24, 2019

@Stephen-Song

请问

使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

这个调节词频的函数是自己判断提高还是降低词频吗?如果不是,我用什么方法来告诉该函数仅仅降低词频?

(我也是刚学,不保证正确:) )
应该是程序自行判断。
首先是依据什么分词的问题。分词依靠的是词频,即词典dict.txt中的词频。
我认为,不要把这个函数理解为改变词频数量的函数(虽然分词最终依靠的是词频,词频越高越能分出词),而要理解为调整是否能分词的bool开关函数。比如,原来分词时由于'台'和'中'的词频很高(FREQ('台')=16964, FREQ('中')=243191, FREQ('台中')=3),故分出的是:

>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开')))
「////正确/应该/不会//切开

此时使用suggest_freq,调整分出'台中'。但由于分词最终依靠的是词频,所以其实内部是修改了'台中'的词频。suggest_freq函数的返回值即修改后的词频,应该是刚好能达到分词的词频。

>>> jieba.suggest_freq('台中', True)
69

为了检验,使用add_word利用此词频,一样可以分出词。

>>> jieba.add_word('台中', 69)
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开')))
「/台中/」/正确/应该/不会/被/切开
@LinuxerAlan
Copy link

@LinuxerAlan LinuxerAlan commented Jul 25, 2019

@codywsy

@fxsjy 我想问,我在使用自定义词典的时候,分词“藏宝阁太贵”,我成功把“藏宝阁”分成一起了,但是“太贵”却不能分成“太”和“贵”。
我尝试过将jieba的字典dict.txt中的“太贵”直接删掉,也尝试过加入语句
jieba.suggest_freq(('太','贵'),True),也都没有用。
请问,怎么才能成功把“太贵”分开

分词是以词频为中心的,不论用什么方法,最终都会归到词频。
首先说一下词频的规律:

  • 词频相对越大越能分出词
  • 单字的词频一般都大于双字

先举个我的例子:
对于这句话:“「台中」正确应该不会被切开”。当前词频为FREQ('台')=16964, FREQ('中')=243191, FREQ('台中')=3. 由于'台'和'中'的词频远远大于'台中',故分出的是:

>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开')))
「////正确/应该/不会//切开

但是,是不是只要'台'和'中'的词频大于'台中'就可以分出'台/中':

>>> jieba.add_word('台中', 69)  # 此时FREQ('台中')=69
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开')))
「/台中//正确/应该/不会//切开

可见不是。这是因为刚刚说过,首先,单字词频大于双字属正常现象,故此时虽然'台'和'中'的词频大于'台中',还是可以分出‘台中’。刚才又说过,词频相对越大越能分出词,故FREQ('台中')=69可以分出词,但FREQ('台中')=3时就无法分出词。
如果你要问怎么根据词频精确计算出是否能分出词,这涉及到数学知识了(截个图):
image

不过,对于我们使用者来说,有一种办法可以获得正好能/不能分出词的词频界限,即suggest_freq的返回值:

>>> jieba.suggest_freq('台中', True)
69

现在回到你的问题,有以下办法解决:

  1. 减小'太贵'的词频,有以下几种办法:
>>> jieba.add_word('太贵', 0)  # 设置'太贵'词频为0,这=把字典中“太贵”直接删掉,应该是一样的,我不清楚你为什么不行
>>> print('/'.join(jieba.cut('藏宝阁太贵')))
藏宝阁/太/贵

>>> print(jieba.suggest_freq(('太', '贵'), True))  # 获取建议的分词词频
0
>>> print('/'.join(jieba.cut('藏宝阁太贵')))
藏宝阁/太/贵

>>> jieba.del_word('太贵')  # 直接删除此词,相当于词频=0
>>> print('/'.join(jieba.cut('藏宝阁太贵')))
藏宝阁/太/贵
  1. 大幅增大'太'和'贵'的词频:
>>> jieba.add_word('太', 10000000000000)
>>> jieba.add_word('贵', 10000000000000)
>>> print('/'.join(jieba.cut('藏宝阁太贵')))
藏宝阁/太/贵
@LinuxerAlan
Copy link

@LinuxerAlan LinuxerAlan commented Jul 25, 2019

@Azusamio

@09wthe 我后来发现问题是jieba在分词时只能引用一个词典,我导入了自己的词典后jieba分词就没有使用原来的词典,之所以还能分词是因为HMM处在开启状态。
我后来直接把发现的新词加入到原词典里就没问题了。
另外我发现如果不写词频的话会报
ValueError: invalid dictionary entry
这样一个bug,似乎是字典格式要求必须有词频才可以,我试了一下,可以没有词性但必须要有词频才能不报错。
另外感谢您的指导

不太同意您的观点,我测试了一下,只load_userdict一个含有很少词的自定义字典,同时禁用HMM,依旧可以完成文章分词。说明load_userdict是和源字典共同起作用的。
测试set_dictionary:set_dictionary一个含有很少词的自定义字典,同时禁用HMM。分词系统崩溃,除了自定义字典里的词其余都分不出来了,如图:
image

说明set_dictionary是设置唯一的字典。

在此印证和感谢PlayDeep的观点:

@zxqchat 请问你搞清楚了么?我想把“二手手机” 分为“二手” 和 “手机”,自定义词典后, 我用load_userdict 没有任何作用,但是用set_dictionary 就能分开了。。。

@JimCurryWang @mali-nuist 已经很久没弄了,回忆了这个问题,我记得是由于词频影响的。
set_dictionary 是将自定义词典设置为分词的词典,load_userdict 是加载一个自定义词典与源词典共同构成分词的词典,假如加载的词典所定义的词频依旧低于源词典,所以就不会生效,故应当在加载的自定义词典中设置合理的词频。

@chenzeng11
Copy link

@chenzeng11 chenzeng11 commented Aug 14, 2019

不知道能不能添加正则表达式作为新词呢?例如第1科室,第2科室,第x科室这些不想每一个都加入到自定义词典中。

@xuanmitang
Copy link

@xuanmitang xuanmitang commented Sep 1, 2019

@fxsjy 你好~我在词典里添加了自定义词,jieba.add_word("分°"),但是最后结果里面还是并没有把‘分’和‘°’判定为一个词,这个是为什么呢?是不支持符号和文字的为一个词的自定义分词嘛?

@hscspring
Copy link

@hscspring hscspring commented Nov 5, 2019

@aileen0823
结巴的 default 汉字里面没有你这个符号,这是个全局变量,你可以在外部改一下:

jieba.re_han_default = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._%\-°]+)", re.U)
@faithxuyanyan
Copy link

@faithxuyanyan faithxuyanyan commented Dec 17, 2019

有个小小的问题,添加词典后,并没有起作用,有小伙伴遇到这样的情况吗?

@nelsonair
Copy link

@nelsonair nelsonair commented Jul 24, 2020

import jieba
jieba.add_word('9+8')
jieba.add_word('9-8')
print('/'.join(jieba.cut('请问 9+8 9-8 的结果是多少', HMM=False)))

请问/ /9+8/ /9/-/8/ /的/结果/是/多少

请问为什么‘9+8‘能分对‘9-8’分不对呢?谢谢!

@wmeng223
Copy link

@wmeng223 wmeng223 commented Oct 14, 2020

@Azusamio

@09wthe 我后来发现问题是jieba在分词时只能引用一个词典,我导入了自己的词典后jieba分词就没有使用原来的词典,之所以还能分词是因为HMM处在开启状态。
我后来直接把发现的新词加入到原词典里就没问题了。
另外我发现如果不写词频的话会报
ValueError: invalid dictionary entry
这样一个bug,似乎是字典格式要求必须有词频才可以,我试了一下,可以没有词性但必须要有词频才能不报错。
另外感谢您的指导

不太同意您的观点,我测试了一下,只load_userdict一个含有很少词的自定义字典,同时禁用HMM,依旧可以完成文章分词。说明load_userdict是和源字典共同起作用的。
测试set_dictionary:set_dictionary一个含有很少词的自定义字典,同时禁用HMM。分词系统崩溃,除了自定义字典里的词其余都分不出来了,如图:
image

说明set_dictionary是设置唯一的字典。

在此印证和感谢PlayDeep的观点:

@zxqchat 请问你搞清楚了么?我想把“二手手机” 分为“二手” 和 “手机”,自定义词典后, 我用load_userdict 没有任何作用,但是用set_dictionary 就能分开了。。。

@JimCurryWang @mali-nuist 已经很久没弄了,回忆了这个问题,我记得是由于词频影响的。
set_dictionary 是将自定义词典设置为分词的词典,load_userdict 是加载一个自定义词典与源词典共同构成分词的词典,假如加载的词典所定义的词频依旧低于源词典,所以就不会生效,故应当在加载的自定义词典中设置合理的词频。

同意@LinuxerAlan 的观点,如果要使用自定义词典,为了避免麻烦,可以直接set_dictionary合适的词典以及修改其中的频数

@wmeng223
Copy link

@wmeng223 wmeng223 commented Oct 14, 2020

import jieba

jieba.add_word('9+8')
jieba.add_word('9-8')
print('/'.join(jieba.cut('请问 9+8 9-8 的结果是多少', HMM=False)))

请问/ /9+8/ /9/-/8/ /的/结果/是/多少

请问为什么‘9+8‘能分对‘9-8’分不对呢?谢谢!

@nelsonair 可以设置一下频数,如jieba.add_word('9+8',10)
我加了以后分出来:请问/ /9+8/ /9-8/ /的/结果/是/多少

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet