NLP开发的体会


作为一个python开发老司机,做NLP开发也有很长时间了,有一些心得体会,想站在开发者的角度,说说做算法相关的工程开发需要的技能,这也是我面试中着重考察面试者的技能点,希望能抛砖引玉。
做NLP开发,或者更进一步说,做开发,我觉得比较重要的是对原理的把握。看到很多论坛里和群上说,他们做的是代码的搬运工,直接百度抄的。对这种代码,其实要保持一份警惕,因为我自己也有自己的网站,有时候思考或总结了一些东西发上去,过一阵子常有发现发上去的东西有错误或不严谨的地方,但经常懒得去改,那反过来想,怎么能保证别人写的东西没问题呢?无论是什么代码,本着对项目对自己负责的精神一定要过一遍,理解原理。当真正去理解之后,有时候你会发现,这些抄过来的代码,逻辑可能还不够严谨,代码可能还不够规范,还不如自己实现一遍。当真正做到理解原理这一步,什么新的包就可以很容易上手了。而且,你长久跟一个项目就会发现,项目的需求是一直在增加,一直在变化的,掌握那些包的简单用法远远不够,还要深入去阅读源码。比如jieba分词,简单的用法仅仅是用jieba加载自定义词典,用jieba.cut分词,但后来随着项目的发展,我们需要对不同的用户建一套自己的分词词典,这样原来简单的jieba.cut就远远不够了,阅读源码发现jieba.cut其实调的是内建的Tokenizer对象的cut方法,这样要为每个用户建自己的分词器,只要建自己的Tokenizer对象就可以了。
第二个,比较重要的是抽象思维吧。要深入去理解面向对象编程、装饰器、元类等,去思考代码架构,这些对你写代码很有帮助。我接手的代码原先是算法工程师写的,他们之前既做算法又做工程,整个项目到处是重复的逻辑,通篇的函数,一个函数可以写2000多行,看得我简直内分泌失调。第一,一个问答接口函数写2000多行说明其实之前写这个功能的人对功能内部其实对问答的处理流程没有思考清楚,另外这样对python这种动态语言很容易导致变量名覆盖和相互影响,更重要的是,这种写法完全没有抵御需求变化的能力,因为牵一发而动全身。稍微简单整理就会发现,问答的过程至少可以简单地分为问题预处理、匹配、组织协议数据等过程,每个过程用单独的方法去处理都不会写得这么乱,所以写代码一定要对让各功能独立成为一个模块,这样的自由组合当需求改变时,变化会非常小。第二,因为问答的过程涉及很多参数,我们用了redis缓存数据,所以函数式的编程导致到处要传大量参数,到处在取redis数据,大量重复的IO操作影响了性能。所以在这里,面向过程的编程明显是不合适的,面向对象,将大量公共参数作为实例变量,redis数据做本地缓存,就可以解决这些问题。
第三个,熟悉numpy、DataFrame的用法,熟悉NLP各种算法。虽然做开发不需要研究算法,但需要对算法没有理解透的话,当算法工程师把他们的代码扔给你的时候,你无从码起。更重要的是,他们拿过来的代码并不是可以拿来即用的,三四秒的接口响应时间谁受得了?他们更注重的是效果,而作为开发除了效果还要看性能。没有对numpy、DataFrame的计算原理有一定的理解,没有对python的GIL锁、多线程、多进程有一定的理解,性能的优化是无从谈起的。
基于上面这些,我们公司招工程化人员的时候,更看重的是对原理的把握和挖掘能力,特别是对算法原理的把握,面试前起码把各种算法都实现一遍吧。
已邀请:

要回复问题请先登录注册

收藏七月在线,一起向大牛进阶

ctrl+D或command+D可以快速收藏哦~