jieba源碼研讀筆記(三) - 分詞之Tokenizer初探

文章推薦指數: 80 %
投票人數:10人

jieba/__init__.py負責分詞的功能,在前篇中己經將它的架構做了簡要的介紹。

jieba/__init__.py的核心部份是Tokenizer類別,這將是本篇介紹的重點。

jieba源碼研讀筆記(三)-分詞之Tokenizer初探 keineahnung2345 于 2019-02-2109:48:48 发布 1096 收藏 分类专栏: NLP 機器學習 jieba源碼研讀筆記 文章标签: jieba nlp 版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/keineahnung2345/article/details/86977785 版权 NLP 同时被3个专栏收录 18篇文章 0订阅 订阅专栏 機器學習 23篇文章 0订阅 订阅专栏 jieba源碼研讀筆記 18篇文章 2订阅 订阅专栏 jieba源碼研讀筆記(三)-分詞之Tokenizer初探 前言jieba/__init__.py中的Tokenizer類別類別架構__init__函數__repr__函數get_dict_file函數gen_pfdict函數initialize函數threading.LockLock與RLock的區別tempfiletempfile.gettempdirtempfile.mkstemp os.fdopenmarshalinitialize代碼 check_initialized函數分詞核心函數分詞函數wrapper自定義詞典 參考連結 前言 jieba/__init__.py負責分詞的功能,在前篇中己經將它的架構做了簡要的介紹。

jieba/__init__.py的核心部份是Tokenizer類別,這將是本篇介紹的重點。

jieba/init.py中的Tokenizer類別 類別架構 首先再來看一下Tokenizer類別中的所有函數名稱: classTokenizer(object): def__init__(self,dictionary=DEFAULT_DICT): ... def__repr__(self): return''%self.dictionary defgen_pfdict(self,f): ... definitialize(self,dictionary=None): ... defcheck_initialized(self): ... defcalc(self,sentence,DAG,route): ... defget_DAG(self,sentence): ... def__cut_all(self,sentence): ... def__cut_DAG_NO_HMM(self,sentence): ... def__cut_DAG(self,sentence): ... defcut(self,sentence,cut_all=False,HMM=True): ... defcut_for_search(self,sentence,HMM=True): ... deflcut(self,*args,**kwargs): ... deflcut_for_search(self,*args,**kwargs): ... _lcut=lcut _lcut_for_search=lcut_for_search def_lcut_no_hmm(self,sentence): ... def_lcut_all(self,sentence): ... def_lcut_for_search_no_hmm(self,sentence): ... defget_dict_file(self): ... defload_userdict(self,f): ... defadd_word(self,word,freq=None,tag=None): ... defdel_word(self,word): ... defsuggest_freq(self,segment,tune=False): ... deftokenize(self,unicode_sentence,mode="default",HMM=True): ... defset_dictionary(self,dictionary_path): ... __init__函數 在Tokenizer類別中有__init__及initialize這兩個函數,他們發揮的都是初始化的作用。

但是__init__函數是比較輕量級的,在該函數中只簡單地定義了幾個屬性。

分詞所必需的字典載入則延後至initialize函數中完成。

classTokenizer(object): #... def__init__(self,dictionary=DEFAULT_DICT): self.lock=threading.RLock() ifdictionary==DEFAULT_DICT: self.dictionary=dictionary else: self.dictionary=_get_abs_path(dictionary) self.FREQ={} self.total=0 self.user_word_tag_tab={} self.initialized=False self.tmp_dir=None self.cache_file=None 其中lock這個屬性是一個threading.RLock型別的物件,我們會在稍後的initialize函數中看到它的作用。

__repr__函數 這裡覆寫了object類別的__repr__函數。

classTokenizer(object): #... def__repr__(self): return''%self.dictionary 關於__repr__函數,可以參考object.__repr__(self)。

get_dict_file函數 這個函數的作用是讀取字典檔案,開啟後回傳。

