我所說的一切都可能是錯的缭裆!
即使你贊同我的觀點(diǎn)键闺,
你的生活也不會因此有任何改變!
除非——你采取了相應(yīng)的行動澈驼。
(這是書先生的第226篇原創(chuàng)分享辛燥。2021年3月24日,于新加坡)
引子
今天分享一件小事兒。
事兒很小挎塌,之所以覺得值得分享徘六,是因?yàn)槲覐闹袑W(xué)到了點(diǎn)兒重要的東西。
這個小事兒是這樣的:路夫人讓我?guī)兔μ幚韨€文檔榴都。文檔長這樣:
其實(shí)就是《新概念英語第二冊》的中英對照版待锈。夫人的要求是去掉所有的英文,但是每篇課文的標(biāo)題要保留嘴高。
兩種思路
對我這種天天和語料庫打交道的人來說炉擅,這還不簡單,也就一行正則表達(dá)式的事兒阳惹。
正則表達(dá)式谍失,英文叫regular expression,可以說是搞文本處理的朋友必須掌握的小技術(shù)莹汤。它的作用就是用一些符號的組合來匹配你想要搜索的字符串模式快鱼。你可以把它理解為升級版的通配符。
比如“\d”表示所有的數(shù)字纲岭,“\w”表示所有的字母和漢字抹竹,“\t”表示制表符,等等等等止潮。當(dāng)然窃判,更有用的是基本符號的合理組合,來匹配更加復(fù)雜的模式喇闸,比如:
匹配Email地址:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
匹配不定式(用于有句法標(biāo)注的語料庫):to_TO\s.*?[a-zA-Z]+_V
匹配“it + BE + adj + that”結(jié)構(gòu)(用于有詞性賦碼的語料庫):\S+_PPH1\s\S+_VB\w*\s\S+_J\w+\s\S+_CST\s
……
這個小技術(shù)在文本清理袄琳、爬蟲編寫和語料庫檢索方面很有用,對這些東西感興趣的朋友很有必要花點(diǎn)兒時間學(xué)一下燃乍。具體的技術(shù)細(xì)節(jié)不是本文的重點(diǎn)唆樊,我就不贅述了。
寫正則表達(dá)式的第一步就是觀察文本的特征刻蟹。我就在這一步犯了錯誤逗旁。
我的第一個思路是匹配有英文字母,但是不以“Lesson”開頭的句子舆瘪,于是寫了這樣一個正則表達(dá)式:
^((?!Lesson)).*[a-zA-Z].*
這個表達(dá)式可以匹配所有包含英文字母但是不以Lesson開頭的行片效。一個比較簡單的表達(dá)式,稍微復(fù)雜點(diǎn)就是里面對Lesson的“零寬負(fù)向先行斷言”((?!pattern))英古。
工作到此可以算是完成了淀衣,但我又看了看文本,發(fā)現(xiàn)自己犯了一個很傻的錯誤——我對文本的特征概括有點(diǎn)復(fù)雜了哺呜。
的確舌缤,匹配所有包含英文但不以Lesson開頭的行箕戳,這個思路能完成任務(wù)。但是国撵,根據(jù)文本的特征陵吸,還有一個更簡單的思路,那就是匹配所有包含中文字符的行介牙,因?yàn)槲覀冃枰サ舻男幸欢ㄊ遣缓形牡摹?/p>
這就是一個條件壮虫,而不是兩個條件了,從原理上來說环础,簡單了50%囚似。于是我又寫了下面這個正則表達(dá)式:
.^((?![\u4e00-\u9fa5]).)$
其中[\u4e00-\u9fa5]是正則表達(dá)式里匹配漢字的寫法。這個表達(dá)式能達(dá)到相同的效果线得。
粗一看饶唤,您可能覺得兩個表達(dá)式復(fù)雜程度差不多,而且都能達(dá)到目的贯钩。但是募狂,從思路上來看,第二種更加簡潔和準(zhǔn)確角雷。
簡潔是因?yàn)橹恍枰袛嘁粋€條件祸穷,準(zhǔn)確是因?yàn)樾枰サ舻男欣镆欢]有英文字母,但需要保留的行里卻可能出現(xiàn)英文字母勺三。整個文本有幾十頁雷滚,我們不可能把全部文本都讀一遍才來匹配,所以應(yīng)該在編寫正則表達(dá)式時盡量選擇出錯概率小的吗坚。
結(jié)語
今天分享的的確是件小事兒祈远,小到一分鐘就可以解決。但這處理這個小事兒時刻蚯,思路的轉(zhuǎn)化绊含,卻很值得思考。還是老規(guī)矩炊汹,我?guī)湍偨Y(jié)一下。如果您經(jīng)常會用正則表達(dá)式處理語料庫逃顶,下面兩點(diǎn)可能值得注意:
- 概括匹配對象特征時讨便,盡量減少匹配條件。
- 選擇表達(dá)式時以政,盡量選擇出錯概率小的霸褒。
好了,今天的分享就到這里盈蛮,希望對您有所幫助废菱。歡迎點(diǎn)贊、留言、轉(zhuǎn)發(fā)殊轴,支持這個默默耕耘的靠譜公眾號衰倦。
(原創(chuàng)內(nèi)容,未經(jīng)允許旁理,不得轉(zhuǎn)載7恪)