現(xiàn):Atlas開源工具實(shí)戰(zhàn)解析)
1. 從一個(gè)跑不動(dòng)的分詞任務(wù)說起我最初接觸Atlas是因?yàn)樵谧鲆粋€(gè)大規(guī)模行業(yè)語料清洗和新詞發(fā)現(xiàn)的需求。傳統(tǒng)做法是先把語料跑一遍分詞再用詞頻統(tǒng)計(jì)篩出候選但問題很快暴露出來通用分詞器對(duì)垂直領(lǐng)域的專業(yè)術(shù)語、新造詞、組合詞幾乎無能為力而人工維護(hù)詞典的成本又高得離譜——今天收錄的詞明天可能就過氣了而且各個(gè)業(yè)務(wù)線的語料風(fēng)格差異巨大一套詞表根本沒法通吃。這個(gè)場(chǎng)景下我需要的不是一個(gè)“詞表”而是一套能從語料里自動(dòng)把新的、穩(wěn)定的、有語義邊界的語言單元挖出來的方案。當(dāng)時(shí)調(diào)研了一圈業(yè)界常用做法無非是N-gram頻次統(tǒng)計(jì)加規(guī)則過濾或者用互信息和左右熵這類統(tǒng)計(jì)量做候選篩選。Atlas就是后一種思路的工程化實(shí)現(xiàn)它不依賴預(yù)置詞典不要求標(biāo)注語料只需要一堆原始文本就能通過統(tǒng)計(jì)手段自動(dòng)發(fā)現(xiàn)新詞。這套設(shè)計(jì)非常契合我的需求——尤其適合垂直領(lǐng)域術(shù)語挖掘、輿情關(guān)鍵詞提取、搜索詞補(bǔ)全、還有文本數(shù)據(jù)的探索性分析這類場(chǎng)景。需要說明的是Atlas并不是一個(gè)Web服務(wù)也不是一個(gè)帶界面的工具它是一套開源的C命令行程序核心能力是“從大規(guī)模語料中提取新詞”主要面向有基本工程能力的開發(fā)者、算法工程師和數(shù)據(jù)從業(yè)者。如果你手上正好有一批文本想知道里面有哪些反復(fù)出現(xiàn)的規(guī)律性片段而且不想手動(dòng)翻數(shù)據(jù)那這篇文章應(yīng)該能幫你省下不少時(shí)間。2. Atlas的核心思路為什么是“互信息左右熵”這套組合2.1 兩個(gè)統(tǒng)計(jì)量的直覺理解Atlas的底層原理并不復(fù)雜它同時(shí)使用了兩個(gè)統(tǒng)計(jì)量來衡量一個(gè)候選片段是否是“詞”互信息PMI和左右熵Entropy?;バ畔⒑饬康氖瞧蝺?nèi)部字與字之間的綁定強(qiáng)度。打個(gè)比方如果“人”和“工”經(jīng)常一起出現(xiàn)而它們各自單獨(dú)出現(xiàn)的頻率也都很高那它們湊在一起到底是巧合還是真形成了一個(gè)固定組合互信息就是回答這個(gè)問題的它比較“一起出現(xiàn)的概率”和“各自單獨(dú)出現(xiàn)的期望概率”。如果一起出現(xiàn)的概率遠(yuǎn)大于隨機(jī)拼湊的期望互信息值就高說明這兩個(gè)字確實(shí)有很強(qiáng)的內(nèi)部黏合性。左右熵衡量的是片段外部的自由程度。一個(gè)真正的詞應(yīng)該能出現(xiàn)在各種不同的上下文里。比如“人工智能”后面可以接“發(fā)展”“技術(shù)”“領(lǐng)域”“研究”前面也可以有不同的修飾詞這說明它的左右邊界很自由是一個(gè)穩(wěn)定的獨(dú)立單元。反之如果某個(gè)片段只固定出現(xiàn)在同一個(gè)句子里比如只在“根據(jù)氣象部門預(yù)測(cè)”中出現(xiàn)那它的左右熵就會(huì)很低大概率只是一個(gè)固定搭配的碎片不是真正的新詞。這兩個(gè)指標(biāo)一個(gè)管“內(nèi)部黏合”一個(gè)管“外部自由”組合起來就能比較好地判斷一個(gè)N-gram片段到底是不是一個(gè)獨(dú)立的語言單元。這也是Atlas區(qū)別于單純?cè)~頻統(tǒng)計(jì)的關(guān)鍵它不只看一個(gè)片段出現(xiàn)多少次更看它出現(xiàn)的方式是否符合“詞”的特征。2.2 這套組合為什么適合大規(guī)模語料我個(gè)人的體會(huì)是互信息和左右熵這套組合特別適合“數(shù)據(jù)量大、沒有標(biāo)注、領(lǐng)域未知”的語料場(chǎng)景。原因有三點(diǎn)。第一它是無監(jiān)督的。不需要任何人工標(biāo)注不需要詞典甚至不需要你知道語料里大概有哪些領(lǐng)域直接扔文本進(jìn)去就行。這意味著它可以快速遷移到新的業(yè)務(wù)線不用每個(gè)項(xiàng)目都重新標(biāo)注一遍數(shù)據(jù)。第二它的計(jì)算模式是高度可并行的。Atlas底層用C實(shí)現(xiàn)數(shù)據(jù)處理流程設(shè)計(jì)成分塊處理在多核機(jī)器上能直接用滿CPU資源。我實(shí)測(cè)在32核的服務(wù)器上處理幾GB的語料也就幾十分鐘跑完這在大規(guī)模文本處理場(chǎng)景下是完全能接受的。第三它的輸出是可控的。通過調(diào)節(jié)頻次下限、互信息閾值、熵閾值等參數(shù)可以控制新詞挖掘的“保守程度”——想要高精度就調(diào)高閾值想要高召回就調(diào)低閾值。這種靈活性在實(shí)際工程里非常重要因?yàn)椴煌瑯I(yè)務(wù)對(duì)新詞的精度和召回要求完全不一樣。3. 環(huán)境準(zhǔn)備與編譯從源碼到可執(zhí)行文件3.1 依賴只有兩項(xiàng)Atlas的依賴非常輕官方文檔里寫明只需要g支持C11和CMake2.8以上版本。我在Ubuntu 16.04和CentOS 7上都編譯過表現(xiàn)都很穩(wěn)定。如果你用的是macOS或者Windows的WSL環(huán)境理論上也沒問題但官方主要在Linux上做的測(cè)試所以強(qiáng)烈建議在Linux環(huán)境下使用能少踩很多坑。3.2 編譯步驟實(shí)錄整個(gè)編譯過程就三步簡(jiǎn)單到?jīng)]什么可說的git clone https://github.com/Tencent/atlas.git cd atlas ./build.shbuild.sh腳本會(huì)自動(dòng)創(chuàng)建build目錄、調(diào)用cmake生成Makefile、然后執(zhí)行make編譯。編譯完成后可執(zhí)行文件在build/atlas。我第一次編譯的時(shí)候遇到一個(gè)小問題服務(wù)器上g版本比較老只有4.8結(jié)果編譯到一半報(bào)了一堆C11語法相關(guān)的錯(cuò)誤。后來把g升級(jí)到5.4以上就順利過了。所以如果你也遇到編譯失敗優(yōu)先檢查編譯器版本不要急著改代碼。3.3 確認(rèn)安裝成功編譯完成后先跑一下幫助命令確認(rèn)安裝正常./build/atlas --help如果能看到train、segment等子命令的幫助信息說明編譯成功。Atlas有兩個(gè)核心子命令train用于訓(xùn)練新詞模型也就是新詞挖掘segment用于基于訓(xùn)練好的詞典做分詞。這個(gè)分詞能力算是附贈(zèng)的——你可以先用train從語料里挖出新詞再把新詞補(bǔ)充進(jìn)詞典然后用segment做后續(xù)的文本切分。4. train命令參數(shù)詳解每個(gè)參數(shù)背后的邏輯4.1 參數(shù)清單與推薦值A(chǔ)tlas的train命令參數(shù)不算多但每個(gè)都很關(guān)鍵。我按自己的使用習(xí)慣整理了一張表標(biāo)了推薦值和使用場(chǎng)景方便你直接參考。參數(shù)含義推薦值說明train_file輸入語料文件路徑必填每行一句/一段UTF-8編碼model_dir輸出模型目錄必填訓(xùn)練結(jié)果輸出到該目錄min_freq候選詞最小頻次5~10低于該頻次的N-gram直接丟棄控制候選集規(guī)模max_word_len候選詞最大長度5~6超過該長度的片段不考察min_pmi互信息最低閾值20~30控制內(nèi)部黏合強(qiáng)度要求min_entropy左右熵最低閾值1.0~2.0控制上下文自由度要求max_freq候選詞最大頻次1000000過濾掉“的”“了”等超高頻泛化詞train_mode訓(xùn)練模式11表示新詞發(fā)現(xiàn)2表示模型增量訓(xùn)練thread_num并行線程數(shù)CPU核數(shù)多核加速建議拉滿dic_path基礎(chǔ)詞典路徑可選傳入基礎(chǔ)詞典用于過濾已有詞4.2 這些參數(shù)到底怎么影響結(jié)果很多人第一次跑Atlas喜歡把所有參數(shù)都用默認(rèn)值然后看結(jié)果覺得“這挖的什么玩意兒”。其實(shí)參數(shù)不調(diào)好結(jié)果確實(shí)會(huì)很糙。我逐一講下我踩過的坑。min_freq這個(gè)參數(shù)決定了候選詞的“準(zhǔn)入門檻”。如果設(shè)得太低比如1~2候選集會(huì)爆炸性膨脹大量隨機(jī)拼湊的二字組合會(huì)混進(jìn)來導(dǎo)致后續(xù)排序和過濾的負(fù)擔(dān)很重。設(shè)得太高又會(huì)漏掉一些低頻但很有價(jià)值的術(shù)語——尤其是長尾領(lǐng)域、小樣本場(chǎng)景下的專業(yè)詞。我一般先設(shè)5跑一遍看看結(jié)果再根據(jù)輸出質(zhì)量和數(shù)量做調(diào)整。min_pmi是個(gè)相對(duì)值不同語料下合適的閾值差異很大。新聞?lì)愓Z料詞匯豐富、搭配多樣PMI普遍偏低閾值太高什么都挖不出來垂直領(lǐng)域語料比如醫(yī)學(xué)、法律術(shù)語重復(fù)度高PMI普遍偏高閾值可以適當(dāng)提高來過濾噪聲。我建議第一次跑的時(shí)候先設(shè)一個(gè)較低的閾值比如10看輸出詞表里噪聲的比例再逐步上調(diào)。這個(gè)“先粗后細(xì)”的調(diào)參思路比一上來就賭一個(gè)高閾值要高效得多。min_entropy閾值我平時(shí)設(shè)在1.0~1.5之間。左右熵低于1.0的片段基本就是固定搭配比如“根據(jù)”“通過”“為了”這類。這些詞雖然也算“詞”但通常不是你想挖的新詞。如果你特別想過濾掉這類虛詞可以把min_entropy提到2.0左右但要注意有些專有名詞的上下文也比較固定比如人名、地名熵值天然偏低閾值太高會(huì)把它們一起過濾掉。max_word_len默認(rèn)值是5但我建議在中文語料上設(shè)到6或者7。四字成語、五字術(shù)語、六字機(jī)構(gòu)名都很常見只設(shè)到5會(huì)漏掉不少有意義的組合。當(dāng)然長度設(shè)得越長候選集規(guī)模越大計(jì)算時(shí)間也會(huì)增加需要平衡一下。4.3 一個(gè)完整的train命令示例假設(shè)我們有一份新聞?wù)Z料文件news_corpus.txt每行一條新聞UTF-8編碼。我的常用命令是這樣的./build/atlas train \ --train_filenews_corpus.txt \ --model_dir./news_model \ --min_freq5 \ --max_word_len6 \ --min_pmi15 \ --min_entropy1.2 \ --thread_num16 \ --train_mode1跑完后模型目錄里會(huì)生成詞表文件和模型文件。詞表文件里每一行是一個(gè)候選詞及其統(tǒng)計(jì)信息包含詞本身、頻次、左右熵、互信息等字段。5. 數(shù)據(jù)預(yù)處理這一步做不好后面全是白費(fèi)5.1 語料清洗是真正的第一步Atlas本身不做語料清洗你喂給它什么它就分析什么。如果語料里滿是HTML標(biāo)簽、URL、特殊符號(hào)、亂碼字符這些噪聲會(huì)直接影響N-gram的統(tǒng)計(jì)結(jié)果——想象一下“nbsp”這種字符串如果頻繁出現(xiàn)在語料里它也會(huì)被當(dāng)成一個(gè)候選詞挖出來。所以數(shù)據(jù)預(yù)處理的質(zhì)量直接決定了新詞挖掘的下限。我的清洗流程一般是先用正則去掉HTML標(biāo)簽和URL再統(tǒng)一標(biāo)點(diǎn)符號(hào)為全角或半角然后過濾掉包含異常字符的行最后做一次簡(jiǎn)單的去重。需要注意的是不要過度清洗——比如把所有的數(shù)字都刪掉可能會(huì)導(dǎo)致一些包含數(shù)字的術(shù)語比如“3D打印”“5G通信”完全無法被發(fā)現(xiàn)。5.2 是否要做分詞預(yù)處理Atlas官方推薦的是“不預(yù)先分詞”直接使用原始文本作為train_file輸入。它的設(shè)計(jì)邏輯是新詞挖掘就是為了發(fā)現(xiàn)分詞器不認(rèn)識(shí)的新詞如果先用分詞器切一遍新詞已經(jīng)被切碎了互信息和左右熵的計(jì)算就失去了意義。所以直接用原始文本不要做任何分詞處理。但有一個(gè)例外如果語料本身是拼接出來的比如把標(biāo)題和正文拼在一起你需要確保拼接處有明確的邊界標(biāo)記比如空格或換行。否則標(biāo)題的最后一個(gè)字和正文的第一個(gè)字跨邊界組成一個(gè)虛假的“詞”會(huì)干擾統(tǒng)計(jì)結(jié)果。5.3 語料規(guī)模的底線Atlas對(duì)語料規(guī)模有一個(gè)比較尷尬的底線要求——太少了跑不出效果。如果你的語料只有幾百KB挖掘出來的“新詞”大概率都是噪聲統(tǒng)計(jì)顯著性完全不夠。我個(gè)人的經(jīng)驗(yàn)是至少準(zhǔn)備50MB以上的干凈文本大約幾萬篇新聞結(jié)果才會(huì)有參考價(jià)值。如果語料本身很小那更加建議降低min_freq和min_pmi用“低門檻人工審核”的方式來補(bǔ)救。6. 實(shí)操過程從原始語料到最終詞表的完整流程6.1 流程概覽我給自己定了一套固定的操作流程每次跑Atlas都照這個(gè)來基本不會(huì)出大問題。整理成步驟來看語料采集與清洗確認(rèn)文本編碼為UTF-8去除明顯噪聲按行分割。初步訓(xùn)練用比較寬松的參數(shù)跑一遍train拿到基礎(chǔ)詞表。結(jié)果粗篩用詞頻和簡(jiǎn)單規(guī)則快速過濾明顯噪聲比如純數(shù)字、純符號(hào)、單字詞。參數(shù)迭代根據(jù)粗篩結(jié)果調(diào)整閾值重新訓(xùn)練。人工抽檢隨機(jī)抽取200~500個(gè)新詞人工判斷準(zhǔn)確率。詞表固化把通過審核的詞補(bǔ)充進(jìn)業(yè)務(wù)詞典用于后續(xù)分詞或檢索。6.2 關(guān)鍵步驟的實(shí)際操作訓(xùn)練完成后我習(xí)慣先用命令行快速看一眼詞表規(guī)模和頭部詞wc -l news_model/word_dict.txt head -50 news_model/word_dict.txt詞表文件每一行的格式大致是“詞\t頻次\t左熵\t右熵\t互信息”。頭部詞通常是最頻繁出現(xiàn)的一批詞你可以快速判斷這些詞是不是符合預(yù)期——如果全是“我們”“可以”“什么”這類通用詞說明min_freq設(shè)太低或者需要調(diào)整min_entropy如果已經(jīng)出現(xiàn)了不少領(lǐng)域術(shù)語說明參數(shù)方向基本正確。接下來我會(huì)用一個(gè)簡(jiǎn)單的Python腳本做自動(dòng)過濾把包含數(shù)字字母以外的雜字符、或者明顯是HTML實(shí)體的詞刪掉再按頻次排序?qū)С龀煽勺x性更高的詞表import codecs with codecs.open(news_model/word_dict.txt, r, utf-8) as fin, \ codecs.open(filtered_words.txt, w, utf-8) as fout: for line in fin: parts line.strip().split(\t) if len(parts) 5: continue word, freq, left_entropy, right_entropy, pmi parts[0], int(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) # 過濾純符號(hào)、純數(shù)字 if not any(\u4e00 ch \u9fff for ch in word): continue if len(word) 2: continue # 按業(yè)務(wù)需求進(jìn)一步過濾 fout.write(f{word}\t{freq}\t{pmi}\t{left_entropy}\t{right_entropy}\n)這個(gè)腳本很簡(jiǎn)單但它幫我擋掉了大量明顯沒用的候選讓后續(xù)人工抽檢的負(fù)擔(dān)小了很多。6.3 效果評(píng)估的標(biāo)準(zhǔn)很多人在“新詞挖掘”這件事上最困惑的是我怎么知道挖掘結(jié)果好不好我的評(píng)估標(biāo)準(zhǔn)很簡(jiǎn)單——抽500個(gè)詞人工標(biāo)注是否為“有意義的新詞”然后算準(zhǔn)確率。這里的“有意義”根據(jù)業(yè)務(wù)定義不同而有差異做搜索詞補(bǔ)全可能更看重詞語的完整性和搜索意圖做輿情分析可能更看重領(lǐng)域術(shù)語的覆蓋率做分詞詞典擴(kuò)充則要求詞本身有明確的語義邊界。如果準(zhǔn)確率低于50%說明參數(shù)太寬松需要調(diào)高min_pmi或min_entropy如果在80%以上說明參數(shù)基本合適可以進(jìn)一步微調(diào)如果準(zhǔn)確率很高但召回明顯不足遺漏了大量明顯的新詞則需要考慮降低min_freq或適當(dāng)擴(kuò)大max_word_len。7. 常見問題與排查技巧實(shí)錄7.1 編譯報(bào)錯(cuò)Atlas最常見的編譯錯(cuò)誤就是C11標(biāo)準(zhǔn)不支持。如果你用的是老舊的g 4.8編譯時(shí)會(huì)報(bào)出一堆“xx is not a member of std”之類的錯(cuò)誤。解決方案是升級(jí)g或者安裝高版本的build-essential工具鏈。另外如果系統(tǒng)里同時(shí)存在多個(gè)gcc版本可能需要手動(dòng)指定編譯器版本./build.sh \ CC/usr/bin/gcc-5 \ CXX/usr/bin/g-57.2 訓(xùn)練結(jié)果幾乎全是噪聲如果你發(fā)現(xiàn)挖出來的“新詞”全是“的了我們?cè)谟小边@類詞大概率是min_freq設(shè)置得太低。頻次小于5的N-gram組合統(tǒng)計(jì)上根本不具備顯著性尤其在小語料上更是如此。先把min_freq調(diào)到10以上再把min_pmi調(diào)到20以上結(jié)果通常會(huì)有質(zhì)的改善。7.3 一個(gè)領(lǐng)域詞都挖不出來和上面相反如果語料里明顯有很多專業(yè)術(shù)語但一個(gè)都沒挖出來那多半是閾值設(shè)太高了。先檢查min_pmi垂直領(lǐng)域語料中術(shù)語的PMI一般很高但有些簡(jiǎn)寫和組合詞PMI并不高可以先把min_pmi降到5~10看輸出結(jié)果再做判斷。另外檢查一下max_word_len是不是太短很多術(shù)語是4個(gè)字以上的。7.4 性能瓶頸Atlas默認(rèn)是單線程的嗎不是但它也不會(huì)自動(dòng)跑滿所有核。你需要顯式設(shè)置thread_num參數(shù)。我習(xí)慣設(shè)為CPU核數(shù)跑起來之后CPU利用率基本可以拉滿。如果你有32核thread_num32幾GB的語料大概幾十分鐘跑完。這里有個(gè)小技巧如果語料實(shí)在太大、內(nèi)存吃緊可以先按行隨機(jī)采樣一部分語料做參數(shù)探索確定好閾值后再全量跑能節(jié)省不少時(shí)間。7.5 常見問題速查表現(xiàn)象可能原因解決方案編譯失敗C11報(bào)錯(cuò)g版本過低升級(jí)到g 5.4以上全是通用虛詞min_freq太低或min_entropy太低提高min_freq到10min_entropy到1.5什么都挖不出來閾值過高或語料太小降低min_pmi/min_entropy增加語料量訓(xùn)練太慢單線程跑顯式設(shè)置thread_num為CPU核數(shù)結(jié)果里有交叉重復(fù)片段沒有用基礎(chǔ)詞典過濾傳入dic_path把已知詞過濾掉含大量英文/數(shù)字串語料清洗不足預(yù)處理階段做文本規(guī)范化8. 模型的增量訓(xùn)練與分詞語料產(chǎn)出8.1 增量訓(xùn)練的使用場(chǎng)景Atlas還支持增量訓(xùn)練模式train_mode2這個(gè)功能一開始我沒太在意后來在業(yè)務(wù)迭代時(shí)發(fā)現(xiàn)它非常有用。場(chǎng)景是這樣的第一次用一季度的語料訓(xùn)練出一個(gè)新詞模型到了季度末積累了新的語料如果從零開始重新訓(xùn)練每次都要全量跑一遍耗時(shí)耗資源。用增量訓(xùn)練模式可以基于已有的模型只對(duì)新增語料做學(xué)習(xí)把新出現(xiàn)的高頻詞補(bǔ)充進(jìn)模型里。增量訓(xùn)練的命令和train類似關(guān)鍵是train_mode設(shè)為2并指定已有的model_dir作為初始模型./build/atlas train \ --train_filenew_corpus.txt \ --model_dir./existing_model \ --train_mode2 \ --min_freq5 \ --min_pmi15 \ --min_entropy1.2 \ --thread_num16增量訓(xùn)練模式下模型會(huì)保留原有詞表同時(shí)把新增語料中挖掘出的新詞合并進(jìn)來。這個(gè)機(jī)制在實(shí)際業(yè)務(wù)中非常實(shí)用尤其是語料按周、按月持續(xù)產(chǎn)出的場(chǎng)景不需要每次都全量重跑。8.2 用segment子命令做分詞擴(kuò)展訓(xùn)練好的詞表除了用于新詞盤點(diǎn)還可以直接用于分詞。Atlas的segment子命令加載訓(xùn)練好的模型對(duì)新的文本進(jìn)行分詞——它的分詞結(jié)果會(huì)優(yōu)先使用訓(xùn)練階段學(xué)到的詞因此對(duì)垂直領(lǐng)域語料的效果往往比通用分詞器更好。./build/atlas segment \ --model_dir./news_model \ --inputtest.txt \ --outputseg_result.txt這個(gè)功能很適合做前置處理先用少量語料訓(xùn)練一個(gè)領(lǐng)域詞表然后把這個(gè)模型當(dāng)作一個(gè)定制分詞器對(duì)全量語料進(jìn)行切分。比起通用分詞器自定義詞典的方案Atlas的方案更省心——因?yàn)樗恍枰闶謩?dòng)維護(hù)一個(gè)龐大的領(lǐng)域詞典模型自己會(huì)從語料中不斷學(xué)習(xí)。9. 我的經(jīng)驗(yàn)總結(jié)與調(diào)參實(shí)戰(zhàn)建議這套工具我用了很長一段時(shí)間踩過的坑不少但沉淀下來的方法論也越來越清晰。最核心的一條經(jīng)驗(yàn)是先粗后細(xì)兩輪訓(xùn)練定參數(shù)。第一輪用寬松參數(shù)min_freq3min_pmi5min_entropy0.8跑一遍目標(biāo)是看全貌——知道語料里大概有哪些潛在的詞候選集大一點(diǎn)沒關(guān)系畢竟只是摸底。第二輪根據(jù)第一輪的輸出質(zhì)量收緊參數(shù)比如min_freq8min_pmi20min_entropy1.5目標(biāo)是跑出真正高質(zhì)量的新詞表。這個(gè)方法比一上來就猜最優(yōu)參數(shù)要高效得多因?yàn)椴煌Z料的統(tǒng)計(jì)特征差異太大你根本沒法憑空判斷哪個(gè)閾值是“最優(yōu)”的。另外一個(gè)經(jīng)驗(yàn)是不要過度依賴單一指標(biāo)?;バ畔⒑妥笥异馗髯灾荒芊从场霸~”的一個(gè)側(cè)面組合使用才能互相彌補(bǔ)。如果你發(fā)現(xiàn)某些很明顯的新詞沒被挖出來可能就是因?yàn)樗淖箪鼗蛴异仄捅热缃?jīng)常跟在同一個(gè)詞后面這時(shí)候可以適當(dāng)放寬min_entropy然后用頻次排序來做二次篩選。反過來如果噪聲多優(yōu)先提PMI而不是提熵值——提熵值容易誤傷真實(shí)新詞提PMI則比較精準(zhǔn)。最后關(guān)于中文編碼務(wù)必確保輸入文件是UTF-8編碼否則會(huì)出現(xiàn)亂碼甚至程序崩潰。如果你手上的語料是GBK編碼的先用iconv轉(zhuǎn)一下iconv -f GBK -t UTF-8 source.txt target.txt這一步雖然簡(jiǎn)單但真的會(huì)卡住很多人——我自己就在這上面浪費(fèi)過不少時(shí)間。如果你準(zhǔn)備在自己的業(yè)務(wù)里試一下Atlas我的建議是先從一份50MB左右的干凈語料開始把上面這些參數(shù)跑一遍感受一下每個(gè)參數(shù)對(duì)結(jié)果的影響。數(shù)據(jù)量不大迭代成本低你能比較快地建立起對(duì)這套工具的直覺。等摸清楚它的脾氣之后再上大語料、做增量訓(xùn)練、接入生產(chǎn)流程都會(huì)順很多。