它預設讀取dict.txt,但使用者也可以自定義字典。

classTokenizer(object): #... defget_dict_file(self): ifself.dictionary==DEFAULT_DICT: returnget_module_res(DEFAULT_DICT_NAME) else: returnopen(self.dictionary,'rb') gen_pfdict函數 在initialize中會調用gen_pfdict函數: self.FREQ,self.total=self.gen_pfdict(self.get_dict_file()) 從上面這句就可以看出來,gen_pfdict的作用是從一個己開啟的字典fileobject中,獲取每個詞的出現頻率以及所有詞的出現次數總和。

以下是它的函數定義: classTokenizer(object): #... defgen_pfdict(self,f):#gen_pfdict接受的參數是一個以二進制、讀取模式開啟的檔案。

lfreq={}#記錄每個詞的出現次數 ltotal=0#所有詞出現次數的總和 #他們會在函數的最後被回傳 #resolve_filename定義於_compat.py #它的作用是獲取一個己開啟的檔案的名字 f_name=resolve_filename(f) forlineno,lineinenumerate(f,1):#逐行讀取檔案f的內容 try: #因為是以二進制的方式讀檔, #所以這裡用decode來將它由bytes型別轉成字串型別 line=line.strip().decode('utf-8') #更新lfreq及ltotal word,freq=line.split('')[:2] freq=int(freq) lfreq[word]=freq ltotal+=freq #把word的前ch+1個字母當成一個出現次數為0的單詞,加入lfreq這個字典中 #我們待會可以在get_DAG函數裡看到這樣做的用意 #這裡的xragne在Python3也會被認識,這是因為在_compat.py中定義了xrange #,並將它指向Python3裡的range函數 forchinxrange(len(word)): wfrag=word[:ch+1] ifwfragnotinlfreq: lfreq[wfrag]=0 #在使用.decode('utf-8')的過程中有可能拋出UnicodeDecodeError錯誤。

#而我們可以由inspect.getmro(UnicodeDecodeError)這個函數來得知: #ValueError是UnicodeDecodeError的parentclass。

#所以可以接住UnicodeDecodeError這個異常 exceptValueError: raiseValueError( 'invaliddictionaryentryin%satLine%s:%s'%(f_name,lineno,line)) #記得參數f是一個己開啟的檔案 #這裡將這個檔案給關閉 f.close() returnlfreq,ltotal initialize函數 initialize函數的功能是載入字典,雖然與__init__函數一樣都是用於初始化。

但是它不像__init__是在物件創造時就被執行,而是在使用者要存取字典或是開始進行分詞的時候才會執行。

initialize函數會調用前面介紹的get_dict_file,gen_pfdict,_get_abs_path,DICT_WRITING,default_logger等函數及變數。

在initialize函數的定義中,使用到了tempfile,marshal套件以及threading中的RLock類別。

我們先來看看他們各自的功能: threading.Lock 當我們希望某一段代碼能完整地被執行而不被打斷時,我們可以使用threading.Lock來達成。

它的使用方法可以參考MULTITHREADING:USINGLOCKSINTHEWITHSTATEMENT(CONTEXTMANAGER):方法一: withsome_lock: #dosomething... 方法二: some_lock.acquire() try: #dosomething... finally: some_lock.release() Lock與RLock的區別 但是initialize裡使用的是threading.RLock而非threading.Lock,兩者之間的區別可以參考:classthreading.RLock及WhatisthedifferencebetweenLockandRLock。

在上述連結的例子中,函數a跟函數b都需要lock,並且函數a會呼叫函數b。

如果這時候使用threading.Lock將會導致程序卡死,因此我們必須使用threading.RLock。

RLock的特性是可以重複地被獲取,參考以下例子:首先測試threading.Lock: importtime importthreading lock=threading.Lock() withlock: withlock: time.sleep(1) 如果真的去運行上面那段代碼,會發現它的執行時間遠遠超過一秒。

