29 Mar 2020
做了这么多年的NLP研究,惯性思维是想着如何去优化算法逻辑。但大家有没想过,做自然语言处理如果不懂自然语言,就像是做数据分析不懂平均值一样可笑不是?因此我准备再次学习中英文,目的是了解中英文背后的语言逻辑。
· P词:代表“旗帜”,标记位置,领先
1.标记位置,方位、位置
piss撒尿、piss sb off惹毛(撒尿脱离了)、pee撒尿(狗尿尿标记位置)
pose放置/姿势、propose建议(把观点先放出来)/求婚、impose施加(往里放,往里塞)、expose曝光(放到外面去)、repose休息(放回来)、dispose处理/扔掉(分开放)、depose免职(向下放)、dispose安排/部署(分开放)、suppose猜想/假设(私底下悄悄放着)
oppose反对(相反放着)、opponent对手、rival竞争对手、enemy敌人
compose组成/构成(放到一起)、composition组成/作文(结构是骨头,内容是皮肉,观点是灵魂)、composer作曲家
posit放、deposit存款(放下去,沉积钱)、depose罢免/免职、position位置、positive积极的、negative消极的
possess拥有(放好了ess表强调)、 possession拥有、desire for possession占有欲
post寄送、post office邮局、postpone推迟(向后方)
poster海报、propose提议/求婚(提前去放)
press压/出版社(印上去的文字)、pressure压力(放上去的的)
parcel包、pack包、package包=>薪资的构成:salary薪水、bonus奖金、allowance津贴/补助、pension养老金、insurrance保险、care medical医保(护理医疗)、housing fund住房公积金、
parasite寄生虫、parachute降落伞(para寄生=>帮/保护,保护的伞)、parapack空投箱(保护箱子)、paradise天堂(保护灵魂的地方)
2.pro-、pre-领先,旗帜在前面
(1)pro表示方位向前、领先
promote促进/促销(向前移动,方位上)、probable很有可能(提前准备able可能,ability能力)、promise承诺
proceed前进/继续(向前走,方位上)、process过程/进行、procedure步骤/程序(办理事务的流程)、program程序(电脑程序)、precede领先(提前走,时间上)、recede后退/减弱(cede、ceed走路,向回走)
produce生产(提前duce引导,introduce介绍)、product产品、progress进步(向前走)
profess宣称(在前面说话)、professor教授(站在前面fess说话)、profession专业的(教授肯定是专业的)
project投掷(向前扔)/工程(提前规划某事)/设计(提前设计)、projector投影仪/设计者
prospect预期/前景(向前看,方位向前)、expect期待(向外看)、aspect方面(向一个方面看)、inspect检查(向内看)、introspect内省(交叉审视)、respect尊重(反复看一个句子)、retrospect回顾(向以前看)、suspect疑似(由下往上看,心里活动嗯?)
prolong延长(向前长的,时间范围延长)、lengthen变长/加长、propel推动(向前pel推动)
prospect展望(向未来看)、expect期待(向外看)、aspect方面(向一个方面看)、inspect检查(向内看)、introspect内省(交叉审视)、respect尊重、retrospect回顾(向以前看)、suspect疑似(真相扭曲)
provoke挑衅/激怒(前面voice喊出声音)、proclaim宣告(提前喊)、pronounce宣告/发音(提前说)、provide提供(走上去看看video里面提供什么)
prompt敏捷的(向前突进的感觉)/促使促进、promption晋升
propel推动(向前推动)、propeller螺旋桨、expel开除(向外推出去)、repel反抗(一群人进攻,往回往后推)、compel强迫/被迫(共同推动)、impel促使/激励(内心推动)
(2)pre表示时间提前
predict预测(提前说,时间上)、previous以前的/先前的(时间上之前的)、precise精确的、exact精确的(超高标准的动作)、prepaid预付款(提前paid付款)、prepare预备(提前pare准备)
preserve保存/维护(提前去serve服务)、reserve保留(再次服务)、conserve保守(共同留心)、deserve应得(向下服务)、observe观察(细致服务)、server服务器、servant服务员(ant人)
preclude预防(提前clude关闭)、exclude排除、include包含、seclude隐居/隔离(分开之后关住)
precede领先(时间在前面的)、precedence优先、precedent先例、precedented有过先例的、unprecedented史无前例的、proceed前进(向前走,方位上)
predetermine预先决定、precaution预防措施(caution小心,时间上提前小心)
president总统、cheirman领袖、preside主持(提前side坐在那,总统主持)、preside over the meeting、host主持、prime minister首相(minister大臣/部长,为国王打工)
3.per-完全
perfect完美、persist坚持到底、perish毁灭(全死了)、perform表演(水平全表现出来)、persude说服(彻底said说动心,完全改变主意)
perturb搅动/扰动(完全搅动,内心感情)、disturb干扰/打搅(分开搅动)、turbo涡轮增加(搅动)、masturbo手淫(master手动turbo涡轮增加)
· H词:代表“高”,向上,梯子
1.高,与“天”有关(天是顶,顶表示高)
heaven天堂、hell地狱(梯子可上可下)
horizon地平线/天际线=>视野(on the horizon看到希望)
haze雾霾、hurricane飓风(程度很高的风)
hail冰雹(也表示欢呼)、hailstorm暴风雪
hover翱翔、hovercraft气垫船
helicopter直升飞机
hawk老鹰
天上有神仙=>与神仙相关
halo光环、光晕
halloween万圣节(各路神仙的节日)
hallow圣人/圣徒(deathly hallows死亡圣器)、hollow洞/空洞
holy神圣的、holy bible圣经
honour/honor尊敬/荣誉=>honor his words信守诺言
honest诚实的(圣洁的)
hero英雄、heroine女英雄
haunt附体、作祟(鬼影重重)
holiday假期(神仙的节日)、vacation假期(空出来的)
2.高,与兴致相关,人的兴致特别高
hop跳(高兴到跳起来)、hip hop嘻哈音乐、hopper跳蚤
hormone荷尔蒙(青春开心)
hail欢呼、happy高兴、hilarious特别高兴的(希拉里hilar)、hysterical歇斯底里的(特别特别高兴/兴奋的)
human人类(hum向下表示泥土)、humid潮湿的、humble谦卑的(把自己低到尘土里)、humiliate侮辱、humour幽默(取悦观众的)、harmony幽默的/和谐的、hum哼哼声/嗡嗡声、hummingbird蜂鸟
heroin海洛因(嗨药)、hallucination幻觉(嗨觉)
high嗨/兴奋(也表示高)、hale精神矍铄的
3.高,与位置相关
位置特别高:
high高、height高度
head头、hair头发=>hairy多毛的、hairdresser理发师、hand手(高的动作系)、heart心、heel脚跟(Achilles’ hell阿克琉斯之踵=>弱点)
headline标题/头条新闻、headlines today今日头条、hardline强硬的、underline下划线、frontline前线(前面的线)、timeline时间线、deadline最后截止时间(死亡线)
headmaster首长、headhunt猎头、headquarters总公司(公司总部)
horn角(动物头上)=>horny淫荡的(角的形状)、hump驼峰=>humpbacked驼背的、hunch隆起/堆起=>预感/第六感(突如其来的感觉)、horse马(跳马鞍)
hose软管/水管/长袜(长的、高的袜子)、sock短袜
helmet头盔
位置从高到低:
history历史、heritage传承/遗产
4.高,与“家”有关
home家庭、husband丈夫(家庭顶梁柱)、house房子、house of commons下议院(平民院)、house of lords上议院(贵族院)、house of repersentatives众议院、housework家务活、housing fund住房公积金
host主机/主人/主持、hospitality好客的、hostage人质、hostile敌对的
hall大厅、hollow山洞/空的/空洞(空的山洞)、hole洞
hut小木屋、hospital医院=>hospitable好客的、hotel酒店
habitat居住=>habit习惯(居住形成了习惯)=>habitual loneliness习惯性孤独;habitual criminal惯犯
harbour海港=>庇护、隐藏
5.高,高东西遮挡(家帮忙遮风避雨)
hide躲(被高的东西挡住)
halt阻止/妨碍、hamper妨碍、hinder妨碍
hurdle障碍=>克服、handle处理/应付
6.高,与动作相关
从下往上:hold举起=>holder持有者、hoist升起/吊起、heave举起、hang悬挂(挂的高高的)、hook挂钩/钩住=>hooker妓女(勾引男人)=>hooked着迷的(被勾引的)、heap堆积(从下往上堆起来)
从上往下:hack劈/砍(被侵入、被黑)=>hacker黑客、haggle讨价还价(乱砍价)、hit打击、hammer锤子、harm危害(被打了)
7.高,与高的度数相关,程度高
horrible可怕的(程度特别可怕)、hazard危险(程度危险的)、heavy重量(程度特别重)、hot热的(程度特别热)
hugh巨大的(程度很大的)、hurry匆忙(程度别特忙)、harsh严厉的/粗糙的(程度严厉的或粗糙的)
hard硬的/难的(程度硬的、困难的)=>hardline policy强硬的政策(注意与headline、hairline区别)
8.总结:词根词缀
home家=>homo-相同的=>homegenous同类的
hyper-超(超过之上)=>hypertension高血压、hypercritical苛刻的(吹毛求疵)、hyperactive超活跃/多动的、hyperbole夸张、hyperlink超链接、hyperfine超精细的(fine hair精细的毛,汗毛)
hypo-超(超过低)=>hypotension低血压、hypocrisy虚伪/伪善(什么都不说不好的话)、hypothesis假设(thesis论文、论淡,放在文中的假设)
hydrogen氢=>hydr-水=>hydroelectric水电的
· R词:与太阳关联,表示放射、辐射出去
1.与太阳关联,表示辐射
Amun-Ra阿蒙拉(拉丁文太阳神的名字)
ray光线(辐射出来的光线)、X-ray X光线、raymond大光线
radar雷达(辐射出来)、radio收音机(辐射出声波)、radio-activity放射性、radioactive放射性的
radical激进的、radial放射状的
rapid急速的、radius半径(太阳能辐射的位置)
radium镭(辐射开的)、radiate辐射/放射、radiation辐射/放射线
radiant精神焕发的、hale精神矍铄的
row列(龙舟:两列人划船)=>划船、line行
radius半径(辐射出去的)
2.表示蔓延开来(太阳光辐射出来)
root树根(辐射状蔓延)、grass roots草根/普通民众、radical根本的=>激进的(散出去的)、raddish萝卜
river河流(辐射状蔓延)
ring撞钟(声波辐射状蔓延)=>戒指(结婚教堂钟声)
road道路(道路辐射状蔓延)、route路线(路线辐射状)、routine例行公事/惯例(常规路线)、reach伸出(手伸出蔓延)
rail铁路(铁路辐射状蔓延)、railway铁路/铁轨、light rail轻轨、rail怒斥
rabbit兔子(繁殖能力快,可迅速蔓延开)、rabble暴民/乌合之众、rapid急速的(兔子迅速蔓延开来)、rat老鼠(同繁殖能力快)、raver乌鸦
3.表示乡村的(基于城市向外蔓延)
rural乡村、rural club乡村俱乐部(city城市、culture文化、civilization文明、civil law民法)
rust破旧的(农村破旧的房子)、rough粗糙的(harsh严厉的/粗糙的)、rude野蛮的/粗鲁的、rudimental初级的/基本的(农村初级的城市)
rite仪式(农村比较多)、raw原始的(原材料)
rug地毯(农村的地上)
rake耙子(农村耕地用的)、rake-off薅羊毛(耙一把肉下来,回扣)、kickback回扣、rake in轻易地赚取
4.表示分开、分裂(太阳内部不断分裂)
race民族(从前分开居住)=>比赛(跑道分开)、racecar赛车、racehorse赛马、racial种族的、racism种族主义/种族歧视
room房间(房间是分开的)、rack架子/隔板(将物体分隔开)、rack one’s brains绞尽脑汁(把脑子分门别类重新排列)、racket球拍(把网张开、分开张裂)=>喧闹声(炸裂的感觉)
rent租赁(将房子出租)、render提供/是的(房子提供出去)
range范围(划范围和其他东西分开)、range rover路虎揽胜(不设范围到处漫游)、rover漫游者、rove漫步
rank等级(将人区分开)=>军衔(将军人区分开)
rip撕开(将东西分卡)、ripper开膛手、ripple涟漪/水波(水波荡漾开,把水波分开)、rip off宰人/坑人(从身上撕下了一块肉)、rib肋骨(肋骨是分开的)
ripe成熟的(水果成熟与树分开,瓜熟蒂落)
ration配给量/定量(一堆粮食分成好几块) 、rational合理的(分的非常平均)、irrational非理性的(分的不均匀)、rate比率/费用(百分比)、ratio比率/比例(整体分成好几块)
5.表示破坏、破裂(太阳具有破坏的力量)
(1)ra开头表示破坏
rag抹布(破裂的布)、rage愤怒(破裂的气、气炸了)、outrage暴行/愤怒、rail怒斥
ram猛撞(破坏)、rampage暴力/横冲直撞、rampant狂暴的/失控的/猖獗的
rape强暴(破坏妇女身体)、grab抓、ripe成熟的、reap收割/获得
raid袭击/突袭(搞破坏)、air raid空袭、raider劫匪
raze彻底破坏、raze sth to the ground将..夷为平地、razor剃须刀(胡须全破坏)、razor-sharp锋利的、a razor-thin victory险胜(刀锋上的胜利)、on the razor’s edge处于危险境地(剃刀边缘)、eraser橡皮擦(全部切掉、擦掉)
ravage摧毁、revenge复仇(复仇去破坏)
ransack洗劫(抢劫拿个包把所有东西都拿走)、ransom赎金
(2)ro开头表破坏
rob抢劫(破坏门面)、robbery抢劫
rocket火箭(向上破裂而出)、rock岩石(破土而出)=>摇滚
(3)ri开头表破坏
risk风险/冒险(被破坏的风险)、ruin破坏/毁坏
riot暴动、rioter暴徒、mob暴民、rabble暴民/乌合之众、rebel反抗、rebellion叛乱/反抗
(4)rupt开头表破坏
rupt破裂/断裂、rupture破裂/断绝、bankrupt破产、disrupt打扰(扰乱)=>interrupt打扰、erupt爆发、abrupt唐突的(突然破开冒出来)、corrupt腐败的(共同破裂了,一起腐败)、cooperate合作
6.表示重新、再次(太阳具有重生的力量)
receive收到(accept接收、ceive=get/take再次拿到)、receipt收据(付款后再收到)、receiver接收者/接收赃物的人、receptor接收体(神经末梢)
conceive构思/想象(一起构想、头脑风暴)、inconceivable不可思议的、deceive欺骗(向下接收假的为真的)、perceive察觉(提前接收到)
refresh提神(再次新鲜了)、refresher提神物、boost促进/增进、booster提神物
refer参考(再次提及)、reply回复、respond答复/回答、recite背诵(记忆再说出来)、record记录、recall回忆、reclaim改造/感化、return回来、rebirth重生、recapture夺回(再次抓住)、reconfirm再次确认、reconsider重复考虑、recognize认出(再次确认)
refine更加精致的、react反应(再次行动)、reveal揭示(再次看)、revise修改(再改)、regret遗憾/懊悔
recycle再循环、bicycle自行车、encircle包围、circle圆圈
reflect反应、recast重铸(cast铸造、forecast预测)
revolve旋转(往回旋转、沃尔沃旋转)、revolution革命、reform改革(再形成新的制度)
recur重现(再流动,cur表示流动currency货币)、recurring重复的/屡次发生的、occur发生(流出来了)、concur巧合/同意(同时发生、流过来)、incur招致(往里走)、recruit招聘(再招新的补充进来)
reconstruct重建、obstruct阻碍(反着修改、妨碍修建)、destruct摧毁(向下修建、毁了)、instruct引导(向内修建)、instructor导师(心灵修建的导师)
reinforce加强/在增援、reassure使安心(再次使放心)、assure确保
rely依靠、reliable可靠地、remain剩下/依旧是(再次留下)、remainder剩余物、respect尊敬(视其所以、观其所由)
由重新、再次引出表示往回、往后
reverse相反的、diverse不同的
retrospect回顾
rebel反叛者(别人打你又打回去)、rebellion反叛、rabble暴民/乌合之众
rebound回弹/反弹
recede后退/减弱(cede、ceed走路,向回走)、recession衰退、proceed行进/进程(向前走)、precede领先(提前走)、excessive多余的(向外多走的路)
retract撤回(向后撤回)
reduce减少(向回降低)、introduce介绍、seduce勾引
refuse拒绝(fuse融合、不再融合)、confuse混乱(共同融合乱了)、diffuse传播(将谣言分开传播开)
reject拒绝/抵制、inject注入、eject喷射/驱逐、subject主题/学科、object对象、project计划
revenue财政收入(先工作然后有收入走回来)、advent出现(走的越来越靠近)、revenge复仇
7.表示正、直(太阳表示正、直)
right正确的、correct正确
rect-直的、rectangle矩形、right angle直角、triangle三角形、right triangle直角三角形、angle角、angel天使
rectitude正直(正直得态度)、attitude态度
regular有规则的、regulate调整(尺子调整)=>管制、regulation规则/规章
ruler尺子/暴君(制定规则的人)、rule规则
· B词:与木头相关
1.关于木头(砰砰的敲击声)
bar酒吧酒馆(一排木桌、木凳)/条状(a bar of soap一条肥皂)/法律职业(法律都是一条条的)、bar examination律师资格考试、bar association律师协会
bank银行(木头柜台)、band乐队(许多人捆在一起)、bed床(木头做的)
board木板甲板/上船(在甲板上)、boarding call登机通知/董事会(拍板的人)、board member董事会成员、director of board董事长/寄宿 board school寄宿制学校(给个木板睡觉)
broad宽广的/辽阔的(未被禁止的road路)、broadcast广播
branch树枝/分支分叉/分公司、brid鸟(在树枝上)
brand商标标牌(木头牌子)、烙印(刻在木牌上,打上烙印)、丑化/败坏名声(给某人打上烙印)
brandish挥舞(用木棒挥舞)
barbecue烧烤(木串烧烤)、barrel木桶(bar木条条做成的木桶)、a barrel/bottle/glass of beer一桶/瓶/杯啤酒
booth小隔间(用木头做的)/货摊(市场里的小木摊)/公用电话亭(木头做的电话亭)
barn谷仓/牲畜棚(木板搭起的棚子bar木条条)
beam横梁(木头做的梁)/光线(横梁有光线进来)/开怀大笑(脸上有光彩)、a beam of light一束光、brick砖块/用砖做的
bean豆子(在木头上生长豆芽)、bead珠子(木头做的珠子)
2.打击(用木头打,砰砰)
bat打击/球棒(用棍子打)/蝙蝠=>combat战斗(共同打击)、debate争论辩论(口头言语战斗)、rebate折扣(钱打回来)、discount打折扣、rebel造反(攻击打回来)
baton警棍(bat木头棍子打)、butt顶撞
bandit强盗/土匪/恶棍(用木棍抢劫,bank银行=>band土匪强银行)、brandish挥舞(用木头打)
beat敲打/敲击声=>节奏(打出节拍)、offbeat奇葩的(不合拍的)
bargain讨价还价/便宜货、haggal砍价乱劈
break打破弄破=>稍停=>短暂休期 broke the silence打破寂静
breach违背/违约/打开缺口(打破break合同)、breach of contract违反合同
broke破产的/break过去式
battle战斗(打击)/斗争、battlefield、battleground战斗场地、battalion军营(battle战斗、击打)、batter殴打
bruise擦伤(被打之后)、brutal残忍的/残酷的(用棒子乱打)、bitter苦涩的/痛苦的(被打了一样)、bit少量(被打了一点点)、embarrass使尴尬(用棒子打的尴尬)
bomb炸弹/轰炸(爆炸的声音)
boom繁荣(拟声词、欢呼雀跃)、recession衰退(往回走)、depression衰退
boost推动/促进(拿木头在后面打)、booster助推器、rocket火箭
3.禁止、约束(被木条、木棒阻挡)
bar阻挡/阻止(被木条、木棒阻挡)、barrier障碍/关卡、barricade路障/阻挡
ban禁令/禁止、banish放逐/驱逐(禁止ban在这块地方)
bay海湾(海边禁止范围)、harbour海港、enclose包围、peninsula半岛(往外突出)、penis阴茎(突出的意思)、insulate隔离/使孤立
broad宽广的/辽阔的(未被禁止的road路)、broadcast广播、brink边缘(禁止的边缘)、on the brink of war/death在战争/死亡的边缘上
border国界/边境(被order命令禁止了范围)、boundary边界/分界线(被禁止了范围)
boot靴子=>给违规停放的车辆加上夹锁(禁止动)
4.捆绑、约束(被木条围在一起)
bar一条/条状
bind捆绑/约束(静止乱动)be bound to do sth必须做什么(被约束去做什么)、in a bind处于困境之中(处于约束、捆绑的困境之中)、binding有约束力的
boundage绷带/用绷带包扎、bridge桥梁(将两边连在一起)、bridle缰绳/马勒/约束物、bride新娘(将两人连在一起)
band乐队(几个人困在一起)/环带(绑成了一个环)
bond债券(国家与你之前的关系被绑定)
blend混合/融合(都混合在一起)
boycott联合抵制/联合拒绝(联合起来不要什么东西)
5.向下、向后(木头根植于地下、后面)
back后背/背部/向后的、backer支持者(背后的支持者)、backbone支柱/脊梁骨、backup后援/支援
backhander贿赂、corrupt贿赂
bastard私生子/杂种(私底下生的)
bottom底部(向下的)/底部的、beforehand预先
beg乞求(地位低的向地位高的乞求)
fundmental基础的、infrastucture基础设施、stucture结构/构造
base底部/基地、air base空军基地、naval base海军基地、baseless毫无根据的、abase使谦卑(ad base主观向下)、debase降低/削减/贬低(客观向下到底部去)
base metal基础物质/贱金属、nobel metal贵金属、precious metal贵金属
basic基本的、basis基础、baseless无基础的
basin脸盆/盆地(向下凹陷的地域)、a barrel/basin of water一桶/盆水、bowl碗(向下凹陷)、bow鞠躬、bow tie蝴蝶结(用木条绑在一起)
box盒子(向下凹陷)/打拳击(拳击台类似盒子)、boxing拳击
bass男低音/贝斯(低下的声音)、bassist贝斯手
6.一块一块、一束一束(木头是一块一块的)
block大块(木头一大块)/街区(一块一块)大楼/阻挡堵住(一大块木头阻挡了)many roads were blocked
brick砖头(一块一块)、brick by brick一砖一瓦=>一点一滴的Roma was build brick by brick.
bunch串束(一串一束)/一群一伙、a bunch of bandits
bouquet一束、a bouquet of flowers一束花
bulk大块/体积、in bulk批发
battery电池/一组一串(电池一串买的)、a battery of question
bean豆子/豆荚(一串出现)、bead珠子(一串出现)
7.与球有关的(木头圆的)
ball球/舞会(舞会上有个灯球)、ballet芭蕾舞、balloon气球
ballot投票选举(投进去的球状)
bald秃顶的(脑袋光秃秃球状的)、receding hairline后退发际线
bold大胆的/粗体的/黑体的(胆子吹圆了)
8.拟声词
bomb炸弹(炸弹爆炸、炸弹是球状的)/轰炸、bomber轰炸机
boom繁荣/激增、bloom盛开、baby boom婴儿潮、phone booming电话轰炸
boost促进/增长(拟声词,boost推)、booster助推器/产生激励作用的事物、refresher提神物
bang突然巨响/敲门(拟声词,bang的一下)、big bang生活大爆炸
bound跳跃(拟声词、bangbangbang)、rebound反弹、bounce弹跳(拟声词、弹跳一来一回的动作)
注意:bind-bound、find-found
bubble泡沫(泡泡破了)/心中洋溢某种情感(开心的都要冒泡了)
bark狗叫(狗叫声)/树皮
· S词:曲线和分割
1.se-/sc-分割、分离(太极阴阳)
section部分(分割成多个部分)、subsection细分(大部分下面)、sector行业领域(人为分割多个不同的部分,大的行业)、stage阶段、department部门(分成多块)、room房间(分割开)、rack(将物体分隔开)
season季节(分成四个季度)、semester学期、secure安全的/获得(分割下这一块)
insect昆虫(节肢动物,一节一节的蜈蚣,分割开的)、intersect交叉(内部交叉划分)、intersection十字路口、dissect解剖(彻底的分开了)
secede割断(分开走)、secession脱离(分割开了)、secessionism分裂主义、recede衰退(往回走)、recession衰退、depression衰落、precede领先(向前走)、accede同意(往前走)、accept、assent同意
secret秘密(将秘密分开不让人知道)、secrecy保密、secren秘书、classify秘密
seduce引诱/勾引(勾引到房间)、hooker妓女
seclude隐居/隔离(分开之后关住)、include包括(关在房间里)、exclude排除(关在房间外)、close关闭
segregate分离(将人分开)、segregation隔离、quarantine隔离(防疫隔离,有病才隔离)
select选择(将某物从分离开)、elect选举(将某人分离出来)
scratch抓/划掉(把东西分割开)、scream尖叫(具有割裂感的声音)、school学校、scholar学者、scholarship奖学金
scrimp节衣缩食(切割东西)、scrimp and save节衣缩食省吃俭用、scatter撒/散开(把盐分散开)、scandal丑闻(分开的新闻)
scale规模/范围(穿山甲鳞片=>尺子刻度=>占了多大的规模)、scope范围/能力(分开的范围)、escape逃脱
scheme方案(方案更加细致,一点点分开)/阴谋(分得非常清楚的计划)、schedule日程表(分割非常清楚的日程)、conspriacy阴谋(con共同去spr呼吸,沆瀣一气)、plan计划
semi-一半的、semifinal半决赛(一半final最终的)、semiautomatic半自动化(一半automatic自动化)、semicircle半圆、semiconductor半导体、conduct引导/组织
2.st-停止(太极以不变应万变、分开不要动)
stay呆在那(不要动)、sit坐在那(不要动)、stand站在那(不要动)/忍受(不能再不动了)、stay clam、stamp邮票(集邮长期存放)/按压(铁板钉钉不动)
star恒星(不动的行星)/主角、movie star、stare凝视(盯着看不动)、stage舞台(舞台布置好不要动)/阶段(在某个阶段不动)、stagnant停滞不前/僵化的(在一个阶段停滞不前了)
stable稳定的/牢固的(不动的)、steady稳定的、still不动的、stabilize稳定、stability稳定性、safeguard stability维护稳定、unstable不稳定的
staff全体职员(铁打的算盘流水的兵)、stuff塞满(吃太多塞住了)
state国家(政府意义上的国家)/陈述/状态、country国家(地理位置上的国家)、nation民族(人民意义上的国家)、a stable state稳定的状态、statement说明(陈述说明)、statesman政治家(国家元首)、status地位(稳定的地位)
station车站(停下来)、stationery文具(常驻工具,停在桌上)
statue雕像(在那不动的)、statue of freedom自由女神像、sculpture雕塑(sc分割,刻画出来的)
stupid傻的(呆子)、silly愚蠢/傻(呆子)、still仍然(一直是这样)/静止不动的
stuck困住(困住不能动)、struck罢工(扭曲到一起不干活)
staunch忠诚的、stubborn顽固的、stern严厉的(非常严厉冥顽不化)、stifle窒息(窒息不能动)
stink臭/糟糕透了(东西放了很久不动就臭了,流水不腐户枢不蠹)、stale恶臭的/无生机的/发霉的、stalemate僵局、impasse僵局、stain弄脏/污点(污渍弄上去不会动)、static静态的/停滞的(不动的)
stipulate约定/规定(定好了就不要动)、regular遵守、regulation规定、rule尺子
stop停住、store商店/仓储(货品放在哪不要动)/存储(把货物放在那)、stall货摊(把货物放上去不动)/栏杆/停住(不动)、not stall不要拖延、install安装(在栏杆里装)
stack堆叠(堆一堆东西不动)、stock股票/存货(钱货物放在那不要动)、stock market股票市场、stocking长袜子(圣诞礼物都存在长袜子里)、sock短袜子
stone石头(不动如山)/吓到(瞬间把我石化了)、shock惊吓、startle惊吓、stun惊吓到晕过去/休克、stool凳子(动不了)
stout牢固的/建议的(出来不要动)、stuck困住(困住不能动)、stick棒子、a stick in mud形容老顽固(插在泥里的棍子,茅坑里的石头又臭又硬stink and stuck)
stereotype刻板印象(一直不动的想法)、stereo立体声(声原是在空间内不动的)
steam蒸汽、stream流水
3.str-扭曲、扭转(曲线逻辑)
slim苗条的、sexy性感的、sex性(身材S曲线)
strike打击/罢工(扭转身体打出去有力气)、strife冲突/纷争(体现力量感的扭曲)、political strife政治冲突、strive努力/奋斗(努力的时候肌肉扭曲)、strive to do sth努力做、strive for justice力争正义、China-US trade row中美贸易战
striking引人注目的、seduce勾引(分离到另外一个管道)、abduct诱拐/拐卖(引导走了并且远离)
struck罢工(扭到一起不干活)、strong强壮的(肌肉扭曲的)、strength力气/力量、strengthen加强
strangle绞死(特别扭曲的angle角度,三角锁死)/抑制(勒死)、strange奇怪的(扭曲的想法)
stray迷路/走失(思想蜿蜒扭曲到不知道什么地方去了)、lost密室
strap绑带/腰带(扭曲的带子)、stripe条纹/线条(曲线) 、strip条/带、stripper脱衣舞女、strapless无肩带的、streak条纹(弯曲的条纹)、streaky pork五花肉
strategy策略/战略(迂回的作战方式)、strategic战略性的、strategist战略家
stress压力、pressure压力(挤压的扭曲感)、stress拉紧、distress苦恼
stream溪流/流动(蜿蜒的溪流)、steam蒸汽、street街道(蜿蜒的街道)
==strain(train训练)、strict、string(to draw tight)==
strain拉紧/过劳、constrain约束(共同拉紧)、restrain抑制(反复拉紧,来回拉紧)、distrain束缚、overstrain过劳(过度拉紧)
strict严格的(被约束的很紧)、constrict压迫收缩(共同拉紧)、restrict限制(反复拉紧,来回拉紧)、district区域(划分区域)
string绳/琴弦(曲线)、stringent严厉的、stern严厉的
4.sub-向下的、sur-向上的(分割线向上向下)
subway地铁、subagent下级代理(下级agent机构)、subscribe订阅(苹果手机里的写下来,下单)、submit提交(从下往上交)
subtitle副标题(下一级的标题)/字幕、subsurface地下的(表面下的)
subnormal次正常(有点神经)、abnormal不正常、subconscious潜意识/下意识(下conscious意识)
subject学科/主题/主观的、object宾语/客观的
submerge沉没(向下merge合到一起)、submarine潜水艇(向下marine海洋的)
subdivide细分(向下divide分配,分配到下级)、subsection细分
5.-sens-、-sent-感觉
sense感觉/意义、sensibility感觉、senseless无情的/糊涂的(没有意义)、nonsense废话(没有意义)、consensus共识(共同感觉到)
sensitive敏感的(有感觉的)、insensitive不敏感的(没有感觉的)、insensible麻木的/无知觉的(没有感觉的)、oversensitive超敏感的(超过感觉的)、hypersensitive过敏的/过敏症(超高级敏感,过敏了)、photosensitive光敏的(photo对光敏感的)
assent同意(as-与ad-表示靠近,靠近某种感觉有同感)、accede加入/同意、assert声称/断言(靠近插入进去sert插入,把别人谈话打破插入进去)、asset资产
consent同意、dissent不同意/异议(dis分开的感觉)、dissent反对者/反对派、resent懊恼/愤恨(反复思来想去的感觉)
sentiment情绪(现在的感觉)、presentiment预感/预知(提前的感觉)、sententious感性的(随着感觉走的)
6.-scrib-、-script-写
scrib写下/记下、ascribe归因于(给谁记下荣耀)、describe描绘(写下来)、prescribe规定/开药方(提前写下来stipulate约定/规定、regulation规定)、proscribe禁止(提前写)、subscribe订阅、inscribe雕刻/题字(写到里面去)
transcribe抄写(把一个本子写到另一个本子)、translate转译/翻译、transcript副本(写下来另一个脚本)
script写作/脚本、scripture签名、description描绘(写下来)、prescription药方、conscript征募(把士兵名字都写下来)、superscription标题(手稿最上面)、headline标题
manuscript手稿(手写体)、manu手写、postscript附言(后面写的)、subscription订阅、rescript重抄/法令(法令多抄几遍)
7.-spec-、-spic-、-spect-看
special特别的(特别好看的)、especially特别的(出去来特别好看的)、specimen样品
species种类(早期人对物种判断就是看)、endangered species濒危物种
specious体面的(可以看的)、specific具体的(看的很具体的)、conspecious显眼的(共同体面的)、perspective透视(透过去看)
expect期待(向外看)、aspect方面(向一个方面看)、inspect检查(向内看)、introspect内省(交叉审视)、prospect展望(向未来看)、respect尊重、retrospect回顾(向以前看)、suspect疑似(真相扭曲)
suspicious可疑的、despicable鄙视(向下看)、perspicacious敏锐的、perspicuous显眼的
8.一词多记
(1)sequence序列
sequent顺序的、consequent结果、inconsequent无关紧要的(非重要结果,不需要排列的)、subsequent随后的(下面顺序的=>向后顺序的)、consequence后果/结果(共同的序列集合=>结果)
(2)sert插入
assert断言(插入进去)、reassert重新断言、desert沙漠/背离(向下插入过去=>背离初衷)、insert插入(向内插入)
(3)satisfy满足
satisfy满足、satisfaction满足、satiable满足的、insatiate永不知足的(in不satiate满足的)、satisfactory满意的、satiation饱足感、saturate饱和的、supersaturate过饱和的(超过饱和)
(4)scend攀爬
ascend上升(a朝一方向,scend攀爬,向上攀爬)、ascendancy优势(向上的优越)、ascent上升(与ascend相同)、descend下降/后代(向下攀爬)、descendant后裔(向下养育ant人)、condescend屈服(共同向下)、transcend超越(交叉攀爬)、
(5)serve服务/留心
conserve保守(共同留心)、deserve应得(向下服务)、observe观察(细致服务)、reserve保留(再次服务)、preserve保存(提前服务)、server服务器、servant服务员(ant人)
· E词:出去、向外
1.比较级、最高级(出去、向外)
tall高的、taller比较高的(er出来一点)、tallest最高的(e出来st停止了,出来到停住了,最出来的)
2.e-向外
eccentric古怪的(超出central中心的)、wried古怪的
elastic有弹性的、bounce弹跳、flex灵活的
elicit引出、emit发出(mit交)、submit提交(从下往上交)
3.ex-出去、向外
enumerate列举(把number数字拿出来排列)、eradicate根除(从根本上排除,radical根本的)
England英国(e向外、land土地,英国在地图上是欧洲多出来的一块)
exam考试(把水平检查出来)、examine检查(把水平检查出来)、exchange交换(拿出来换)、exit出口
example例子(从很多事物中举一个例子出来)、except除..之外(把东西放在外面)、apart from除..之外还有、exception例外、exceptional例外的
excel超越(比其他人好)/表格、excellent优异的/杰出的、excellence杰出性
exhibit展览(放到住的外面)、exhibition展览会、exhibitor参展商、exhibitionist展现欲很强的/表演欲很强的、inhabit定居、habit习惯
expand扩张/膨胀(pand方位向外)、expandsion扩张、explode爆炸(向外膨胀的)、bomb爆炸、burst爆炸
extend扩展/延伸(tend倾向)、extended family四世同堂、intend打算(内在倾向去做什么)、pretend假装(提前假装做什么)、contend竞争(共同延伸两边争夺资源)、attend参加(朝某个方向延伸过去)
extent范围(tent帐篷)、to…extent在…程度上、extensive广泛的、extension延伸
expend花费(spend花费,把钱花出去)、expendable可花费的、expenditure开支、expense花费、expensive昂贵的(花了很多钱)
expect期待(向外看,望眼欲穿)、respect尊重(反复看)、unexpected意想不到的(没想到的)、out of expectation
experience经验(向外走实践经验)、experienced老练的(经验完成的)、experiment实验(把经验做出来)
expert专家(经验远超别人之外的)
export出口(ex向外port港口)、manufacturing export制造业出口、import进口(im向内port港口)、transport交通(trans相交prot港口,多条路口相交)
expose曝光/暴露(把东西放到外面)、exposure曝光(真相曝光)、exposition展览会(把东西放到外面)、exhibition展览会
explain解释(把话说出来)、explicit清楚明白的(pli折叠翻转,折叠后展开让人明白)、implicit含蓄的(折叠后向内关起来不让人明白)
express表达(说出来)/快速(快递业务出去)、expression表达、expressway高速公路(快速的路)
explore探险(向外去看看)、explorer探险家
exclude排除(关在房间外)、exclusive独家的/唯一的(放在外面的)、exclusive interview独家专访、exclusively唯一、include包括(关在房间里)、seclude隐居/隔离(分开之后关起来)、close关闭
excavate挖掘(向外cave山洞,挖出来一个山洞)、excavator挖掘机、exhume挖掘(hum泥土,从泥土中挖掘出来尸体)
exceed超越(走出去了)、exceeds supply供不应求、proceed向前走、exceedingly尤其/特别的、especially特别地
excess超过/过量、excessive多余的(超过太多了)/过分的
exclaim呼喊(向外claim喊出来的)、claim声称、acclaim称赞/欢呼(朝向喝彩)、proclaim宣告(提前声称)、reclaim召回(往回召唤)、disclaim否认(不承认)
expel开除(放到外面去)
exhaust耗尽(haust消耗,都耗出来了)、exhausted感觉精疲力尽(主观感觉)、exhausting令人感觉精疲力尽(客观感觉)、exhale呼出/呼气(向外hale精神矍铄的呼气)、inhale呼入
expire到期/死亡(把spire气吐出去了、spirit精神,精气神)、inspire吸气(把气往里吸入)/产生灵感/鼓励、encourage鼓励、inspiration灵感
external外部的、external factors外部因素、internal内部的、internal factors内部因素、exterior外部(建筑物的外观)、interior内部(建筑物/空间的里面)
extract提取(-tract拉扯,拉扯出来)、extractor抽油烟机、tractor拖拉机、trace跟踪、track跟踪、contract合同(相互拉扯将合同一分为二)、absract摘要
4.en-、em-用力(产生力量)
(1)en-用力
enter入口(用力进去的)、exit出口
encourage鼓励(使产生courage勇气)、discourage泄气(否定勇气)、courage勇气
enjoy享受(使爱上它)、enjoyable令人愉快的
enlarge扩张(使变大)、expand扩张
enslave奴役(使奴隶)、slave奴隶
endanger危及(使遭到危险)、endear受欢迎的(使dear喜爱的)
endure忍受(使during熬过一段时间)、stand忍受、temper脾气
engage参加/订婚(使gage得到)、enhance提高(使hance向上了)
enlighten大彻大悟(使人前后都发光)、enlightened开明的
enlist征募/入伍(使名字到名单上)、conscript征募(把士兵名字都写下来)
enquire询问(使question疑问)、inquiry询问(美式询问)
enrage暴怒(使得rage激怒)、enrich使富裕(使rich富裕)
entitle为..命名/使有权利(使title命名)、enable使能够、enact扮演(使actor演员)
encircle包围(使围绕着)、encase包住(使在case箱子里)、encode编码(动词,使代码code编辑)
enforce加强(使力量用上去)、strengthen加强
enchant使着迷/使迷惑(使chant音律迷住、chat聊天)、encounter遭遇(使对立面counter遇见)
ensure确保(使确保,确保事情真的发生)、insure投保(保险投保)、assure向保证/使确信(使某人相信什么事情,不一定发生)
(2)em-用力
empty空的(使都倒出去了)、evacuate清空(使都vac空出来了,vacation空出来的假期)、vacuum真空
employ雇佣(使ploy工作)、employee雇员、employer雇主/老板、employment职业/雇佣
emphasis强调(使explain解释的清楚)、express表达、explain解释
empire帝国(使帝王的spire气息扩张出来的)、imperialism帝国主义、expire到期/死亡(把spire气吐出去了)、inspire吸气(把气往里吸入)/产生灵感/鼓励
embody体现(从人的身上体现出来)、embed植入(使用培植器/床)、embedded嵌入式、embedded system嵌入式系统
embrace拥抱(用力brace支起,棍子支起)、bra胸罩(支撑起胸部)
embarrass尴尬(使尴尬)
emboss凸出/浮雕(使你成为老板,凸出出来)
· Z词:之,表示曲折
zigzag曲折的、flex弯曲/弹性、flexible可弯曲的/灵活的、inflexible顽固的/不可弯曲的(不可弯曲的)
flexion弯曲、inflexion拐点(弯到不能弯了)、influence影响
go zigzag走之字形(形容喝酒后东倒西歪)、why are you still zigzaging?为何你仍然徘徊犹豫不定?
zombie僵尸(东倒西歪着走)
zoo动物园(动物园的路曲折的)、zebra斑马(斑马身上的图案曲折)
zest热情/激情、zeal热情/激情、zealous狂热的(例如背单词的激情,上上下下曲曲折折)、zealots狂热者
zoom伸缩(来回曲折)、zoom in缩回、zoom out伸出去、air-zoom气垫(可伸缩有弹性的)
golden zoom-stick金箍棒(金色的可伸可缩的棒子)
zip拉链(上上下下曲曲折折)、zipless放纵的(不拉拉链的)
· M词:手
1.手
manufacture生产/制造=produce、manipulate操作、master、masterbate手淫
manual使用手册=handbook、manuscript手稿、inscribe雕刻、describe描写
masterpiece杰作
manifest表明/明显的(举手表明态度)、demonstrate说明、indicate说明、explain解释、illustrate说明、illusion错觉
2.动mov-、mot-、mob-
move、movement运动、remove拿开
mote尘埃(随风飘动)、motor马达、motive动机、motion运动、motto格言、remote遥远的、promote促进
mob暴民、mobile移动、China mobile中国移动、China unicom中国联通、moblize动员
maintain维护、mend修理(抓住、握住)
3.数量逻辑相关(数数)
monster大怪兽(数量之大)、many、much、math、meter米、centimeter厘米、mile英里、modest适度的/谦虚的
minibus、minibar、miniskirt迷你小裙摆、miniature微型的、max
micro微观的、microsoft微软、macro宏观的、macro-economy、middle中间
multi-多的、multiply乘法、multimedia多媒体、multipurpose多目的、multifunctional多功能、multiple多人的
magnify放大/扩大、magnificent华丽的、thrive繁荣的
merge融合(加法)、submerge沉没(向下加)、plus加、add加、magazine杂志/弹夹(加到一起)
mass团/块/群众(多人的)、mass shooting大规模枪击事件、member成员、massive巨大的
mess混乱的(多导致混乱)
medi-中间、media媒体(中间的媒介)、Mediterranean地中海、meditate深思/考虑
mega兆、megalopolis特大城市(北京/上海/广州/武汉)
mean意思/小气(数量上斤斤计较)/平均值、meansure衡量
25 Mar 2020
最近拜入名师门下学英语,虽然说是学英语用的却是算法逻辑。本文将整理该套课程(《逻辑英语》钟平)的核心内容,帮助NLP算法师真正了解自然语言。
· 中英文切换完整公式
1.举一个例子
中文:由于通信网络的快速发展,中国智能手机用户数量近年来以惊人速度增长。
英文:According to the rapid development of communication network, the number of chinese smartphone users has increased at an alarming rate in recent years.
中文拆分:由于通信网络的快速发展(状语1),中国智能手机用户(定语1)数量(主语)近年来以惊人速度(状语2)增长(谓语)。
英文拆分: According to the rapid development of communication network(状语1), the number(主语) of chinese smartphone users(定语1) has increased(谓语) at an alarming rate in recent years(状语2).
2.基础公式
中文公式:(状1\定1)主(状2)谓(定2)宾(状1)
英文公式:(状1)主(定1)谓(状2)宾(定2\状1)
思考:中文属于神仙语体系,英文属于形式逻辑,中文是前重审美,英文是后重审美
3.升级版公式R1+R2:针对状语、定语
(1)R1:状语、定语内部倒序
中文拆分:由于通信网络的(顺序1)快速发展(顺序2)
英文拆分:According to the rapid development(顺序2) of communication network(顺序1)
(2)R2:状语、定语并列不变序
问题1:什么是并列不变序?
例如:1,2 and 3=>2 and 3,1或者1,2 and 3,4=>2,1 and 3,4
问题2:并列关联词有哪些?
表示起承转合的词语,例如表递进moreover、also、and,表转折however、but、although,表层次first、finally,表强调in fact,actually等,详细参考(有道逻辑英语公共号)
4.升级版公式单黄蛋+双黄蛋:针对句子
(1)双黄蛋:句子+并列词+句子
I love you and I hate you.
(2)蛋黄蛋:主谓宾并列
You and I are friends.主语+并列词+主语
I love and hate you.谓语+并列词+谓语
I love you and her.宾语+并列词+宾语
5.想要用好公式的注意事项
(1)学会找主干
中文主干(中译英):标准模型(“的”字后面)、非标准模型(中文四大金刚律)
中文四大金刚律:主语补全;谓语补全;关联词补全;被动补全
例如:想要用好公式的人(主语补全)需要(谓语补全)注意的事项
Who want to good at use logical formula should pay more attention.
英文主干(英译中):主语(句首第1个独立名词),谓语(排除被短语包含的动词),宾语(谓语后第1个独立名词)
主语:开头不是状语就是主语,标准模型(the+n\a+n\adj+n\全大写\it代词)、非标准模型(动名词,句子做主语(非常少):主语从句,形式主语it\there)
例如:Who want to good at use logical formula should pay more attention.
It should pay more attention that people want to good at use logical formula.
谓语:排除被短语包含的动词v
(2)分清定语和状语
定语用来修饰、限定名词范围,状语描述所说内容的条件
中文公式:(状1\定1)主语=>中文状语1带“逗号\停顿”,定语在“的”前面
英文公式:宾语(定2\状1)=>后重审美,宾语无定语,状语需后置
例如:I love the girl in the end of the world.(宾无定,状后置)
(3)考虑状语应该放在哪
英文公式:(状1)主(定1)谓(状2)宾(定2\状1)
状1与状2可调整位置,但宾语无定语,无定2,状1需后置
(4)熟悉R1与R2
(5)理清R2与单/双黄蛋联系与区别
联系:都需要有关联词(并列词)例如and、but
区别:R2针对状语、定语,单黄蛋针对主谓宾,双黄蛋针对句子与句子
(6)了解主系表:主语+是(系)+什么样子(表)
(7)了解插入语:一般插入语(位置随意,in my opinion),特殊插入语(同位语,位置固定,主语后面,表示对同一个人的描述)
同位语与主并单黄蛋的区别(前者描述的是同一个人,后者描述的是不同两个人)
(8)了解英汉互译双宾语:中文出现“把、使 ”必然出现双宾语
例如:I give the book to her.我把这本书给她(双宾语the book这本书、her她)
6.公式破解英汉互译
中文:在中国海南文昌卫星发射基地,代表全球领先水平的名为长征5号的新型重型火箭在昨天被成功发射进入了太空。这是一次吸引全球关注的发射,并且打破了两年前因上一次发射失败造成的僵局。
英文:In Wenchang rocket launching base in Hainan of China,a new type of heavy rocket named LongMarch5 that represents the high level technology of world was launched sucessfully into space yesterday.It is a launching event that attacts world attention,and also broks the deadlock caused by a former launching failure two years ago.
中译英公式:在中国海南文昌卫星发射基地(状1+R1),代表全球领先水平的名为长征5号的(定1+R1)新型重型火箭(主)在昨天被成功(状2)发射(谓)进入了太空(宾)。这是(主)一次吸引全球关注的(状2)发射(谓),并且(双黄蛋)(补主语)打破了(谓)两年前因上一次发射失败造成的(定2+R1)僵局(宾)。
· 语法革命
1.重建时态:共9大基础时态,7大杂交时态,共16种
(1)9大基础时态:分为点时态和段时态
点时态(粗点)
一般过去时:V-ed
一般现在时:V
一般将来时:will V或者是be going to do
点时态(精点)
过去进行时:was/were v-ing
现在进行时:am/is/are v-ing
将来进行时:will be v-ing
段时态
过去完成时:had v-ed
现在完成时:have/has v-ed
将来完成时:will have v-ed
(2)7大杂交时态:点段杂交、点点杂交
点段杂交(精点+段时态)
过去完成进行时:had been v-ing
现在完成进行时:have/has been v-ing
将来完成进行时:will have been v-ing
点点杂交(一般过去+点时态)
一般过去将来时(一般过去+一般将来):would v
过去将来进行时(一般过去+将来进行):would be v-ing
过去将来完成时(一般过去+将来完成):would have v-ed
过去将来完成进行时(一般过去+将来完成进行时):would have been v-ing
2.虚拟语气:不可能的假设,表达一种情绪
时间
从句谓语形式(虚拟的条件)
主句谓语形式(虚拟的结果)
将来
动词过去式(be、were)、should+动词原形、were to+动词原形
would/should/might/could+动词原形
现在
动词过去式(be、were)
would/should/might/could+动词原形
过去
had+动词过去分词(had done)
would/should/might/could have+动词过去分词
注意:(1)虚拟一般是对过去(因为懊悔),主句谓语看主句的事件是否已经发生,例如If I had not lied, She would not have left.
(2)杂交主句与从句分开看,一般为虚拟条件(过去)+虚拟主句(现在)、 虚拟条件(现在)+虚拟主句(将来)
3.常用介词:
简约之美:To have a government that is of people, for people, by people. 三民主义
Life is full ups and down.生活充满起起伏伏
(1)第一梯队:at、in、on
at表示1定点定位(@符),例如laugh at嘲笑(针对性笑)、laugh to面朝微笑、laugh off一笑了之(笑到脱离)
at表示2刻度(指针具体到哪个位置了),例如He is droving at 200 miles an hours.
in表示在里面
on表示1接触,例如turn on打开(接触上开关)、turn off关掉(脱离开关)、on the border在边界(接触上边界)、on-again,off-again strategy若即若离的政策
on表示2依靠(接触上靠着),例如rely on依靠、it’s on me这顿饭我请(这顿饭靠我)
on表示3进入一种可持续状态(接触上了)onlookers吃瓜群众(持续不停给的看)、on fire着火(持续着火)、on holiday在假期(在假期中)
注意:时间上区别
非一天之内:on对应一天,on monday;in大于一天,in weekends;at小于一天具体到时刻,at six o’clock
一天之内:on对应具体一段,on morning of your birth你出生的那天早上;in长时间一段in the morning(6点到12点)、in the afternoon;at精确点定位at night、at noon
on time准时、in time及时
(2)第二梯队F4:of、off、for、from
of表示从属、内含,be afraid of怕什么东西内含、be made of被什么制造出来(内含什么东西)
from表示过程感,from tip to toe从头到脚、from monday to friday从周一到周五
off表示脱离(溜走了),take off脱掉、see sb off送别
for表示1为了(表目的,接词),for honor为了荣耀
for表示2因为(表原因,接句子),I didn’t return, for I didn’t know he was there.我不能回去,因为我不知道他在哪
for表示3一段时间(用这段时间来干嘛),I have been here for 5 days.
(3)第三梯队:around、about、over转圈圈
around表示转圈圈,around the clock夜以继日(连轴转)、money around闲钱(可周转的钱)
about表示转圈圈,talk about谈论(围绕一个话题转圈)、about-face态度完全改变(脸转了180度)、standing about/around闲着(四处转圈圈)
about vs of:I know of you.我知道你一些属性、I konw about you我对你知根知底(你全方位我都了解)
about vs on:about泛泛而谈、on紧密接触(关于什么议题的会议、关于什么论点的论文)
over表示翻转、跨越(带贬义),over the worst跨过艰难、through the worst挤出艰难、game over游戏结束(游戏翻过来了)、turn things over翻来覆去的想
around vs over:turning the company around/over is not easy.前者around盘活/后者over盘垮
(4)第四梯队:between表示两者之间、among表示好多个中间
(5)第五梯队:up表示向上,上传up主、up in the air悬而未决、stay up熬夜(站着不睡)
介词特训:get+介词
get about/around四处走动(人转圈圈)、新闻传开(新闻转圈圈)、get around绕开/回避/克服(回避问题problem、回避规章制度rules)、get around to sth终于去做(转了半天圈圈去做了)
get across观点传达(从表面穿过去、目的性一对一)
get ahead工作学习出人头地(头部选手/领先)
get along相处融洽(沿着一起走,人与人并肩前行)、应付进展(人与事情)
get on/along相处融洽、进展顺利、get on 继续做
get at够着(艰难地点定位)、查明/发现(艰难地够着真相find out)、到某个地方、get at sb(批评/指责某人)
get away离开(drag on开个没完,拖拖拉拉紧密一个接一个)、逃离、休假(离开工作岗位)、别胡扯(别人说话让人走开),away+from=off,get away from me/get off me、get away with做了坏事而不受惩罚(get away with murder无法无天/逍遥法外)
get back回到(get back to the main point)、get back to回头再答复、get back at报复(回头找你算账)
get behind落后/拖延、get behind with和什么东西一起落后、get behind sb支持
get by钱勉强够花(by依靠)
get down下桌子(小孩子说下桌子)、让人沮丧、get down to开始做很花精力做某事(事必躬亲)
get off不要碰、动身(脱离某地点)、下班,等于get away from没受惩罚
get over忘记某人/翻篇、从疾病中康复、走出来、克服困难
get up起床、特意装扮(重要等级上升)
4.常用链接词(conjunction):
(1)并列连词and
(2)转折连词but、however
(3)因果连词because、so(英文因为所以不能同时出现)
(4)选择连词or
02 Dec 2019
斯坦福的课程中讲到命名实体识别HER,在学术界中认为命名实体识别是NLP已经解决的问题,其解决方式的原理便是采用条件随机场CRF。这里借助封装好的CRF++工具包实现中文命名实体识别。
环境准备:
Windows crf++下载地址
案例1数据下载地址
案例2数据下载地址
· 训练CRF模型
打开cmd命令框,进入CRF目录
crf_learn crf.template train_data.txt model_test
# crf.template用来修改CRF模型
# train_data.txt训练语料
# model_test训练出来的模型名称
· 使用CRF模型预测
crf_test -m model_test test_data.txt> output_data.txt
# model_test模型名称
# test_data.txt测试语料
# output_data.txt结果语料
参考文献:
用CRF++开源工具做文本序列标注教程
CRF++使用简介
CRF++官方文档
02 Dec 2019
之前写过Word2vec的实现方式,现在用gensim实现doc2vec,由于调用机制很像,就直接用nltk_data的数据,该数据包安装方式可参考win10环境下python3无法下载nltk_data的问题。
Python代码如下
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
data = ["I love machine learning, its awesome",
"I love coding in python",
"I love building chatbots",
"they chat anything well"]
tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()),tags=['SENT_%s' %str(i)]) for i,_d in enumerate(data)]
model = Doc2Vec(size=100,alpha=0.01,min_count=2,dn=1)
model.build_vocab(tagged_data) # 训练词库
for epoch in range(10):
print('iteration{0}'.format(epoch))
model.train(tagged_data,total_examples=model.corpus_count,epochs=model.iter)
model["SENT_0"] # 句向量
model.docvecs.most_similar(0) # 相似句子
20 Nov 2019
最近在看2019斯坦福NLP公开课,突然萌生一个想法,准备把课程所有涉及到的知识点,都用python实现一遍。由于第一课讲到word2vec,遂写下用gensim实现word2vec和fasttext的方法。其实gensim库官方文档已经介绍的很详细,想追根溯源的同学可参考gensim官方文档,本博文只记录具体的实现路径。
1.导入python所需要的包
from gensim.models import fasttext
from gensim.models import word2vec
import pandas as pd
import logging
import jieba
其中gensim和jieba需要单独安装,使用anaconda的同学可以参考Anaconda安装其他第三方库
2.数据导入与预处理
data = pd.read_csv("d:\\test.csv",sep="\t",encoding='gbk',header=None)
sentance = list(data[0])
# 对每行句子进行中文分词
def segment_sen(sen):
sen_list = []
try:
# 可以考虑添加业务词库、去停用词,具体参考jieba官方文档
sen_list = jieba.lcut(sen)
except:
pass
return sen_list
# 将数据变成gensim中,word2wec函数的数据格式
sens_list = [segment_sen(i) for i in sentance]
数据集test.csv下载地址
3.训练word2vec模型
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec(sens_list,min_count=1,iter=20)
model.save("word2vec.model")
4.调用word2vec模型
model.wv.most_similar("手续费")
5.fasttext模型训练及调用
word2vec和fasttext算法最大的差异在,前者无法识别模型中未训练过的词,而后者可以解决未登录词的问题。
# 训练fasttext模型
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model1 = fasttext.FastText(sens_list,min_count=1,iter=20)
model1.save("fast_text.model")
# 调用fasttext模型
model1.wv.most_similar("账单分期")
附1.Gensim模型参数及再训练
# Gensim模型参数调整
model = gensim.models.Word2Vec(sentences, #输入语料
window=2, #窗口大小
size=100, #维度
alpha=0.03, #学习率
negative=20, #负采样数量
min_count=2, #最小出现次数
workers=10) #进程数量
# Gensim模型再训练
new_model = gensim.models.Word2Vec.load('mymodel')
new_model.train(more_sentences)
参考代码:Gensim模型参数及再训练
附2.模型调优思路
1.保证训练数据集的量足够大,且文本中没有过多错误的词汇,例如手续费被翻译成水费;
2.数据预处理分词阶段,需要整理好对应的业务词库和停用词库;
3.若没有大量数据或高性能GUP去构建模型,可考虑已训练好的词向量模型,例如腾讯词向量模型;
15 Nov 2019
在自然语言应用过程中,计算相似度是我们常见的问题,其准确率直接影响到文本聚类、文本泛化、QA检索等一系列问题,这里尝试复现我爱自然语言处理中基于genism的相似度计算方法。
Part1. 基础知识点
在实现相似度计算前,需要了解以下知识点,如果已有扎实基础的同学可以直接跳到Part2。
TF-IDF、余弦相似度、向量空间模型
参考资料:
(1)TF-IDF与余弦相似性的应用(一):自动提取关键词
(2)TF-IDF与余弦相似性的应用(二):找出相似文章
(3)现代信息检索第6讲向量空间模型 王斌
SVD和LSI
SVD(Singular value decomposition)奇异值分解,这里需要扎实的线性代数知识,基础比较弱的同学可以先从麻省理工公开课:线性代数开始学起,基础好的同学可以看一下Singular Value Decomposition
了解完SVD后,再看LSI就轻松多了。
Part2. 了解gensim库
Part3. 使用gensim计算相似度
27 Aug 2019
最近总是遇到录音转译文本格式化的问题,遂写下该博文,以便后续应用:
原始语料下载地址:dataformat文件夹
Python文本格式化程序如下:
# ==== 单个文本格式化 ====
infile = open("d:\\811901011508591.txt","r",encoding="gbk").readlines()
outfile = "d:\\test1.txt"
print(infile)
datas=[]
# 去除文本第一行
for i in infile[1:]:
# 对数组每一个元素再切分
row = i.strip().split(" ")
datas.append(" ".join(row[2:]))
# 数组打印输出
print("\n".join(datas),file=open(outfile,"w",encoding="utf-8"))
# ==== 批量文本格式化 ====
import os
root = "d:\\test\\"
for root,dirs,files in os.walk(root):
for n in files:
n = root + n
infile = open(n,"r",encoding="gbk").readlines()
datas = []
for i in infile[1:]:
row = i.strip().split(" ")
datas.append(" ".join(row[2:]))
print("\n".join(datas), file=open(n, "w", encoding="utf-8"))
02 Aug 2019
之前有同学在讲关键词的时候,有同学提出热词怎么计算,遂将热词统计方法分享出来。
Python热词统计程序如下:
import jieba
text="小明硕士毕业于中国科学院计算所"
seg_list = jieba.cut(text, cut_all = False)
content = " ".join(seg_list)
print(content)
# 将文本拆分成列表
c = content.split(" ")
print(c)
# 读取列表,并计数
for i in c:
print(i,c.count(i))
Python热词统计结果如下:
小明 1
硕士 1
毕业 1
于 1
中国科学院 1
计算所 1
07 Nov 2018
鉴于最近BERT在人工智能领域特别火,但相关中文资料却很少,因此将BERT论文理论部分(1-3节)翻译成中文以方便大家后续研究。
· 摘要
本文主要介绍一个名为BERT的模型。与现有语言模型不同的是,BERT旨在通过调节所有层中的上下文来进行深度双向的预训练。因此,预训练的BERT表示可以通过另外的输出层进行调整,以创建用于广泛任务的状态模型,例如问题转换和语言参考,而无需实质的任务特定体系结构修改。
BERT在概念上简单且经验丰富。 它在11项自然语言处理任务中获得了最新的最新成果,包括将GLUE基准推至80.4%(绝对改进率7.6%),MultiNLI精度达到86.7%(绝对改进5.6%)和SQuAD v1.1 问题回答测试F1到93.2。
1 引言
语言模型预训练已证明可有效改进许多自然语言处理任务。这些任务包括句子级任务,如自然语言推理和释义,旨在通过整体分析句子来预测句子之间的关系,以及token级任务,如命名实体识别和SQuAD问答,其中模型需要在token级别产生细粒度输出。
将预训练语言表示应用于下游任务有两种现有策略:基于特征和微调。基于特征的方法使用任务特定的体系结构,其包括预先训练的表示作为附加特征。基于微调的方法引入了最小的任务特定参数,并通过简单地调整预训练参数来训练下游任务。 在以前的工作中,两种方法在预训练期间共享相同的目标函数,其中使用单向语言模型来学习一般语言表示。
我们认为当前的技术严重限制了预训练表示的力量,特别是对于微调方法。 主要限制是标准语言模型是单向的,这限制了在预训练期间可以使用的体系结构的选择。 例如,在OpenAI GPT中,作者使用左右架构,其中每个token只能处理Transformer的自我关注层中的先前token。 这些限制对于句子级别的任务来说是次优的,并且在应用基于调整的语言级别任务(例如SQuAD问答)时可能是毁灭性的,其中从两个方向合并上下文是至关重要的。
在本文中,我们通过提出BERT来改进基于微调的方法。BERT受到完形填空任务的启发提出“掩盖语言模型(MLM)”,该模型是通过一个新的预训练目标来解决前面提到的单向约束。被掩盖的语言模型从输入中随机地掩盖一些标记,并且客观主义者仅基于其上下文来预测被掩盖的单词的原始词汇。 与从左到右的语言模型预训练不同,MLM目标允许表示融合左右上下文,这允许我们预训练深度双向变换器。除了掩盖语言模型,我们还引入了一个“下一句预测”任务,它共同预先训练文本对表示。
本文主要贡献如下:
· 证明了双向预训练对语言表达的重要性。与使用单向语言模型进行预训练不同,BERT使用掩蔽语言模型来实现预训练的深度双向表示。
· 预先训练的表示消除了许多重型工程任务特定结构的需求。BERT是第一个基于调整的表示模型,它在大量句子级和token级任务上实现了最先进的性能,优于许多具有任务特定体系结构的系统。
· BERT刷新了11项NLP任务的性能记录。本文还报告了 BERT 的模型简化研究(ablation study),表明模型的双向性是一项重要的新成果。
2 文献回顾
语言表达的预训练经过很长一段历史,在本节我们简要回顾一下。(注: 本节为预备知识,想深入了解的同学可自行研究一下。)
2.1 基于特征的方法 Feature-basedApproaches
预训练的word embedding被认为是现代 NLP 系统中不可或缺的一部分,与从头学习的 embedding 相比提供了显着的改进。基于 word embedding 这些方法,已经推广出了 sentence embedding,paragraph embedding 等多种方法。与传统的word embedding一样,这些学习的表示通常也用作下游模型中的特征。 ELMo将传统的word embedding研究概括为不同的维度。 他们建议从语言模型中提取上下文敏感特征。当将上下文词嵌入与现有的任务特定体系结构集成时,ELMo推进了几个主要NLP基准测试的最新技术,包括SQUAD上的问题回答,情感分析和命名实体识别。
2.2 基于微调的方法 Fine-tuningApproaches
从语言模型(LMs)转移学习的最新趋势是在对用于监督下游任务的相同模型进行微调之前,在LM目标上预先训练一些模型架构。 这些方法的优点是需要从头开始学习参数。 至少部分由于这一优势,OpenAI GPT在GLUE基准测试的许多句子级别任务中获得了先前最先进的结果。
2.3 从监督数据转移学习 TransferLearningfromSupervisedData
虽然无监督预训练的优势在于可用数据几乎无限,但也有工作表明从具有大数据集的监督任务中有效转移,例如自然语言推断和机器翻译。 在NLP之外,计算机视觉研究也证明了从大型预训练模型转移学习的重要性,其中一个有效的方法是对在ImageNet上预训练的模型进行微调。
3 BERT
论文在本节介绍BERT及其详细实现。首先介绍BERT的模型架构和输入表示。 然后,我们将在3.3节中介绍预培训任务,即本文的核心创新。 预训练程序和微调程序分别在第3.4节和第3.5节中详述。 最后,第3.6节讨论了BERT和OpenAI GPT之间的差异。
3.1 模型架构 Model Architecture
BERT的模型架构是基于Vaswani等人描述的原始实现的多层双向变换器编码器,并发布于tensor2tensor库。由于Transformer的使用最近变得无处不在,论文中的实现与原始实现完全相同,因此这里将省略对模型结构的详细描述。
在这项工作中,我们将层数(即Transformer blocks)表示为L,将隐藏大小表示为H,将self-attention heads的数量表示为A. 在所有情况下,将feed-forward/filter 的大小设置为 4H,即H = 768时为3072,H = 1024时为4096。论文主要报告了两种模型大小的结果:
BERT_BASE: L=12, H=768, A=12, Total Parameters=110M
BERT_LARGE: L=24, H=1024, A=16, Total Parameters=340M
为了进行比较,选择与BERT_BASE具有相同的模型大小的OpenAI GPT。 然而,重要的是,BERT变换器使用双向self-attention,而GPT变换器使用受限制的self-attention,其中每个token只能处理其左侧的上下文。 我们注意到,在文献中,双向 Transformer通常被称为“Transformer encoder”,而左上下文仅被称为“Transformer encoder”,因为它可以用于文本生成。 BERT,OpenAI GPT和ELMo之间的比较如图1所示。
图1:训练前模型架构的差异。 BERT使用双向变换器。 OpenAI GPT使用从左到右的变换器。 ELMo使用经过独立训练的从左到右和从右到左LSTM的串联来生成下游任务的功能。 在三个中,只有BERT表示在所有层中共同依赖于左右上下文。
3.2 输入表示 Input Representation
我们的输入表示能够在一个标记序列中明确地表示单个文本句子或一对文本句子(例如,[Question, Answer])。对于给定token,其输入表示通过对相应的token、segment和position embeddings进行求和来构造。图2是输入表示的直观表示:
图2:BERT输入表示。 输入嵌入是token embeddings, segmentation embeddings 和position embeddings 的总和。
具体如下:
· 使用WordPiece嵌入(Wu et al., 2016)和30,000个token的词汇表。用##表示分词。
· 使用学习的positional embeddings,支持的序列长度最多为512个token。
· 每个序列的第一个token始终是特殊分类嵌入([CLS])。对应于该token的最终隐藏状态(即,Transformer的输出)被用作分类任务的聚合序列表示。对于非分类任务,将忽略此向量。
· 句子对被打包成一个序列。以两种方式区分句子。首先,用特殊标记([SEP])将它们分开。其次,添加一个learned sentence A嵌入到第一个句子的每个token中,一个sentence B嵌入到第二个句子的每个token中。
· 对于单个句子输入,只使用 sentence A嵌入。
3.3 预训练任务
与众不同的是,我们不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,我们使用两个新的无监督预测任务预训练BERT。
3.3.1 任务1:遮掩语言模型 Masked LM
从直觉上看,研究团队有理由相信,深度双向模型比left-to-right模型或left-to-right and right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“see itself”。
为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM),尽管在文献中它经常被称为Cloze任务(Taylor, 1953)。
在这个例子中,与masked token对应的最终隐藏向量被输入到词汇表上的输出softmax中,就像在标准LM中一样。在团队所有实验中,随机地屏蔽了每个序列中15%的WordPiece token。与去噪的自动编码器(Vincent et al., 2008)相反,只预测masked words而不是重建整个输入。
虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“my dog is hairy”中,它选择的token是“hairy”。然后,执行以下过程:
数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:
· 80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
· 10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
· 10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy.这样做的目的是将表示偏向于实际观察到的单词。
ransformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。
使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于 left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。
3.3.2 任务2:下一句预测 Next Sentence Prediction
许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系,这并没有通过语言建模直接获得。
在为了训练一个理解句子的模型关系,预先训练一个二进制化的下一句测任务,这一任务可以从任何单语语料库中生成。具体地说,当选择句子A和B作为预训练样本时,B有50%的可能是A的下一个句子,也有50%的可能是来自语料库的随机句子。例如:
Input = [CLS] the man went to [MASK] store [SEP]
he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP]
penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
团队完全随机地选择了NotNext语句,最终的预训练模型在此任务上实现了97%-98%的准确率。
3.4 预训练程序
预训练程序主要遵循现有的语言模型预训练文献。对于训练前语料库,我们使用BooksCorpus(800M单词)和英语维基百科(2,500M单词)的串联。对于维基百科,我们只提取文本段落并忽略列表,表格和标题。使用文档级语料库而不是诸如Billion Word Benchmark之类的句子级语料库以提取长的连续序列是至关重要的。
为了生成每个训练输入序列,我们从语料库中采样两个文本跨度,我们将其称为“句子”,即使它们通常比单个句子长得多(但也可以更短)。第一个句子接收A嵌入,第二个句子接收B嵌入。 50%的时间B是跟随A的实际下一个句子,50%的时间是随机句子,这是为“下一句话预测”任务完成的。对它们进行采样,使得组合长度≤512个token。在WordPiece标记化之后应用LM掩蔽,具有15%的统一掩蔽率,并且不特别考虑部分字块。
我们训练批量大小为256个序列(256个序列* 512个token= 128,000个token/批次),持续1,000,000个步骤,这比33亿个词语料库大约40个时期。我们使用Adam的学习率为1e-4,β1= 0.9,β2= 0.999,L2权重衰减为0.01,学习率在前10,000步的预热,以及线性衰减的学习率。在所有层上的Weuseadropout概率为0.1。在OpenAI GPT之后,我们使用gelu激活(Hendrycks和Gimpel,2016)而不是标准relu。
训练损失是平均掩盖的LM可能性和下一次遗传预测可能性的总和。在Pod配置中的4个云TPU上进行BERTBASE训练(总共16个TPU芯片).5在16个CloudTPU(64TPUchipstotal)上进行BERTLARGE训练。每次预训需要4天才能完成。
3.5 微调程序
对于序列级分类任务,BERT微调很简单。为了获得输入序列的固定维度合并表示,对输入中的第一个标记进行最终隐藏状态(即变换器的输出),其结构对应于特殊的[CLS]字嵌入。我们将该向量表示为C∈RH。在微调期间添加的唯一新参数是分类层W∈RK×H,其中K是分类器标签的数量。标准概率P∈RK用标准softmax,P = softmax(CWT)计算。BERT和W的所有参数都经过联合调整,以最大化正确标签的对数概率。对于跨度级和token级预测任务,必须以任务特定方式稍微修改上述过程。详情见第4节的相应小节。
对于微调,大多数模型超参数与预训练相同,但批量大小,学习率和训练时期数除外。辍学概率始终保持在0.1。最佳超参数值是任务特定的,但我们发现以下范围的可能值可以在所有任务中很好地工作:
批量大小:16,32
学习率:5e-5,3e-5,2e-5
时期数量:3,4
我们还观察到,大数据集(例如,100k +标记的训练示例)对于较高参数的热带数据集的敏感性要小得多。微调通常非常快,因此简单地对上述参数进行详尽搜索并选择在开发集上表现最佳的模型是合理的。
3.6 BERT和OpenAI GPT的比较
BERT最具可比性的预训练方法是OpenAI GPT,它在一个大型文本语料库中训练一个左转的Transformer LM。实际上,BERT中的许多设计决策都被有意地选择为尽可能接近GPT,以便可以最小化地比较这两种方法。 这项工作的核心论点是3.3节中提出的两个新的预训练任务占了大多数经验改进,但我们注意到BERT和GPT如何训练之间还存在其他一些差异:
GPT接受了BooksCorpus(800M字)的培训; BERT受过BooksCorpus(800M字)和维基百科(2,500M字)的培训。
GPT使用句子分隔符([SEP])和分类符号([CLS]),它们仅在微调时引入; BERT在预训练期间学习[SEP],[CLS]和句子A / B嵌入。
GPT接受了1M步骤的培训,批量为32,000字; BERT接受了1Mstepswithabatchsizeof128,000字的培训。
GPT对所有的调整实验使用相同的5e-5学习率; BERT选择任务特定的微调学习速率,该速率在开发集上表现最佳。
为了解决这些差异的影响,我们在第5.1节中进行了消融实验,证明了这些改进的大部分来自新的预训练任务。
· 结论
BERT是一个语言表征模型(language representation model),通过超大数据、巨大模型、和极大的计算开销训练而成,在11个自然语言处理的任务中取得了最优(state-of-the-art, SOTA)结果。或许你已经猜到了此模型出自何方,没错,它产自谷歌。估计不少人会调侃这种规模的实验已经基本让一般的实验室和研究员望尘莫及了,但它确实给我们提供了很多宝贵的经验:
· 深度学习就是表征学习(Deep learning is representation learning)”We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures”. 在11项BERT刷出新境界的任务中,大多只在预训练表征(pre-trained representation)微调(fine-tuning)的基础上加一个线性层作为输出(linear output layer)。在序列标注的任务里(e.g. NER),甚至连序列输出的依赖关系都先不管(i.e. non-autoregressive and no CRF),照样秒杀之前的SOTA,可见其表征学习能力之强大。
· 训练规模很重要(Scale matters)”One of our core claims is that the deep bidirectionality of BERT, which is enabled by masked LM pre-training, is the single most important improvement of BERT compared to previous work”. 这种遮掩(mask)在语言模型上的应用对很多人来说已经不新鲜了,但确是BERT的作者在如此超大规模的数据+模型+算力的基础上验证了其强大的表征学习能力。这样的模型,甚至可以延伸到很多其他的模型,可能之前都被不同的实验室提出和试验过,只是由于规模的局限没能充分挖掘这些模型的潜力,而遗憾地让它们被淹没在了滚滚的paper洪流之中。
· 预训练价值很大(Pre-training is important)”We believe that this is the first work to demonstrate that scaling to extreme model sizes also leads to large improvements on very small-scale tasks, provided that the model has been sufficiently pre-trained”. 预训练已经被广泛应用在各个领域了(例如:ImageNet for CV, Word2Vec in NLP),多是通过大模型大数据,这样的大模型给小规模任务能带来的提升有几何,作者也给出了自己的答案。BERT模型的预训练是用Transformer做的,但我想换做LSTM或者GRU的话应该不会有太大性能上的差别,当然训练计算时的并行能力就另当别论了。
06 Aug 2018
文本纠错作为重新封装的文本分析平台核心功能,一直受到公司各层的广泛关注。说到文本纠错最简单的莫过于英文单词纠错,也是我们word中常见的检查功能。纠错概率计量方法可参考NLP单词纠错和中文自动纠错讲解,这里不再赘述。
语料下载地址:big.txt
Python英文单词纠错程序如下:
import re
from collections import Counter
#==== 训练一个带有概率的词库 ====
def words(text):
return re.findall(r'\w+', text.lower())
WORDS = Counter(words(open('d:\\big.txt').read()))
def P(word, N=sum(WORDS.values())):
"Probability of `word`."
return WORDS[word] / N
#==== 给定单词A,枚举所有可能正确的拼写 ====
def edits1(word):
"All edits that are one edit away from `word`."
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [L + R[1:] for L, R in splits if R]
transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
replaces = [L + c + R[1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set(deletes + transposes + replaces + inserts)
def edits2(word):
"All edits that are two edits away from `word`."
return (e2 for e1 in edits1(word) for e2 in edits1(e1))
#==== 返回候选词 ====
def candidates(word):
"Generate possible spelling corrections for word."
return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])
def known(words):
"The subset of `words` that appear in the dictionary of WORDS."
return set(w for w in words if w in WORDS)
#==== 输出概率最大的纠正词 ====
def correction(word):
"Most probable spelling correction for word."
return max(candidates(word), key=P)
程序结果如下:
correction('corrected')
# 'connected'
correction('speling')
# 'seeing'
27 Apr 2018
文本聚类/分类算法在自然语言处理中是非常基础但又重要的,其实聚类和分类最大的区别就是需不需要训练样本,因此我们也可以把聚类想象成是一种无监督的分类问题。文本聚类算法相较于结构化数据聚类算法最大的差异就是需要从文本数据中提取关键词,然后将关键词向量化后形成可计算相似度的文本向量矩阵。
语料下载地址:任选部分语料放在D盘yuliao文件夹(新建文件夹)中
Python文本聚类(K-means)程序如下:
import re
import os
import string
import jieba
import logging
import sys
import codecs
import traceback
import pandas as pd
import numpy as np
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
from collections import Counter
from sklearn import metrics
# ======== 数据编码格式转化 ========
def get_text():
base_path = "D:\\yuliao\\"
filelist = os.listdir(base_path) #功能相当于在base_path目录下执行dir命令,返回为list类型
data_dict = {}
f2 = open('D:\\data.txt', 'w',encoding='utf-8')
for files in filelist:
f = open(base_path + files, 'r',encoding='utf-8')
text = f.read().replace('\n', '')
#data_temp = text # 转换为unicode编码形式
data = ''.join(re.findall(u'[\u4e00-\u9fff]+', text)) # 必须为unicode类型,取出所有中文字符
f2.write(data + '\n')
f2.close()
class TextCluster(object):
# 初始化函数,重写父类函数
def __init__(self):
pass
def seg_words(self, sentence):
seg_list = jieba.cut(sentence) # 默认是精确模式
return " ".join(seg_list) # 分词,然后将结果列表形式转换为字符串
# 加载用户词典
def load_userdictfile(self, dict_file):
jieba.load_userdict(dict_file)
def load_processfile(self, process_file):
corpus_list = []
try:
fp = open(process_file, "r",encoding='utf-8')
for line in fp:
conline = line.strip()
corpus_list.append(conline)
return True, corpus_list
except:
logging.error(traceback.format_exc())
return False, "get process file fail"
def output_file(self, out_file, item):
try:
fw = open(out_file, "a")
fw.write('%s' % (item),encoding='utf-8')
fw.close()
except:
logging.error(traceback.format_exc())
return False, "out file fail"
# 释放内存资源
def __del__(self):
pass
def process(self, process_file, tf_ResFileName, tfidf_ResFileName, num_clusters, cluster_ResFileName):
try:
sen_seg_list = []
flag, lines = self.load_processfile(process_file)
if flag == False:
logging.error("load error")
return False, "load error"
for line in lines:
sen_seg_list.append(self.seg_words(line))
# 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
tf_vectorizer = CountVectorizer()
# fit_transform是将文本转为词频矩阵
tf_matrix = tf_vectorizer.fit_transform(sen_seg_list)
tf_weight = tf_matrix.toarray()
# print tf_weight
# 该类会统计每个词语的tf-idf权值
tfidf_transformer = TfidfTransformer()
# fit_transform是计算tf-idf
tfidf_matrix = tfidf_transformer.fit_transform(tf_matrix)
# 获取词袋模型中的所有词语
word_list = tf_vectorizer.get_feature_names()
# 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
tfidf_weight = tfidf_matrix.toarray()
# 打印特征向量文本内容
# print 'Features length: ' + str(len(word_list))
tf_Res = codecs.open(tf_ResFileName, 'w', 'utf-8')
word_list_len = len(word_list)
for num in range(word_list_len):
if num == word_list_len - 1:
tf_Res.write(word_list[num])
else:
tf_Res.write(word_list[num] + '\t')
tf_Res.write('\r\n')
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(tf_weight)):
# print u"-------这里输出第", i, u"类文本的词语tf-idf权重------"
for j in range(word_list_len):
if j == word_list_len - 1:
tf_Res.write(str(tf_weight[i][j]))
else:
tf_Res.write(str(tf_weight[i][j]) + '\t')
tf_Res.write('\r\n')
tf_Res.close()
# 输出tfidf矩阵
tfidf_Res = codecs.open(tfidf_ResFileName, 'w', 'utf-8')
for num in range(word_list_len):
if num == word_list_len - 1:
tfidf_Res.write(word_list[num])
else:
tfidf_Res.write(word_list[num] + '\t')
tfidf_Res.write('\r\n')
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(tfidf_weight)):
for j in range(len(word_list)):
if j == word_list_len - 1:
tfidf_Res.write(str(tfidf_weight[i][j]))
else:
tfidf_Res.write(str(tfidf_weight[i][j]) + '\t')
tfidf_Res.write('\r\n')
tfidf_Res.close()
# ======== 聚类分析 =========
km = KMeans(n_clusters=num_clusters)
km.fit(tfidf_matrix)
print ("===== 总体轮廓系数 =====")
print (metrics.silhouette_score(tfidf_matrix, km.labels_, metric='euclidean')) #轮廓系数[-1,1]
kas=metrics.silhouette_samples(tfidf_matrix, km.labels_, metric='euclidean') #生成每个文件轮廓系数
print ("===== 每类样本个数 =====")
print (Counter(km.labels_)) # 每类分到多少样本
# 中心点
# print(km.cluster_centers_)
# 每个样本所属的簇
clusterRes = codecs.open(cluster_ResFileName, 'w', 'utf-8')
# 将数据写入文件
count = 1
a=os.listdir("D:\\yuliao\\")
kas1=kas.tolist()
while count <= len(km.labels_):
clusterRes.write(str(count) +'\t'+a[count-1]+'\t'+str(km.labels_[count - 1])+'\t'+str(kas1[count-1]))
clusterRes.write('\r\n')
count = count + 1
clusterRes.close()
except:
logging.error(traceback.format_exc())
return False, "process fail"
# 输出聚类结果
if __name__ == "__main__":
rootdir = "D:\\"
get_text()
tc = TextCluster()
tc.process(rootdir+"data.txt", rootdir+"tf_Result.txt", rootdir+"tfidf_Result.txt",3, rootdir+"cluster_Result.txt")
# data.txt记录所有数据集,一行是一个文本
# tf_Result.txt记录关键词及对应文本出现频数
# tfidf_Result.txt记录关键词及对应文本重要性
# cluster_Result.txt记录聚类结果文件名+对应类别
程序结果如下:
轮廓系数评估指标可查看:机器学习之聚类评估指标(轮廓系数)
21 Apr 2018
关于摘要抽取共有两种研究方向:抽取式摘要和生成式摘要,现阶段市面上接触到的大多是抽取式摘要,而生成式摘要还属于实验室阶段。因此这里只介绍抽取式摘要的一种算法TextRank,我们之前了解过TextRank基于投票机制可以提取关键词,而这里我们可以想象利用投票机制提取关键句子从而形成摘要。
语料下载地址:textrank_test.txt
Python抽取式摘要(TextRank)程序如下:
from textrank4zh import TextRank4Sentence
text = open("d:\\textrank_test.txt","r",encoding="utf-8").read()
sentence = TextRank4Sentence()
sentence.analyze(text,lower = True)
s_list = sentence.get_key_sentences(num = 3,sentence_min_len = 5)
print('====== 抽取式摘要 ======')
for s in s_list:
print(s.sentence,s.weight)
21 Apr 2018
最近受邀去帮广发银行的高层培训NLP相关知识,既定的任务是教会他们如何用Python实现自然语言处理。想着既然要备课,就顺带着将NLP相关的知识梳理一下,放到博客中。
自然语言处理说简单些就是程序员将自然语言(英语、汉语等)编译为程序语言(Python、Java等)最后让机器解析成汇编语言的过程。那么就自然语言本身来看,其中就包括单个词、短语、句子、段落和篇章,不同的切词、提词的方法都会影响到后续句子级以上的处理,而不同句子、段落、篇章的算法也会各有优势和劣势,这里分别列举一些常用算法以帮助期望快速了解NLP的朋友。
关键词提取这里主要列举两种常用的计算方法TF-IDF和TextRank,TF-IDF表示在本文档中经常出现,且在其他文档中很少出现的词,TextRank则是基于图排序的算法(根据投票原理,让每个单词给它相邻的词投赞成票,票的权重取决于词自身的票数)。
Python关键词提取(TF-IDF)程序如下:
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
corpus=["鲜花 多少钱",#第一类文本切词后的结果,词之间以空格隔开
"白百合 多少钱",#第二类文本的切词结果
"水仙花 多少钱",#第三类文本的切词结果
"水果 多少钱"]#第四类文本的切词结果
vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值
tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
word=vectorizer.get_feature_names()#获取词袋模型中的所有词语
weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
print ("-------这里输出第",i,u"类文本的词语tf-idf权重------")
for j in range(len(word)):
print (word[j],weight[i][j])
Python关键词提取(TF-IDF)结果如下:
从结果中可以看出,程序没有问题,但深究文本会发现,我希望提取的关键词是“多少钱”而并非商品名称,因此面对这类文本时TF-IDF算法失效,这时我们可以采用TextRank提取关键词。
from textrank4zh import TextRank4Keyword
text = "鲜花 多少钱 白百合 多少钱 水仙花 多少钱 水果 多少钱"
word = TextRank4Keyword()
word.analyze(text,window = 2,lower = True)
w_list = word.get_keywords(num = 20,word_min_len = 1)
print ('关键词:')
for w in w_list:
print(w.word,w.weight)
Python关键词提取(TextRank)结果如下:
14 Mar 2018
最近有位同学提出了这样一个业务需求:期望能够通过检索参与人员名称、会议讨论内容等能够从大量语料中找出相关的会议议题。本文提供一种检索文本内容的方式,程序设计思路如下:
(1)读取文件夹下所有文本信息;
(2)将文件名(会议议题)和文件内容(会议内容)按照字典格式存储;
(3)利用正则表达式检索文件内容(会议内容);
(4)若匹配成功,则输出文件名(会议议题);
数据配置要求:在D盘下创建test文件夹,将全部会议数据.txt放在test文件夹下
Python程序设计如下:
# ==== 读取原始语料txt文件 ====
import os
rootdir='d:\\test\\'
txt_list = [] # 定义一个列表用于存储所有文件内容
for root, dirs, files in os.walk(rootdir): # 遍历指定目录
for filename in files: # 遍历目录下所有文件
fullname = root + filename # 拼接完整的文件名,parent是父目录
one_file = open(fullname,'r', encoding='utf-8').read()
# 存储K-value 文件名:文件内容
one_txt = dict()
one_txt[filename] = one_file
txt_list.append(one_txt)
# ==== 正则表达式遍历检索 ====
import re
pattern = re.compile("黄立鹏") #填写需要查找的人名或会议内容
result_content=''
for txt in txt_list: # 遍历txt文件
for txt_key in txt.keys(): # txt_key标题,txt[txt_key]内容
match = pattern.search(txt[txt_key])
if match:
result_content += os.path.join('会议议题:'+txt_key+'\n')
print(result_content)
31 Jan 2018
知识图谱简单来说就是具有语义理解与信息互联互通能力的知识库。它作为人工智能技术的重要组成部分,主要应用在搜索引擎、话术追踪、人机交流等多个领域。本文提供一种构建知识图谱的概念,其本质上来说还算不上真正的知识图谱,构建方式如下:
(1)从样例文本或FAQ中提取不同的对话场景;
(2)将不同的对话场景编译为正则表达式的形式;
(3)人工对每个正则表达式配上相应的业务知识点;
(4)根据正则表达式回扫所有文本并打上对应的业务知识点标签;
具体操作步骤如下:
(1)将已构建好的正则及知识点整合文档reg.excel放在D盘下;
(2)在D盘下创建test文件夹,将原始语料*.txt放入文件夹中;
Python程序设计如下:
import xlrd # Excel读取包
import os # 路径包
import re # 正则包
# ==== 读取reg.excel文件 ====
datadir='d:\\reg.xlsx'
data = xlrd.open_workbook(datadir)
table = data.sheets()[0] # 0表示读取第1张表
nrows = table.nrows # 获取行数
reg_list = []
for i in range(1,nrows): # 第一行为表头,range从第二行到第nrows行
row = table.row_values(i) # 按行读取数据,row[0]第一列 row[1]第二列
if row: # 存储k-value值,row[0]正则为key,row[1]标签为value
one_reg = dict() # 创建一个字典对象
one_reg[row[0]] = row[1]
reg_list.append(one_reg)
# ==== 读取原始语料txt文件 ====
rootdir='d:\\test\\'
txt_list = [] # 定义一个列表用于存储所有文件内容
for root, dirs, files in os.walk(rootdir): # 遍历指定目录
for filename in files: # 遍历目录下所有文件
fullname = root + filename # 拼接完整的文件名,parent是父目录
one_file = open(fullname,'r', encoding='utf-8').read()
# 存储K-value 文件名:文件内容
one_txt = dict()
one_txt[fullname] = one_file
txt_list.append(one_txt)
# ==== 依据正则对文本进行打标 ====
result_content = ''
for reg in reg_list: # 遍历Excel文件
for reg_key in reg.keys(): # value值:reg[reg_key]
pattern = re.compile(reg_key)
for txt in txt_list: # 遍历txt文件
for txt_key in txt.keys():
match = pattern.search(txt[txt_key])
if match: # 如果Match不为空
turn = match.group(0) # group(0)返回整理,返回对应文本内容
# 输出"文件名\知识点\正则表达式"
result_content += os.path.join(txt_key + '|'+ reg[reg_key] + '|'+ reg_key + '|' + turn + '\n')
print((result_content),file=open('d:\\test01.txt','w',encoding='utf-8')) # 将结果打印到txt中
27 Jan 2018
最后再看一下文本剔除,该业务需求是我们手上有一份文件名单,希望从数据集中将对应名单的文本提取出来,换句话说就是将数据集中不匹配的文本剔除。具体步骤如下:将文件名单name.txt放在D盘下,并在D盘新建一个文件夹test,将原始语料a1.txt,a2.txt,a3.txt,a4.txt放入test文件夹中
Python文本剔除程序如下:
import os
rootdir = "d:\\test\\"
_files = []
for l in open("d:\\name.txt","r",encoding="utf-8").readlines():
_files.append(l.strip())
for root ,dirs, files in os.walk(rootdir):
for _file in files:
filepath = root + _file
if _file not in _files:
os.remove(filepath)
24 Jan 2018
在我们日常技术交流过程中,往往需要对原始数据进行脱敏处理,例如公司名称、个人身份证号等敏感信息。由此本文介绍2种字符串替换的方法,帮助大家更好的解决数据脱敏的相关问题。具体步骤如下:在D盘新建文件夹test,并在test文件夹中放入原始语料a1.txt,a2.txt,a3.txt
Python文本数据脱敏程序如下:
# 字符串替换 replace()
infile = open("d:\\test\\a1.txt","r",encoding="utf-8").read()
new_infile = infile.replace("坐席","AAA") # replace函数替换
# 新建同名的空白文档覆盖原始文档
outfile = open("d:\\test\\a1.txt","w",encoding="utf-8")
# 将替换后的数据写入空白文档,注意str()
outfile.write(str(new_infile))
outfile.close()
# 正则表达式替换 import re
import re
infile = open("d:\\test\\a1.txt","r",encoding="utf-8").read()
words = re.compile("坐席") # 关键词定位
new_infile = words.sub("AAA",infile) # 关键词替换
outfile = open("d:\\test\\a2.txt","w",encoding="utf-8")
outfile.write(str(new_infile))
outfile.close()
# 注意:正则表达式适用于复杂的业务替换场景,一般利用replace函数就能达到数据脱敏的需求
# 批量字符串替换 replace(),后续可自行尝试批量正则替换
import os
rootdir = "d:\\test\\"
for root, dirs, files in os.walk(rootdir):
for i in files:
i = root + i
infile = open(i,"r",encoding="utf-8").read()
new_infile = infile.replace("座席","AAA").replace("客户","BBB") # 同时替换“坐席”与“客户”
outfile = open(i,"w",encoding="utf-8")
outfile.write(str(new_infile))
outfile.close()
21 Jan 2018
接下来,我们学习如何对文本进行拆分,即存在一个大数据集文本,我们如何将其切分成单个小的数据集。文本拆分适用于在自然语言处理过程中,需要对每通文本进行遍历打标的情况。具体步骤如下:将原始文本merge.txt放在D盘下,并在D盘中新建空白文件夹test
文本拆分的难点具体包括如下几个部分:
(1)原始文本如何按既定规则进行切片;
(2)切片后每个新文件的文件名如何写入;
(3)如何保证每个新文件中文本的完整性;
注:建议本节与Python文本预处理(文本合并)一同学习
Python文本拆分程序如下:
import re
import os
rootdir = 'd:\\test\\'
# 难点:对数据进行切片
p=re.compile('\/data\/voice\/',re.S) # 输入正则表达式切片的规则
fileContent=open('d:\\merge.txt','r',encoding='utf-8').read() # 读文件内容
paraList=p.split(fileContent) # 根据正则对文本进行切片
for i in range(len(paraList)): # 遍历切片后的文本列表
fileWriter=open(rootdir+str(i)+'.txt','w',encoding='utf-8')
fileWriter.write(paraList[i]) # 将文本写入
fileWriter.close()
for root, dirs, files in os.walk(rootdir):
for l in files:
l = root + l
line = open(l, 'r+', encoding='utf-8').readlines() # 文件按行读取
# 难点:剔除每个文件第一行数据
infile = ''.join(line[1:]) # 从每个文件第二行开始读取
outfile = open(str(l),'w',encoding='utf-8').write(infile)
# 难点:修改文件名
modname = ''.join(line[:1]) # 读取每个文件第一行
newurl = root + modname.strip() # strip移除字符串首尾字符(/n)
if newurl == root:
os.remove(l) # 删除多余文件
elif newurl != root:
os.rename(l,newurl) # 修改文件名
18 Jan 2018
在自然语言处理过程中,我们经常会遇到大量的文本文件,往往我们需要对这些文本进行预处理后才能使用,因此这里教大家针对文本文件的三种常见场景及预处理方法(文本合并、文本拆分和文本剔除)。
第一种方法是文件合并,即存在多个文本文件,如何将这些文件合成一个,便于后续知识标注人员对文本进行批量检测等。具体步骤如下:在D盘新建两个空白文件夹test和test01,并在test文件夹中放入原始语料a1.txt,a2.txt,a3.txt
Python文本合并程序如下:
# 文件合并(方法1)
#输入每个文件的绝对路径
list = ["D:\\test\\a1.txt","D:\\test\\a2.txt","D:\\test\\a3.txt"]
# 新建一个空白的txt文件,作为读入框
ofile = open("D:\\test01\\merge.txt","w")
for i in list:
ofile.write( i + "\n") # 每个文本开头输入文件名
for txt in open(i,"r",encoding="utf-8"):
ofile.write(txt) # 将文本合并到新的空白文件中
ofile.close()
# 由于方法1需要输入每个文件的绝对路径,我们需要更智能的方法,
# 遍历某个文件夹中所有的文本,然后进行合并
# 文件合并(方法2)
import os
rootdir = 'D:\\test' #输入文件的路径
list = os.listdir(rootdir) #遍历test文件夹所有文件
ofile = open("D:\\test01\\d.txt","w")
for i in list:
ofile.write( i + "\n")
i = rootdir+ os.path.sep + i #目录名+ 路径切割符+ 文件名
for txt in open(i,"r",encoding = "utf-8"):
ofile.write(txt)
ofile.close()
# 利用os包的时候,比较高级的方法是用os.walk
# 文件合并(方法3)
import os
rootdir = 'D:\\test'
ofile = open("D:\\test01\\e.txt","w")
#root表示文件夹路径,dirs次级目录路径,files文件名
for root, dirs, files in os.walk(rootdir):
for i in files:
ofile.write(i + "\n")
i = root + os.path.sep + i
for txt in open(i,"r",encoding = "utf-8"):
ofile.write(txt)
ofile.close()
19 Aug 2017
自然语言处理(NLP)很基础的一块便是构建文本分类器,其应用领域也比较广泛,例如新闻题材、垃圾邮件的自动分类等。现阶段构建文本分类器的算法大致包括:朴素贝叶斯、SVM支持向量机、最大熵分类器和BP神经网络等。本文选取SVM算法对某银行客服录音数据进行分类,分类方法及程序设计如下:
注:在构建文本分类器之前,请先确定配备以下环境
Python 3.5及以上版本
jieba分词包
详情请见: python之结巴中文分词
· 数据预处理方法论
1.导入原始语料(存储格式:TXT,utf-8)
原始语料下载地址
2.样本整理
3.导入停用词库和自定义词库
停用词库和自定义词库下载地址
4.文本分词:
- 删除第1行和最后2行语句(规范话术)
- 去除停用词
- 添加自定义词典
- 结巴分词(精确模式)
清洗目的:
1)避免无意义词汇的出现,干扰后续TF-IDF词频提取的准确度
2)降低SVM支持向量机分类计算时的空间复杂度
· 数据预处理程序设计
import jieba
import jieba.analyse
#添加自定义词典
jieba.load_userdict('e:\\lexicon\\CBwords.txt')
# 创建停用词列表函数
def creadstoplist(stopwordspath):
stwlist = [line.strip() for line in open(stopwordspath, 'r', encoding='utf-8').readlines()]
return stwlist
# 对句子进行分词
def seg_sentence(sentence):
wordList = jieba.cut(sentence.strip())
stwlist = creadstoplist('e:\\lexicon\\CBstopwords.txt') #加载停用词路径
outstr = ''
for word in wordList:
if word not in stwlist:
if word != '\t':
outstr += word
outstr += " "
return outstr
#删除第1行和最后3行语句
infile = open('e:\\SVM预处理输入\\in1.txt', 'r', encoding='utf-8')
line_new = infile.readlines() #注意readline 和readlines
infile_new = ''.join(line_new[1:-3])
outfile_new = open("e:\\new.txt","w",encoding='utf-8')
outfile_new.write(infile_new)
infile.close()
outfile_new.close()
#结果输出到txt文件夹中
infile_new1 = open("e:\\new.txt","r",encoding='utf-8')
outfile = open('e:\\SVM预处理输出\\outfile1.txt', 'w', encoding='utf-8')
for line in infile_new1:
line_seg = seg_sentence(line)
outfile.write(line_seg+'\n')
infile_new1.close()
outfile.close()
import jieba
import jieba.analyse
#添加自定义词典
jieba.load_userdict('e:\\lexicon\\CBwords.txt')
# 创建停用词列表函数
def creadstoplist(stopwordspath):
stwlist = [line.strip() for line in open(stopwordspath, 'r', encoding='utf-8').readlines()]
return stwlist
# 对句子进行分词
def seg_sentence(sentence):
wordList = jieba.cut(sentence.strip())
stwlist = creadstoplist('e:\\lexicon\\CBstopwords.txt') #加载停用词路径
outstr = ''
for word in wordList:
if word not in stwlist:
if word != '\t':
outstr += word
outstr += " "
return outstr
#删除第1行和最后3行语句
infile = open('e:\\SVM预处理输入\\in1.txt', 'r', encoding='utf-8')
line_new = infile.readlines() #注意readline 和readlines
infile_new = ''.join(line_new[1:-3])
outfile_new = open("e:\\new.txt","w",encoding='utf-8')
outfile_new.write(infile_new)
infile.close()
outfile_new.close()
#结果输出到txt文件夹中
infile_new1 = open("e:\\new.txt","r",encoding='utf-8')
outfile = open('e:\\SVM预处理输出\\outfile1.txt', 'w', encoding='utf-8')
for line in infile_new1:
line_seg = seg_sentence(line)
outfile.write(line_seg+'\n')
infile_new1.close()
outfile.close()
· SVM自动分类器方法论
1.导入数据集(存储格式:CSV)
预处理后数据集下载地址
Num表示id号(随意编排)
Content表示数据预处理后文本内容
Lable表示文本内容所对应的分类标签
2.划分为训练集和测试集A
3.转化为词频向量化矩阵,并计算TF-IDF值
4.训练SVM文本分类器
5.测试分类结果
6.计算精确度
7.稳健性检验
检验目的:提高文本分类器可信度
检验方法分别为以下两种:
1)训练集不变,将测试集A替换成测试集B,由此预测测试集B的分类结果
2)训练集与测试集A进行同类别相互替换,由此重新训练并预测分类器结果
8.整理预测结果
label 人工分类标签
predict 分类器预测标签
· SVM自动分类器程序设计
import csv
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn import metrics
from sklearn.grid_search import GridSearchCV
# 1.读取训练集
def readtrain():
with open('e:\\test1.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
column1 = [row for row in reader]
content_train = [i[1] for i in column1[1:]] #第一列为文本内容,并去除列名
opinion_train = [i[2] for i in column1[1:]] #第二列为分类标签,并去除列名
print ('数据集共有 %s 条句子' % len(content_train))
train = [content_train, opinion_train]
return train
def changeListCode(b):
a = []
for i in b:
a.append(i.decode('utf8'))
return a
train = readtrain() #读取readtrain数据集
content = train[0] #第一行文本内容赋给content
opinion = train[1] #第二行分类标签赋给opinion
# 2.划分训练集与测试集
train_content = content[:85] #训练集文本内容
test_content = content[85:] #测试集文本内容
train_opinion = opinion[:85] #训练集分类标签
test_opinion = opinion[85:] #测试集分类标签(用于计算精确度)
# 3.文本向量化
vectorizer = CountVectorizer() #将向量化函数赋给vectorizer
tfidftransformer = TfidfTransformer()
tfidf = tfidftransformer.fit_transform(vectorizer.fit_transform(train_content)) # 先转换成词频矩阵,再计算TFIDF值
print (tfidf.shape)
# 4.训练文本分类器
text_clf = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', SVC(C=0.99, kernel = 'linear'))])
text_clf = text_clf.fit(train_content, train_opinion)
# 5.预测文本分类结果
predicted = text_clf.predict(test_content)
print ("打印预测结果:")
print (predicted) #打印预测分类结果
# 6.计算精确度
print ("============================================")
print ("计算预测结果精确度")
print ('SVC',np.mean(predicted == test_opinion))
· SVM自动分类器预测结果
打印预测结果:
['手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额'
'手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额'
'手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-设备绑定与解绑' '手机银行-转账汇款-无法转账'
'手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户'
'手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户'
'手机银行-账户管理-关联账户' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账'
'手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-无法转账' '手机银行-转账汇款-款项未到账'
'手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-无法转账'
'手机银行-转账汇款-无法转账' '手机银行-转账汇款-无法转账' '手机银行-转账汇款-无法转账' '手机银行-转账汇款-无法转账'
'手机银行-转账汇款-款项被退回' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项被退回' '手机银行-转账汇款-款项被退回']
============================================
计算预测结果精确度
SVC 0.9
09 Aug 2017
1.引言
最近看到许多同学对自然语言处理(NLP)都非常感兴趣,但对于NLP中一些基本的统计模型并不够了解。遂写下该博文,帮助大家掌握NLP中文分词这一大板块比较核心的统计模型——HMM隐马尔可夫模型。
HMM模型的全称是Hidden Markov Model,看关键词就知道该模型中存在隐含层,它是用来描述一个含有隐含未知参数的马尔可夫过程,其目的是希望通过求解这些隐含的参数来进行实体识别,说简单些也就是起到词语粘合的作用。
举一个经典的实例:一个北京的朋友每天根据天气【下雨,天晴】决定当天的活动【公园散步,购物,清理房间】中的一种,我每天只能在朋友圈上看到她发的消息 “我前天公园散步,昨天购物,今天清理房间了!”,那么我如何根据她发的消息推断北京这三天的天气?
2.隐马尔可夫模型概述
任何一个HMM模型都包括如下五方面:
Obs 显现层
States 隐含层
Start_p 初始概率
Trans_p 转移概率
Emit_p 发射概率
图:HMM隐马尔可夫模型变迁图
3.样例计算
命题:“我前天公园散步,昨天购物,今天清理房间了!”
HMM模型的计算公式:
# 隐含层
states = ('Rainy', 'Sunny')
# 显现层
observations = ('walk', 'shop', 'clean')
# 初始概率
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
# 转移概率
transition_probability = {
'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny': {'Rainy': 0.4, 'Sunny': 0.6},
}
# 发射概率
emission_probability = {
'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
【第一天】【散步】= [初始概率,下雨] * [发射概率,散步] = 0.6*0.1 = 0.06
【第一天】【散步】= [初始概率,晴天] * [发射概率,散步] = 0.4*0.6 = 0.24
因为0.24>0.06,所以第一天可能是 晴天
【第二天】【购物】= [初始概率,晴天] * [转移概率,M=>下雨] * [发射概率,购物] = 0.24*0.4*0.4= 0.0384
【第二天】【购物】= [初始概率,晴天] * [转移概率,M=>晴天] * [发射概率,购物] = 0.24*0.6*0.3= 0.0432
【第二天】【购物】= [初始概率,下雨] * [转移概率,M=>下雨] * [发射概率,购物] = 0.06*0.7*0.4= 0.0168
【第二天】【购物】= [初始概率,下雨] * [转移概率,M=>晴天] * [发射概率,购物] = 0.06*0.3*0.3= 0.0054
需要注意的是,这里0.0432是累积概率 ,所以全局最优解: 第一天 晴天;第二天 晴天(不能够理解这句话的同学请继续看第三天)
【第三天】【清理】= [初始概率,晴天,下雨] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0384*0.7*0.5= 0.01344
【第三天】【清理】= [初始概率,晴天,下雨] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0384*0.3*0.1= 0.00115
【第三天】【清理】= [初始概率,晴天,晴天] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0432*0.4*0.5= 0.00864
【第三天】【清理】= [初始概率,晴天,晴天] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0432*0.6*0.1= 0.00259
【第三天】【清理】= [初始概率,下雨,下雨] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0168*0.7*0.5= 0.00588
【第三天】【清理】= [初始概率,下雨,下雨] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0168*0.3*0.1= 0.00050
【第三天】【清理】= [初始概率,下雨,晴天] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0054*0.4*0.5= 0.00108
【第三天】【清理】= [初始概率,下雨,晴天] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0054*0.6*0.1= 0.00032
从这里就能看出,累积概率最大值为0.01344,所以全局最优解:第一天晴天;第二天 下雨;第三天 下雨
注:若认为第二天应该是晴天的同学,请区分全局最优解和局部最优解
Python程序实现
# Python -version 3.5以上版本
# 打印路径概率表
def print_dptable(V):
print (" ",)
for i in range(len(V)):
print ("%7d" % i,)
print ()
for y in V[0].keys():
print ("%.5s: " % y,)
for t in range(len(V)):
print ("%.7s" % ("%f" % V[t][y]),)
print ()
def viterbi(obs, states, start_p, trans_p, emit_p):
# 路径概率表 V[时间][隐含层] = 概率
V = [{}]
# 中间变量
path = {}
# 状态初始化 (t == 0)
for y in states:
V[0][y] = start_p[y] * emit_p[y][obs[0]]
path[y] = [y]
# 对 t > 0 跑一遍维特比算法
for t in range(1, len(obs)):
V.append({})
newpath = {}
for y in states:
# 概率 隐含层 = 前状态是y0的初始概率 * y0转移到y的转移概率 * y表现为当前状态的发射概率
(prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])
# 记录最大概率
V[t][y] = prob
# 记录路径
newpath[y] = path[state] + [y]
path = newpath
print_dptable(V)
(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
return (prob, path[state])
# HMM 实例导入
states = ('Rainy', 'Sunny')
observations = ('walk', 'shop', 'clean')
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
transition_probability = {
'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny': {'Rainy': 0.4, 'Sunny': 0.6},
}
emission_probability = {
'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
def example():
#将实例值传输到viterbi函数
return viterbi(observations,
states,
start_probability,
transition_probability,
emission_probability
)
print (example())
Python程序结果
第1天 第2天 第3天
Rainy: 0.06000 0.03840 0.01344
Sunny: 0.24000 0.04320 0.00259
第3天最大概率值及预测结果:
(0.01344, ['Sunny', 'Rainy', 'Rainy'])
参考文献:
- HMM与分词、词性标注、命名实体识别
11 Jun 2017
结巴分词(Jieba)是python中一个比较常用的中文分词包,功能包括:中文分词、词性标注、未登录词识别等。本文将着重介绍以下两个部分:Part A. 结巴分词下载与安装; Part B. 结巴中文分词基础应用。
Part A 结巴分词下载与安装
1.下载结巴分词(jieba)
官方下载地址:https://pypi.python.org/pypi/jieba/
注:可尝试官网中所述的其他安装方法
2.将下载好的ZIP包,解压缩到新建文件夹中
3.进入Windows下cmd命令框,输入如下命令
C:\Users\Admin>e:
E:\>cd 新建文件夹
E:\新建文件夹>cd jieba-0.38
D:\新建文件夹\jieba-0.38>python setup.py install
#=========== 安装完成 ============#
Part B 结巴中文分词基础应用
结巴分词共支持如下三种分词模式:
精确模式 也是最常用的模式,适合文本分析;
全模式 把句子中所有的可以组成词的词语都切分出来;
搜索引擎模式 在精确模式的基础上,对长词再次切分,从而提高召回率;
Python程序设计
import jieba
text="小明硕士毕业于中国科学院计算所,后在日本京都大学深造"
seg_list = jieba.cut(text, cut_all = False)
print("Precise Mode: " + "/".join(seg_list)) #精确模式
seg_list = jieba.cut(text, cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut_for_search(text) #搜索引擎模式
print("Search Mode: " + "/".join(seg_list))
Python执行结果
Precise Mode: 小明/硕士/毕业/于/中国科学院/计算所/,/后/在/日本京都大学/深造
Full Mode: 小/ 明/ 硕士/ 毕业/ 于/ 中国/ 中国科学院/ 科学/ 科学院/ 学院/ 计算/ 计算所/ / / 后/ 在/ 日本/ 日本京都大学/ 京都/ 京都大学/ 大学/ 深造
Search Mode: 小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/日本/京都/大学/日本京都大学/深造