這是因為第二個withlock:無法成功地獲取lock,因而導致程序卡死。

再來測試threading.RLock: importtime importthreading lock=threading.RLock() withlock: withlock: time.sleep(1) 這段代碼便可以在1秒左右結束。

因為threading.RLock就是為了這種場景而設計的。

tempfile tempfile.gettempdir tempfile.gettempdir官方文檔: Returnthenameofthedirectoryusedfortemporaryfiles.Thisdefinesthedefaultvalueforthedirargumenttoallfunctionsinthismodule.Pythonsearchesastandardlistofdirectoriestofindonewhichthecallingusercancreatefilesin. importtempfile tempfile.gettempdir() #'/var/folders/gp/cf5j4s914r73_4bxc4cnksg80000gn/T'#onMac #'C:\\Users\\user\\AppData\\Local\\Temp'#onWindows tempfile.gettempdir的作用旨在尋找一個可以寫入暫存檔的目錄。

tempfile.mkstemp tempfile.mkstemp文檔: tempfile.mkstemp([suffix=’’[,prefix=‘tmp’[,dir=None[,text=False]]]]):Createsatemporaryfileinthemostsecuremannerpossible.Ifdirisspecified,thefilewillbecreatedinthatdirectory.mkstemp()returnsatuplecontaininganOS-levelhandletoanopenfile(aswouldbereturnedbyos.open())andtheabsolutepathnameofthatfile,inthatorder. tempfile.mkstemp的作用旨在使用最安全的方式創建一個暫存檔。

它回傳的是一個filedescriptor,以及該檔案的絕對路徑。

os.fdopen os.fdopen文檔: Returnanopenfileobjectconnectedtothefiledescriptorfd. 利用傳入的filedescriptorfd,回傳一個開啟的檔案物件。

marshal 參考SerializingDataUsingthemarshalModule:marshal.dump及marshal.load是用來儲存及載入Python物件的工具。

initialize代碼 DICT_WRITING={} classTokenizer(object): #... definitialize(self,dictionary=None): #abs_path代表的是字典的絕對路徑 #如果使用者傳入了dictionary參數,則需要更新abs_path #否則的話,就直接使用在__init__()中己經設好的self.dictionary ifdictionary: abs_path=_get_abs_path(dictionary) ifself.dictionary==abs_pathandself.initialized: #因為詞典己載入,所以返回 return else: self.dictionary=abs_path self.initialized=False else: abs_path=self.dictionary #載入詞典的過程必須被完整執行,所以使用lock withself.lock: #這一段try-except的內容都是pass,似乎沒有作用 try: withDICT_WRITING[abs_path]: pass exceptKeyError: pass #如果self.intialized為True,代表字典己載入 #這時就直接返回 ifself.initialized: return default_logger.debug("Buildingprefixdictfrom%s..."%(abs_pathor'thedefaultdictionary')) t1=time.time() #將cache_file設定快取檔案的名稱 ifself.cache_file: cache_file=self.cache_file #defaultdictionary elifabs_path==DEFAULT_DICT: cache_file="jieba.cache" #customdictionary else: cache_file="jieba.u%s.cache"%md5( abs_path.encode('utf-8','replace')).hexdigest() #將cache_file更新為其絕對路徑 cache_file=os.path.join( self.tmp_dirortempfile.gettempdir(),cache_file) #快取檔案的目錄 #preventabsolutepathinself.cache_file tmpdir=os.path.dirname(cache_file) load_from_cache_fail=True #載入cache_file #首先檢查cache_file是否存在,並且是一個檔案 #如果不是的話則略過這部份; #如果是的話則接著確認如果使用的是預設的字典DEFAULT_DICT #如果不是使用預設的字典,則要確認cache_file的修改時間晚於自訂義字典的修改時間 #如果都符合條件,則從快取檔案中載入self.FREQ,self.total這兩個值, #並將load_from_cache_fail設為False ifos.path.isfile(cache_file)and(abs_path==DEFAULT_DICTor #os.path.getmtime:獲取檔案的最後修改時間 os.path.getmtime(cache_file)>os.path.getmtime(abs_path)): default_logger.debug( "Loadingmodelfromcache%s"%cache_file) try: withopen(cache_file,'rb')ascf: #底下有marshal的介紹 self.FREQ,self.total=marshal.load(cf) load_from_cache_fail=False exceptException: load_from_cache_fail=True #如果cache_file載入失敗,就重新讀取字典檔案, #獲取self.FREQ,self.total然後生成快取檔案 ifload_from_cache_fail: #可能是怕程式中斷,所以先把lock存到DICT_WRITING這個字典裡 #中斷後繼續執行時就可以不用再重新生成一個lock wlock=DICT_WRITING.get(abs_path,threading.RLock()) DICT_WRITING[abs_path]=wlock #在這個程式區塊中,又需要一個lock,用來鎖住寫檔的這一區塊 withwlock: self.FREQ,self.total=self.gen_pfdict(self.get_dict_file()) default_logger.debug( "Dumpingmodeltofilecache%s"%cache_file) try: #tmpdir是剛剛決定好的快取檔案的路徑 #preventmovingacrossdifferentfilesystems fd,fpath=tempfile.mkstemp(dir=tmpdir) #使用marshal.dump將剛拿到的 #(self.FREQ,self.total)倒入temp_cache_file withos.fdopen(fd,'wb')astemp_cache_file: marshal.dump( (self.FREQ,self.total),temp_cache_file) #把檔案重命名為cache_file _replace_file(fpath,cache_file) exceptException: default_logger.exception("Dumpcachefilefailed.") try: delDICT_WRITING[abs_path] exceptKeyError: pass #之後會利用self.initialized這個屬性 #來檢查self.FREQ,self.total是否己被設為有意義的值 self.initialized=True default_logger.debug( "Loadingmodelcost%.3fseconds."%(time.time()-t1)) default_logger.debug("Prefixdicthasbeenbuiltsuccessfully.") 在initialize結束後,self.FREQ才會被賦予有意義的值,而self.FREQ在分詞的時候會被用到。

check_initialized函數 檢查self.FREQ及self.total是否己被設為有意義的值。

如果還沒,則調用initialize函數從字典導入。

classTokenizer(object): #... defcheck_initialized(self): ifnotself.initialized: self.initialize() 分詞核心函數 這裡定義的幾個函數實現了Tokenizer的核心功能,在後續的章節裡將會一一介紹。

classTokenizer(object): #... defcalc(self,sentence,DAG,route): ... defget_DAG(self,sentence): ... def__cut_all(self,sentence): ... def__cut_DAG_NO_HMM(self,sentence): ... def__cut_DAG(self,sentence): ... defcut(self,sentence,cut_all=False,HMM=True): ... defcut_for_search(self,sentence,HMM=True): ... 分詞函數wrapper 這裡定義了分詞函數的wrapper。

原有的分詞函數回傳的是generator型別的變數。

下面以l開頭的函數們調用了原有的分詞函數,將它們的回傳值轉為list型別,提升了其易用性。

classTokenizer(object): #... deflcut(self,*args,**kwargs): returnlist(self.cut(*args,**kwargs)) deflcut_for_search(self,*args,**kwargs): returnlist(self.cut_for_search(*args,**kwargs)) _lcut=lcut _lcut_for_search=lcut_for_search def_lcut_no_hmm(self,sentence): returnself.lcut(sentence,False,False) def_lcut_all(self,sentence): returnself.lcut(sentence,True) def_lcut_for_search_no_hmm(self,sentence): returnself.lcut_for_search(sentence,False) deftokenize(self,unicode_sentence,mode="default",HMM=True): ... 另外tokenize函數則是將cut函數回傳的字串包裝成(字串起始位置,字串終止位置,字串)的三元組後回傳。

自定義詞典 jieba支持自定義詞典,因為這不是核心功能,在此僅列出相關函數,並不多做介紹。

classTokenizer(object): #... defload_userdict(self,f): ''' Loadpersonalizeddicttoimprovedetectrate. Parameter: -f:Aplaintextfilecontainswordsandtheirocurrences. Canbeafile-likeobject,orthepathofthedictionaryfile, whoseencodingmustbeutf-8. Structureofdictfile: word1freq1word_type1 word2freq2word_type2 ... Wordtypemaybeignored ''' self.check_initialized() ifisinstance(f,string_types): f_name=f f=open(f,'rb') else: f_name=resolve_filename(f) forlineno,lninenumerate(f,1): line=ln.strip() ifnotisinstance(line,text_type): try: line=line.decode('utf-8').lstrip('\ufeff') exceptUnicodeDecodeError: raiseValueError('dictionaryfile%smustbeutf-8'%f_name) ifnotline: continue #matchwon'tbeNonebecausethere'satleastonecharacter word,freq,tag=re_userdict.match(line).groups() iffreqisnotNone: freq=freq.strip() iftagisnotNone: tag=tag.strip() self.add_word(word,freq,tag) defadd_word(self,word,freq=None,tag=None): """ Addawordtodictionary. freqandtagcanbeomitted,freqdefaultstobeacalculatedvalue thatensuresthewordcanbecutout. """ self.check_initialized() word=strdecode(word) freq=int(freq)iffreqisnotNoneelseself.suggest_freq(word,False) self.FREQ[word]=freq self.total+=freq iftag: self.user_word_tag_tab[word]=tag forchinxrange(len(word)): wfrag=word[:ch+1] ifwfragnotinself.FREQ: self.FREQ[wfrag]=0 iffreq==0: finalseg.add_force_split(word) defdel_word(self,word): """ Convenientfunctionfordeletingaword. """ self.add_word(word,0) defsuggest_freq(self,segment,tune=False): """ Suggestwordfrequencytoforcethecharactersinawordtobe joinedorsplitted. Parameter: -segment:Thesegmentsthatthewordisexpectedtobecutinto, Ifthewordshouldbetreatedasawhole,useastr. -tune:IfTrue,tunethewordfrequency. NotethatHMMmayaffectthefinalresult.Iftheresultdoesn'tchange, setHMM=False. """ self.check_initialized() ftotal=float(self.total) freq=1 ifisinstance(segment,string_types): word=segment forseginself.cut(word,HMM=False): freq*=self.FREQ.get(seg,1)/ftotal freq=max(int(freq*self.total)+1,self.FREQ.get(word,1)) else: segment=tuple(map(strdecode,segment)) word=''.join(segment) forseginsegment: freq*=self.FREQ.get(seg,1)/ftotal freq=min(int(freq*self.total),self.FREQ.get(word,0)) iftune: add_word(word,freq) returnfreq defset_dictionary(self,dictionary_path): withself.lock: abs_path=_get_abs_path(dictionary_path) ifnotos.path.isfile(abs_path): raiseException("jieba:filedoesnotexist:"+abs_path) self.dictionary=abs_path self.initialized=False 參考連結 Idon’tunderstandos.name==‘nt’:.whatisntandos.nameWhatisthedifferencebetweenLockandRLockMULTITHREADING:USINGLOCKSINTHEWITHSTATEMENT(CONTEXTMANAGER)tempfile—GeneratetemporaryfilesanddirectoriesSerializingDataUsingthemarshalModule keineahnung2345 关注 关注 0 点赞 踩 0 评论 0 收藏 打赏 扫一扫,分享内容 点击复制链接 专栏目录 Python中运行有关jieba模块的时候报错:Buildingprefixdictfromthedefaultdictionary… 12-21 人生处处是惊喜,指不定哪一刻出现了莫名其妙的事件……好了,抒情式开头结束,下面进入正文 前几天运行的好好的程序,今天崩了??? 问题出在我的电脑上【狗头.jpg】,它卡了一下,我就无意点了哪,它所有程序报错,我就重启pycharm,然后我别的程序没问题了,有关jieba的程序仍旧报错???? 我盯着程序看了会儿,没找出问题;我接着去百度,似乎没有人出现此类错误;然后,我写了最简单的分词的代码看是不是jieba自己出现问题: importjieba seg_list=jieba.cut("我是共产主义接班人",cut_all=True) print("【全模式】:"+"/".jo jieba源碼研讀筆記(八)-分詞函數入口cut及tokenizer函數 keineahnung2345的博客 03-01 351 根據jieba文檔,jieba的分詞共包含三種模式,分別是:全模式、精確模式及搜索引擎模式。

其中的精確模式又分為不使用HMM兩種模式或使用HMM(在jieba中為默認模式)兩種。

所以分詞總共有四種模式可以使用。

在前三篇文章:全模式,精確模式(使用動態規劃),精確模式(使用HMM維特比算法發現新詞)當中,己經看到了前三種模式,它們分別對應到:__cut_all,__cut_DAG_NO_HMM及__cut_DAG函數。

本篇介紹的cut函數將作為上述分詞函數的入口,依據傳入參數的不同,來選擇要調用哪一個函數。

参与评论 您还未登录,请先 登录 后发表或查看评论 jieba源碼研讀筆記(一)-分詞功能初探 keineahnung2345的博客 02-20 460 jieba的分詞功能是由jieba這個模組本身及finalseg來完成。

而jieba這個模組裡包含了__init__.py,__main__.py,_compat.py及dict.txt四個檔案。

其中__init__.py定義了Tokenizer類別及一些全局函數,用於分詞本身。

__main__.py定義了jieba在命令行裡的使用方式。

_compat.py用於處理Python2/3相容性的問題。

dict.txt則是字典,記錄了各詞的詞頻及詞性。

Python运行jieba出现Buildingprefixdictfromthedefaultdictionary...解决办法(会显示正确结果) 热门推荐 gurentan1911的博客 01-18 1万+ Python运行jieba出现 Buildingprefixdictfromthedefaultdictionary…解决办法 这是我运行了代码出现的错误,但是我的结果还是可以正常显示的 Buildingprefixdictfromthedefaultdictionary... LoadingmodelfromcacheC:\Users\95114\AppData\Local\Temp\jieba.cache Loadingmodelcost0.842second tokenizer.encode() 不知道起什么名字 08-17 1716 tokenizer.encode("说你跑的挺远",add_special_tokenizerns=False) 相当于 seg=tokenizer.tokenize("说你跑的挺远") encoder=tokenizer.convert_tokenizerns_to_ids(seg) Transformers包tokenizer.encode()方法源码阅读笔记 天才小呵呵的博客 04-10 1万+ 1引言 HuggingFace公司出的transformer包,能够超级方便的引入预训练模型,BERT、ALBERT、GPT2… tokenizer=BertTokenizer.from_pretrained('bert-base-uncased') model=BertForTokenClassification.from_pretrained('bert-bas... python句子中没有中文_Python中jieba中文分词库的使用 weixin_32536777的博客 12-31 311 jieba是python的一个中文分词库,下面介绍它的使用方法。

安装方式1: pipinstalljieba 方式2: 先下载http://pypi.python.org/pypi/jieba/ 然后解压,运行pythonsetup.pyinstall功能下面介绍下jieba的主要功能,具体信息可参考github文档:https://github.com/fxsjy/jieba分词j... 第一章中文语言的机器处理 qq_34028001的博客 04-10 2651 1.搭建NLTK环境 1.操作系统:win10x64 2.Python开发环境:Python-3.7 3.安装常用Python应用程序 安装数学运算包。

pipinstallnumpy condainstallscipy 安装mysql数据库工具包。

安装Tornado网络包 。

安装NLTK开发环境。

(1)安装NLTK语言开发系统。

pipinst... jieba的Tokenizer分词器 Claire_Mk的博客 12-16 401 2021SC@SDUSC 一、gen_pfdict函数 在初始化的过程中,会构建前缀词典。

构建前缀词典的入口函数是gen_pfdict(self,f),解析离线统计词典文本文件,每一行分别对应着词、词频、词性,将词和词频提取出来,以词为key,以词频为value,加入到前缀词典中。

对于每个词,再分别获取它的前缀词,如果前缀词已经存在于前缀词典中,则不处理;如果该前缀词不在前缀词典中,则将其词频置为0,便于后续构建有向无环图。

defgen_pfdict(f): lfreq={} jieba库:Tokenizer()类详解(一)初始化 最新发布 qq_51945755的博客 12-27 269 2021SC@SDUSC jieba中文分词源码分析(三) Daniel的技术笔记不积跬步无以至千里,不积小流无以成江海。

09-05 1万+ 一、前缀字典作者这个版本(0.37)中使用前缀字典实现了词库的存储(即dict.txt文件中的内容),而弃用之前版本的trie树存储词库,python中实现的trie树是基于dict类型的数据结构而且dict中又嵌套dict类型,这样嵌套很深,导致内存耗费严重,具体点这里,下面是@gumblexcommit的内容: 对于get_DAG()函数来说,用Trie数据结构,特别是在Python环 Rasa分词之JiebaTokenizer 发呆的比目鱼的博客 11-28 447 Rasa分词之JiebaTokenizer rasa/nlu/tokenizers/tokenizer.py Token分词结果返回的对象 Tokenizer分词的父类,其中train函数是训练,process是预测。

这里的token分为两种attribute和text, 分好的token对象保存在training_examples的message中 classToken: def__init__( self, text:Text, s HuggingFaceBERTtokenizer.encode笔记 weixin_42899049的博客 10-22 645 鉴于之前确实没有好好阅读官方文档和论文,对于berttokenizer的截断和填充是用列表进行操作,且是直接补0。

其实tokenizer.encode有填补和截断的操作 目录 encoder参数 import encoder参数 encode(text:Union[str,List[str],List[int]], text_pair:Union[str,List[str],List[int],NoneType]=None, add_special_tokens:b. jieba库:Tokenizer()类详解:(四)加载用户自定义词典 qq_51945755的博客 11-09 417 2021SC@SDUSC 源码: defload_userdict(self,f): ''' Loadpersonalizeddicttoimprovedetectrate. Parameter: -f:Aplaintextfilecontainswordsandtheirocurrences. Canbeafile-likeobject,or 求大佬指点,写的是三国演义中文文本的词频统计,可是总是报错(已解决) take_cola的博客 03-03 1230 1.首先是这样写的: importjieba txt=open("D:/python程序/threekingdoms.txt","rt",encoding='utf-8').read() words=jieba.lcut(txt) counts={} forwordinwords: iflen(word)==1: continue else: coun... JiebaTokenizer文档 发呆的比目鱼的博客 11-29 84 JiebaTokenizer文档 tokenizer.encode()与tokenizer.tokenize()对比,言简意赅转高人讲学 studyvcmfc的专栏 10-19 546 tokenizer.encode()_不知道起什么名字-CSDN博客_tokenizer.encode tokenizer.encode("说你跑的挺远",add_special_tokenizerns=False) 相当于 seg=tokenizer.tokenize("说你跑的挺远") encoder=tokenizer.convert_tokenizerns_to_ids(seg) https://blog.csdn.net/Princeicon/article/details/108. jieba源碼研讀筆記(十一)-詞性標注之POSTokenizer初探 keineahnung2345的博客 03-01 629 前篇看了posseg/__init__.py檔的大架構,這裡將繼續介紹檔案中的POSTokenizer這個類別。

本篇僅介紹POSTokenizer類別初始化及載入字典的部份,核心函數及其wrapper將會在後續的文章裡介紹。

jieba库:POSTokenizer类cut()方法详解 qq_51945755的博客 11-09 292 2021SC@SDUSC “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 ©️2022CSDN 皮肤主题:像素格子 设计师:CSDN官方博客 返回首页 keineahnung2345 CSDN认证博客专家 CSDN认证企业博客 码龄4年 暂无认证 233 原创 8万+ 周排名 2万+ 总排名 27万+ 访问 等级 4403 积分 55 粉丝 94 获赞 66 评论 209 收藏 私信 关注 热门文章 docker-composeup:ERROR:Encounterederrorswhilebringinguptheproject.錯誤及解決方式 38195 Errorresponsefromdaemon:Dockerfileparseerrorlinexxx:unknowninstruction:xxx 33764 PIL及matplotlib:OSError:cannotidentifyimagefile錯誤及解決方式 15153 CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.Isthedockerdaemonrunning?錯誤 10506 Ubuntu下安裝Python版OpenCV 7305 分类专栏 Redmine 8篇 三維點雲 50篇 線性代數 12篇 三維重建 5篇 TensorRT源碼研讀筆記 22篇 jieba源碼研讀筆記 18篇 matterport/Mask_RCNN代碼研讀筆記 2篇 CV 8篇 深度學習 13篇 Linux 45篇 Tensorflow踩坑實錄 5篇 Python學習筆記 13篇 macOS 4篇 機器學習 23篇 docker 18篇 Spark 9篇 大數據 9篇 ftp 2篇 Stackoverflow 1篇 NLP 18篇 Darknet Windows 2篇 PyTorch 1篇 C++ 50篇 C語言 13篇 最新评论 KITTIdepthcompletion數據集評測 nk北夏: 老哥请问一下,深度估计用的GT是经过处理的还是lidardepth? Errorresponsefromdaemon:Dockerfileparseerrorlinexxx:unknowninstruction:xxx 喵先生丶: 台湾的吧 PCL-MLS代碼研讀(十四)-DISTINCT_CLOUD上採樣方法 keineahnung2345: 我把代碼放在https://gist.github.com/keineahnung2345/f3f323e4c643770036fcdf59a648e007,可以參考看看 PCL-MLS代碼研讀(十四)-DISTINCT_CLOUD上採樣方法 Dawdler416: 请问博主,您使用的曲面模型是怎么生成的啊,可以指点一下吗 PCLMLS論文ComputingandRenderingPointSetSurfaces研讀筆記 keineahnung2345: 太謝謝你了,我原文分成一到三步確實有點問題 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 redmine插件安裝及卸載 Generalized-ICP(GICP)論文研讀 兩獨立高斯隨機變數之和 2022年7篇 2021年76篇 2020年79篇 2019年27篇 2018年47篇 目录 目录 分类专栏 Redmine 8篇 三維點雲 50篇 線性代數 12篇 三維重建 5篇 TensorRT源碼研讀筆記 22篇 jieba源碼研讀筆記 18篇 matterport/Mask_RCNN代碼研讀筆記 2篇 CV 8篇 深度學習 13篇 Linux 45篇 Tensorflow踩坑實錄 5篇 Python學習筆記 13篇 macOS 4篇 機器學習 23篇 docker 18篇 Spark 9篇 大數據 9篇 ftp 2篇 Stackoverflow 1篇 NLP 18篇 Darknet Windows 2篇 PyTorch 1篇 C++ 50篇 C語言 13篇 目录 打赏作者 keineahnung2345 你的鼓励将是我创作的最大动力 ¥2 ¥4 ¥6 ¥10 ¥20 输入1-500的整数 余额支付 (余额:--) 扫码支付 扫码支付:¥2 获取中 扫码支付 您的余额不足,请更换扫码支付或充值 打赏作者 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值



請為這篇文章評分?