【面试经验分享】十分值得一看! 研一下-算法实习-面试经验汇总

  1. 青藤云安全(2月26日) 机器学习算法实习岗
    微信视频面试,15分钟。主要问了下简历上做阿里云比赛的经历,后未联系,预计已挂。
    主要存在的问题:
    1)做的东西太简单太基础,不够看,导致面试官其实没啥可问的;
    2)对自己做的项目不够清楚,模型怎么融合的说不上来;(xgboost,np.hstack)
    3)在项目中遇到了什么问题,怎么解决的,收获了什么;(star模式)
    4)缺乏深度学习、BERT等相关的了解;
    5)没有论文阅读、代码复现的经验,工作中需要;
    6)没有考六级;
    7)说话逻辑性不好,断断续续的,(少说,“额,然后”,“就,那个”这种词)
    返回目录

  2. 陌陌一面(3月3日)自然语言处理实习岗
    acmcoder平台面试,1小时,主要是现场做了一道题,还有就是问了下阿里云比赛那个项目,一面过了。
    主要存在的问题:
    1)现场做题的能力还得加强,虽然题目简单,但思路比较乱。
    流程大概就是,面试官让我实现个split,然后我直接str.split()写出来了,
    然后她让我不要用现成的方法,直接代码实现一下,然后我就写了个for循环,然后切分字符串,这儿写对了,
    然后她让封装成函数,然后传入一个待切分次数的参数,然后这儿实现也简单,也对了,
    再之后她说还有两个问题,一是分隔符长度可能不是1,二是如果字符串最后几个字符刚好是分隔符,切分结果的最后面还要有个空字符串。
    到这儿的时候,我当时感觉好像要调整代码结构,然后思路就有点乱了,写了一段好像不对,没写出来。

当时写的代码

def my_split(str, s, times):
    s_len = len(s)
    temp = ''
    result = []
    left = 0
    for i in range(len(str)):
        if (len(result) == times):
            result.append(str[i:])
            break
        if str[i:(i+s_len)] != s:
            temp += str[i]
        else:
            i += s_len
            result.append(temp)
            temp = ''
            continue
        if (i == len(str) - 1):
            result.append(temp)
    return result

print(my_split("abc,ef,ee,aaa,", ',e', 2))

后来复盘写的代码

def my_split(str, s, times=-1):
    s_len = len(s) # 待切字符长度
    str = str + s # 拼接一下
    temp = ''
    result = [] # 待返回
    left = 0
    next = 0
    for i in range(len(str)):
        if i < next:
            continue
		# 指定times参数
        if (times != -1 and len(result) == times):
            result.append(str[i:-(s_len)])
            break
			
        if str[i:(i+s_len)] != s:
            temp += str[i]
			
        else:
            next = i + s_len
            result.append(temp)
            temp = ''
            continue
			
        if (i == len(str) - 1):
            result.append(temp)
			
    return result

	
print(my_split("abc,ef,ee,aaa,", ",e"))

后面回想的话,其实题目很简单,只是现场编程有点紧张,没法深入思考,思路有点乱,没写对。
面试官倒是态度很好,一直指引着我完善这个代码。

2)后面半小时在问项目,主要就问了阿里云比赛那个。
因为上次面试的经验,我专门看了下BERT,CNN,之类的东西。
面试的时候也算是用到了吧。

3)大概问了以下问题:
问:做ngram用的啥模型?面试官说,因为ngram只算是提取特征这块,我说,xgboost,决策树应该是,
问:有多少的数据量?
我说具体数字不太记得了,反正是很多,当时跑一个模型训练要三四个小时,
(单个文本长度10万左右,训练集文本数约1.3万,测试集约1.2万)
问:既然有这么多数据量,而且ngram这种特征工程的方法现在业界基本也不用,除了这个之外你还有没有试过一些其他的深度学习之类的方法?
我说,我主要做的是ngram,tf-idf,word2vec这块,其他队友有做textcnn,lstm之类的

问:那你对CNN之类这些有没有了解,你们有没有交流?
我说,有了解,CNN做出来的效果和ngram差不多,
问:CNN和ngram的效果差不多可以理解,其实都是提取特征,(我:CNN里有很多filter),对,那既然效果差不多,为啥不直接用CNN,还要用ngram?
我说,额,当时我主要是负责这块的,做的ngram,tf-idf,最后几个模型最后做的融合,(她:也就是各种模型都融合了一下是吧),对(捂脸。。。)
我说,虽然原理上差不多,不过提取的特征还是不一样的,所以融合之后效果提升了,

问:像这类问题之前我们也做过,如果是说,某些api出现没有什么问题,但api形成一个特定序列的话,就会是病毒,你怎么考虑?
答:序列问题,RNN?

问:那么对最新的技术有没有了解,BERT啥的,(我当然说有了解了,毕竟上次面完专门学了下)
问:那么你觉得这些技术对比之前的方法有什么优势?
我说,BERT里最重要的就是Transformer里的注意力机制,像ngram之类的,输出的向量,其实是把词都同等看待的,注意力机制的话,词的权重是不同的。
面试官:ngram的词频不同也是不同的权重,不是这个原因,是因为BERT里加了序列信息,(我:长程依赖?)不只是长程依赖,还有xxx(这儿忘了说啥了)
(其实序列信息我也知道,BERT里集合了RNN,CNN等的优点,当时不知道为啥,就是没说到点子上,可能是还不熟悉)

问:你觉得为什么要用这些预训练模型?
我说,主要是比较方便,做实际任务的时候,可能没有那么多的数据量去训练这些参数,用预训练模型的话,可以节省工作量,不用再从头训练,只需要做一些微调既可。

问:看你用到了交叉熵,做分类任务的时候通常用交叉熵作为损失函数,解释下是怎么做的?如果是二分类,softmax,0/1,结果分别为1/4, 3/4,交叉熵是多少?
我这答得比较含糊,说之前没拿交叉熵做过损失函数,,,
(其实不对,这个比赛评测的指标就是交叉熵。。。xgboost里的评测参数设的也是mlogloss,
主要是因为搞错了交叉熵和相对熵的概念(数学之美书里有个错误),其实我当时算测试集与训练集分布差异用的是相对熵,简历上写错了,
还有就是当时其实算测试集,是通过全0,全1提交,然后得到的分布,这个也没说)

还说了一些问题,也不记得了。

4)经验教训就是,一定要录音,不然忘了的话,总结都不知道咋总结,

5)还有就是要问一下人家对我的面试评价,以便于自己回顾,然后学习提高,

6)感觉这次自己说话逻辑比上次清楚多了,

7)和HR约时间,面试之间应该要留些时间间隔,以便及时整理完善面试经验,总结提升。
返回目录

  1. 陌陌二面(3月4日) 自然语言处理实习岗
    第二天面了二面,40分钟,二面面得很顺利,轻松过了。
    这次面试和一面流程差不多,问了下简历上的东西(这次简历上的项目都问到了,不过主要还是在问比赛那个),然后做了道编程题。

(这回录了音)
首先上来还是一样,先自我介绍了一下。然后介绍了下项目经历。
(此处略)

问:为什么想到要用ngram方法
问:ngram用的多少gram
问:有没有看过原始数据,序列会不会特别长,重复很多
问:textcnn和ngram比较哪个好
问:word2vec在这个任务里主要是用来做什么
问:你是直接把这两个向量concat到一起吗(ngram和Word2vec的)
问:说一下xgboost的原理
问:xgboost里加入采样主要是为了解决什么问题
问:xgboost里会有一些正则,L1,L2,有没有了解过它的作用
问:xgboost的优缺点(缺点没答上来,可能是参数比较多,不好调?)
问:xgboost和cnn具体到case上,有没有看过模型结果上的对比(这个真没有做过)
问:能写下互信息的公式吗(不会写,应该是 I(x,y) = p(x, y)log(p(x, y) / (p(x)p(y))) )
问:或者你描述一下它是干什么的

(二面时这些问题大部分都回答地比较好,所以只列举下问题,不记录回答内容了)

编程的话,给了几个case的真实值,预测值,让写代码计算下准确率,召回率。(很庆幸我居然记得这两个公式,所以这个题很容易就写对了)

p = TP / TP + FP, r = TP / TP + FN

def read_data():
    pred = ['B', 'A', 'B', 'A', 'A', 'B']
    real = ['A', 'A', 'B', 'B', 'A', 'A']
    return pred, real

def compute(pred, real, true_flag):
    TP = 0
    FP = 0
    FN = 0
    if (len(pred) != len(real)):
        return -1
    for i in range(len(pred)):
        T = (pred[i] == true_flag)
        P = (pred[i] == real[i])
        if (T and P): TP = TP + 1
        if (not T and not P): FN = FN + 1
        if (not T and P): FP = FP + 1

    p = TP / (TP + FP)
    r = TP / (TP + FN)
    return p, r

pred, real = read_data()
print(compute(pred, real, 'B'))

我问了下,到第几轮了,说后面至少还有一次技术面,
然后是,问了下建议,
说我的项目经历和工作是比较相关的,文本处理的一些工作,
希望把用到的模型原理再加强一下,因为工作中没有人能告诉用什么样的方法,这就得基于自己对于模型的理解,
这些是在学校里要加强的,工作之后会更得心应手一些。

(两次技术面的面试官都是小姐姐,但通知面试的HR却是男的,有点意外)

自我感觉,两次面试比较顺利的原因是:
1)找实习难在做出这一决定,找实习的过程倒并不是很难。虽然算法岗校招竞争惨烈,但实习的门槛相对来说并不高。
2)学历加分。这段时间在拉勾网上只点投了几个大小公司,投出了十来份简历,就得到了很好的反馈,要么是看到HR转发了简历,要么就是收到了面试邀请。
简历的通过率比较高,我觉得这还是得归功于北邮硕士这一头衔的学历加分,个人能力还是有很大的不足,这是目前要认真看待的事实。
3)比赛经历加分。虽然只是一个新人赛,但组队做比赛的过程中,讨论了很多,学到了很多,对模型、问题理解地较深入,在面试的过程中不至于翻车。
4)善于总结的好习惯。因为经常写博客(学习笔记之类),写FP(学习计划+总结),有总结的习惯。在面试的过程中,每面完一场之后有总结反思,所以感觉一次比一次更轻松了。
返回目录

  1. 字节跳动一面(3月10日) 算法实习生(抖音/火山)
    在牛客网平台面试,1小时,现场做了两道题,简单问了下项目就结束了,已挂。

给定一个矩阵里面只包含0和1两种数字,给出每个单元距离最近的0的距离,上下左右都算作相邻,相邻的距离为1
示例1
输入:
[[0,0,0],
[0,1,0],
[0,0,0]]
输出:
[[0,0,0],
[0,1,0],
[0,0,0]]
示例2
输入:
[[0,0,0],
[0,1,0],
[1,1,1]]
输出:
[[0,0,0],
[0,1,0],
[1,2,1]]

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

两道题都是常规题,不过当时写得都比较乱,没写对。BFS的题,我大一都会写,现在反而写不对了,郁闷了一个下午。

后面还问了下,文本分类还有哪些方法,为什么要用朴素贝叶斯?
当时说了,用朴素贝叶斯是因为简单,在大文本上处理速度快。
还可以用决策树(问:不是和ngram差不多吗,大文本上怎么会用这么慢的方法),还有LDA主题模型等
(后记:长文本的话,应该考虑预训练模型,速度会快)

然后就结束了,这一场面试表现极差。

复盘分析,主要原因如下:
1)下午面试状态不好。当时刚刚睡醒,头脑昏沉,思路不清晰,边界条件啥的想不清楚。此外还忘了录音。还有就是之前陌陌开的是语音,字节开的视频,视频写代码有点紧张。
2)长期没做过OJ题,手太生。从去年复试完之后就没有再碰过OJ,今年找实习也是临时起意,没有做足准备。还有就是以前刷题用C++,没用python做过,临时写题,还遇到了语言层面的问题。
3)简历项目上准备地不够。第一个比赛的项目,准备地比较充分,后面的项目因为比较简单,觉得面试不太会关注,没有认真思考过,结果回答问题时很懵。

教训:
1)一般面试都会让现场写道题,这次面试居然挂在了简单的算法题上,看来以后平时每周要做点题,到面试前更是要好好刷一下。
2)以后面试尽量改到早上,下午实在是状态不行。临场发挥都发挥不出来。
3)但凡是简历上列出的项目都要好好准备,做足回答各种问题的准备。
返回目录

  1. 陌陌三面(3月11日)自然语言处理实习岗
    1小时,主要问了下学校学的课程内容,以及做了一个简繁体转换的题。三面挂了。
    问题如下:
    1)自我介绍。
    2)乔姆斯基文法有哪些,可以用什么自动机来解决?
    3)正则表达式,用来解决什么文法的问题?
    4)解释下DFA和NFA,区别及联系?
    5)描述一下隐马尔可夫模型,怎么解决一个具体的词性标注问题?(这块答得比较笼统,只描述了下原理,没答好,应该把怎么解决三个问题描述一下)
    6)隐马尔可夫有哪三个问题要解决?
    7)朴素贝叶斯的朴素是什么意思?(这个不知道,没答好,应该是条件独立性假设)
    8)关联规则算法举一个例子,然后描述下怎么解决NLP的问题?(Apriori,算法具体的不记得了,没答好)
    9)讲一下tf-idf的原理。

评价:学校这些课程都是好课,理论的学好,工作中需要去读博客什么的,理论的没学好看不明白,不能学过的都不记得。

编程题目大概就是一个读入一百万份文本,然后做简繁转换。(问题忘了保存了)

代码只描述算法思路,不需要运行

调包的话可以用 opencc -i

word_dic1 = {} # 繁体简体对照表

读入词表

with open("word_dict.txt", encoding="utf-8") as f:
    content = f.readlines()
    for line in content:
        words = line.split("——")
        if len(words[0]) > 1:
            w = words[0].split("/")
            for i in w:
                word_dic1[i] = words[1]
        else:
            word_dic1[words[0]] = words[1]

for file_path in file_list:
    # 替换
    with open(file_path, "r") as f:
        content = f.readlines()
        
        str_list = []
        str = ""
        for i in range(len(content)):
            for j in range(len(content[i])):
                if content[i][j] in word_dic1:
                    temp = word_dic1[content[i][j]]
                    str += temp
                else:
                    str += content[i][j]
            str_list.append(str + "\n")
            str = ""
        
    # 写入文件
    with open("out_" + file_path, "w") as f:
        for str in str_list:
            f.writeline(str)

问:线上的话,这个代码怎么优化?
我说,可以用散列表解决一下查找简繁转换表这块。
面试官说,散列表并没有优化啥,主要耗时操作在IO上,这个字符串处理是不是有问题?
我说,我这儿全部写一遍确实有问题,应该是只修改需要做简繁转换的字符,做写操作。

总体评价:
1)编码能力还可以,但是读题目不够仔细,还有代码细节小问题比较多。
2)看了前面几轮的面试评价。简历上的术语不要太多,这些术语无非就是想说明做了很多东西,但写的很多都是面试官感兴趣的、想问的。
能写在简历上的就得是确定会的,问不倒的。如果问了之后回答不清楚,反而成为减分项。

自我总结:
1)没想到会问课程的东西,一来可能学得也马虎,二来面试前没有复习一下,有些问题回答得不清楚;
2)现场编程细节还是注意不够,暴露出来潜在的习惯问题。
两方面的习惯问题,一是平时写代码经常简单地随便写完大体,然后再调试细节,没有在写代码的过程中关注细节问题,等于给自己挖坑。
二是经常题目看个大概有思路就开始写了,对题目中的细节关注不够,没有提前把需求里的点理清楚,也是在给自己挖坑。
返回目录

  1. 将门创投(3月17日) 自然语言处理实习岗
    20分钟,微信电话。给了口头offer,已拒。技术战略部,部门主管面试。
    问了下,是否在北京,最快何时能到岗,一周能实习多久,还有薪资要求,以及对于他们的业务需求有没有兴趣之类的。
    还有就是给我介绍了下他们公司,以及介绍了下他们的初创团队,业务需求之类。并约时间周内和他们CTO聊一下。
    (主要考虑到他们公司没有专职的NLP工程师可以带我,当天下午拒绝了)
    这周开始在BOSS直聘以及拉勾网上海投简历。
    返回目录

  2. 睿企科技(3月18日)自然语言处理实习岗
    1个小时,笔试。题目比较简单,不过时间有点紧。
    1)元组与列表的区别。
    2)写一个动物类(Animal),初始化函数输入名称(name),类型为字符串,再写一个狗类(Dog)继承动物类,初始化函数输入名称(name)和颜色(color)。
    3)DataFrame:

import string
import random
import numpy as np
import pandas as pd

随机生成一些名字和分数

name = set()
while len(name) < 100:
    name.add(''.join(random.choice(string.ascii_lowercase) for _ in range(5)))
name = list(name)
df_score = pd.DataFrame({'name': name, 'score': np.random.randint(80, 100, 100)})
df_score.head()

给随机名字分配班级

classes = ['A', 'B', 'C']
df_class = pd.DataFrame({'name': name, 'class': [random.choice(classes) for _ in range(100)]})
df_class = df_class.sample(frac=1).reset_index(drop=True)
df_class.head()

题目 1: 按照名字合并分数和班级

题目 2: 取出 A 班的成绩表,按照分数降序排序

题目 3: 计算 A、B、C 班的平均分

4)训练集、验证集和测试集的区别是什么,为什么需要验证集?
5)介绍你使用的深度学习框架(如 TensorFlow、PyTorch)。
6)介绍卷积运算的过程,比如输入一个 3通道,尺寸为 (5, 5) 的图像,如果要输出 6 通道,尺寸为 (3, 3),卷积层的参数应该如何设置?
假设输出矩阵 A 的尺寸为 (6, 3, 3),它的第一个数字A[0, 0, 0] 是如何计算出来的。
7)排好序的数组,从中找到相加等于target数字的两个数的所有可能
比如,输入
数组:[2, 3, 4, 7, 10, 12]
Target数:14
输出: [(2, 12), (4, 10)]
def get_all_combs(array, target)
8)编写正则表达式,匹配身份证号码、电话号码、手机号码或银行卡号,要求写出两个或以上的表达式。
9)输入一个变形数组,及某个数字,输出这个数字在变形数组中的位置
def find_num(array, num) 要求算法复杂度为 log(n)
变形的方法是将一个排好序的数组某个位置之前的数放到数组末尾,比如
原始数组为:
2 3 6 9 10 12 24 34
得到以下变形数组(将2 3 6放在了数组末尾):
9 10 12 24 34 2 3 6
比如,输入24和变形数组,输出 3
说明:
不需要写变形的code,输入已经是一个变形的数组了
不知道具体将多少个数放在了数组的末尾
返回目录

  1. 交叉科技(3月18日)自然语言处理实习岗
    2个多小时,笔试。题目有点难。
    1)100!(100 阶乘)最后有多少个连续的零!。例如,12!=479001600 结尾处有两个连续的零。
    2)匹配生日:你在一个满屋子有 N 个人,你问他们的生日是什么时候。假设每人生日是 365 天中随机的一天,至少有两个人共享同一个生日的概率有多大?
    3)什么是蒙特卡罗方法?设计一个 Monte Carlo 实验来估计π?(或其他类似的 monte carlo 实验)
    4)国王要求从他国家的 10 个地区各征收 1000 金币的税。每个地区的税务员在年底都会给他带来一袋金币。一个线人告诉国王,一个税务员作弊,给的硬币总是比标准硬币轻 10%,但他不知道哪个税务员作弊。国王知道每一枚硬币的重量应该正好是一盎司。国王怎么能准确地用一次称重来识别那个骗子呢?
    5)你站在半径 R 的圆形区域的中心。该区域周围有一个低铁丝网。附在铁丝网上的是一条饿狗,它喜欢吃任何它能抓住的人。你可以以速度 v 跑。不幸的是,狗可以以 4 v 的速度跑。如果你试图逃离战场,狗会尽力抓住你。你的跑动策略是什么,不用喂狗就可以逃出球场?
    6)输入是一个 32 位无符号整数 A。现在要求输出 32 位无符号整数 B,满足 B 的二进制表示是 A 的二进制表示的颠倒。
    例子
    输入:10
    输出:5
    解释:10 的二进制表示是 1010,二进制表示 0101 对应数字 5
    输入最多可以是 9 位数
    7)我们给你一个三角形的矩阵(见例子)
    你的任务是找出自顶向下的最短路径。路径上的每一步只能移动到下一行中相邻的结点上。
    输入:
    [2 2],
    [1 1,4],
    [6,2 2,7],
    [4,1 1,7,3]
    输出:6
    解释:自顶向下的最小路径和为 6(即,2 2 + 1 1 + 2 2 + 1 1 = 6)。
    8)给定 n 个非负整数,每个那一列柱子的高度(如下图),计算最多能接多少水。

示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
解释:数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示柱子的高度,蓝色部分代表水,这个例子可以接 6 个单位的雨水。
9)Explain how to view (soft-margin) SVM as a penalization method (i.e.,explain the objective SVM as a Loss+Regularization term)
10)Explain the principle of the stochastic gradient descent algorithm. What is the benefit of using stochastic gradient descent (instead of gradient descent)?
11)What is overfitting? How to prevent overfitting (in both traditional method and deeplearning)?
12)Explain what are the gradient vanishing/explosion problems in RNN? (we need the underlying mathematical reason)
13)Consider the image captioning problem. Given a picture as the input, your algorithm should output a sentence describing the picture.
(a)Describe a neural network structure that can do this. (if you use well known CNN or RNN structures, you don’t need to go into the details. Just say how to use them (what the input, what is the output).)
(b)Describing the training process (what is the training data? what is the objective?)
©Describe the test process (In the testing phase, give a picture as the input, how your algorithm output a sentence describing the picture.)
(d)Suppose we want to have a parameter to determine the diversity of the output sentence (on one extreme, the output is almost a deterministic sentence, and on the other extreme, the output is almost a random sequence) This can be done by adding a temperature parameter to the softmax function. How would you do it? (there may be more than one reasonable answers.)
返回目录

  1. 感易智能(3月19日)自然语言处理实习岗
    电话面试,30分钟。未通过。
    面试过程:
    1)自我介绍
    2)介绍下参加的比赛
    3)比较下ngram和tf-idf
    4)为什么ngram更适合这个场景
    5)还用过别的方法吗
    6)最后集成用了哪些模型
    7)比较过不同方法的差异吗,为什么集成后效果会提升
    8)解释一下方法之间的差异
    9)说一下CNN和全连接层的差别,是如何把参数变少的
    10)为什么这样做可行,这种简化是满足了什么条件
    11)说一下平移不变性,subsampling
    12)说一下word2vec的原理
    13)词向量是怎么学出来的
    14)还记得训练过程中的小trick吗,层次softmax,nagative sampling,(没回答好)
    15)了解NLP一些任务,比如问答,阅读理解之类的
    16)了解最新的技术吗
    17)能说一下Transformer
    18)可以介绍下多头注意力机制,怎么实现的(没回答好)
    19)attention的权重是怎么训练出来的(没回答好)
    返回目录

  2. 千芯科技(3月19日) 深度学习/人工智能实习生
    我看JD里有NLP相关的就投了,没想到是一个sb公司。
    约好的面试时间,迟到了半小时(因为他们时间安排不合理,上一个还没面完)。
    面试居然是多面一,好几个人面,甚至HR都在。
    一上来就问CV的东西,我还以为自己投错了岗位。
    我说我是做NLP的,另一个人问我更喜欢NLP还是ASR。
    还问我一般用啥模型,我说了几个,人说这不都是机器学习的吗,(内心os:机器学习的方法就不能用来做NLP了?)
    问我用没用过最新的技术,我说去年预训练模型BERT很火,我用BERT跑过MRPC,
    问我roBERTa知道不,我说没用过roBERTa,人说那你还说自己是做NLP的,roBERTa都不知道。(内心os:一个BERT变种,这都能奚落人?)
    然后没人再问问题,HR说面试结束了,让我退群。
    (迟到半小时,面试十分钟,还不尊重人,真是一个sb公司)
    返回目录

  3. 微播易(3月20日) NLP算法实习生
    笔试,1小时,做了一道简单的编程题,tf-idf, 生成文档的向量表示。代码如下。

读入文件

content = None # 文本列表
with open("./segmented.txt", encoding="utf-8") as f:
    content = f.readlines()
content[:5]
['\ufeff好 了 我 要 放大 招 了 我们 班 的 美女 们 看 压轴 的 哦 有没有 小 啊\n',
 '小 舞王\n',
 '现在 的 小朋友 都 这么 6 的 吗\n',
 '不断 给 你们 带新 的 作品 新 的 造型 我 是 咖啡师 因为 有 你们 在 我 才能 一直 坚持下去 点 赞点 赞\n',
 '老 胳膊 老 腿 了 不 接受批评 哦\n']

预处理

content[0] = content[0][1:-1]
for i in range(1, len(content)):
    content[i] = content[i][:-1]
    
content[:5]
['好 了 我 要 放大 招 了 我们 班 的 美女 们 看 压轴 的 哦 有没有 小 啊',
 '小 舞王',
 '现在 的 小朋友 都 这么 6 的 吗',
 '不断 给 你们 带新 的 作品 新 的 造型 我 是 咖啡师 因为 有 你们 在 我 才能 一直 坚持下去 点 赞点 赞',
 '老 胳膊 老 腿 了 不 接受批评 哦']

文档总数

n = len(content)
n
4570

扫描文件和计数

docCount = {}
tf = []
content_lst = []
for i in range(len(content)):
    word_lst = content[i].split(' ')
    content_lst.append(word_lst)
    tfCount = {}
    for word in word_lst:
        if word != ' ':
            if word not in tfCount:
                tfCount[word] = 1
                if word not in docCount:
                    docCount[word] = 1
                else:
                    docCount[word] += 1
            else:
                tfCount[word] += 1
    tf.append(tfCount)
tf[0]
{'好': 1,
 '了': 2,
 '我': 1,
 '要': 1,
 '放大': 1,
 '招': 1,
 '我们': 1,
 '班': 1,
 '的': 2,
 '美女': 1,
 '们': 1,
 '看': 1,
 '压轴': 1,
 '哦': 1,
 '有没有': 1,
 '小': 1,
 '啊': 1}

词表大小

dic_cnt = len(docCount)
dic_cnt
8927
import math

vect = [] # 向量表示,用tf-idf值
for i in range(len(content_lst)):
    word_lst = content_lst[i]
    tf_idf = [0] * dic_cnt
    cnt = 0
    for word in docCount:
        if word in word_lst:
            idf = math.log(n / docCount[word], 2)
            tf_idf[cnt] = tf[i][word] * idf
        cnt += 1
    vect.append(tf_idf)
print(docCount['了'], tf[0]['了'], len(vect))
print(math.log(n / docCount['了'], 2))
916 2 4570
2.3187746618484883
print(vect[0][:30], len(vect[0]))
[4.723350222308707, 4.637549323696977, 2.3015529213199013, 5.203782139558557, 12.157978449945432, 9.573015949224276, 5.543268605830224, 9.157978449945434, 3.0902199053087824, 8.350623527887828, 6.514122260170708, 5.403090947781964, 12.157978449945432, 5.968153891065415, 7.29999745481786, 3.340994826690051, 5.180698526445516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 8927
print(vect[1][:30], len(vect[1]))
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.340994826690051, 0, 11.157978449945432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 8927

返回目录

  1. 东方棱镜(3月20日) 算法实习岗
    约好了面试时间,然后被放鸽子,联系不上HR了。。。。
    返回目录

  2. 微播易(3月20日) NLP算法实习岗
    电话面试,30分钟。
    1)讲下做文本分类的项目
    2)准确率怎么定义,准确率高意味着什么,召回率高意味着什么(没答好)
    3)如何衡量两个分类器的好坏(没答好)
    4)用混淆矩阵的作用是什么
    5)如何把混淆严重的两类分开(没答好,应该是特征工程这块)
    6)对NLP哪个细分领域有比较深入的研究
    7)对工程,还是科研更有兴趣
    8)介绍了下他们有深度学习/多模态方面的业务需求
    返回目录

  3. 交叉科技(3月20日)算法实习岗
    迟到了半小时,因为HR把这事给忘了。CEO面试,微信电话面试半小时。(感觉会给offer)
    主要是看简历问了些问题,基本这些问题之前面试都问过了,所以回答地挺好的。
    其他问题的话,包括LDA,word2vec,bert的原理之类的,也有所准备,回答的也蛮好的。
    然后介绍了下他们在做一个根据新闻事件预测股票涨跌的需求,然后问了下有没有兴趣,目前有几个offer,一周能实习几天之类的问题。
    返回目录

  4. 微播易(3月23日)NLP算法实习岗
    电话沟通,10分钟左右。后来没联系,感觉应该没通过,微播易两轮面试都答得不好。
    算法负责人是北邮的一个学长,问的问题也偏基础,没有答好,挺遗憾的。

1)对深度学习有哪些了解
2)做文本分类有用过其他的方法
3)朴素贝叶斯效果不好,有没有什么改进思路
4)textcnn有做过吗
5)cnn的输入输出是什么
6)对pytorch,TensorFlow有哪些了解
7)对实习有哪些期望
8)一周可以实习几天
返回目录

  1. 有鱼科技(3月23日)算法实习岗
    电话面试,20分钟左右。已挂。
    1)问了下个人情况
    2)讲一下项目
    3)讲一下tf-idf
    4)讲一下word2vec的负采样
    5)文本分类有没有试过其他方法
    6)问了下数据结构的问题,最长递增子序列(动态规划)、快速排序(以及计算复杂度)(这块没回答好,不熟)
    返回目录

  2. 鲸航科技(3月23日)语音识别算法实习岗
    视频面试。半个多小时。然后给了口头offer
    1)面试主要讲了下项目
    2)问了准确率,回归率,分类与回归的区别,分类方法等各种基础问题
    3)然后就是,面试官介绍了下他们公司的业务啥的
    4)然后问有没有兴趣做语音识别语言模型这块
    5)这个是北邮校友的公司,感觉对北邮人很开放,所以聊的挺愉快的,希望我能去

返回目录

  1. 亚信科技(3月23日)算法实习岗
    电话面试,20分钟。可能未通过。
    他们这边主要是做聊天机器人,我对这方面不了解。

返回目录

  1. 百度(3月24日)数据挖掘实习岗
    视频面试,一个小时,问了一些机器学习的问题,然后做了两道算法题。面试过程非常友好。
    我这问题回答地都比较好,然后算法题也写对了(当然应该不是最优解法)。
    (总共应该是有两轮技术面,加一轮经理面)
    未联系,可能是因为岗位不对口,未通过。

问题包括:
0)为什么研一就出来实习等个人问题
1)对图像这方面感不感兴趣
2)讲一下xgboost,还有就是向量表示方法
3)xgboost和GBDT的差别
4)讲一下随机森林以及它的优点
5)讲一下后向传播算法
6)python你常用的库有哪些
7)python2和python3的区别(除了语法上有些区别之外,其他不清楚)
8)word2vec了解多少,讲一下
9)讲一下CNN和RNN的区别,以及优缺点,使用上有什么区别
10)平衡二叉树相比于普通树有哪些优点
11)监督学习和非监督学习的区别
12)讲一下自监督学习(这块不清楚,我问是不是和强化学习差不多,然后我讲了下强化学习的)
13)其他问题,忘记录音了,不记得了

编程题目如下:
1)一个循环有序数组,比如[4, 5, 6, 7, 8, 1, 2, 3],找出数组中的最大值

def compute(lst):
    i = len(lst) // 2
    if len(lst) < 1:
        return -1
    if lst[i] > lst[i+1]:
        return lst[i]
    else:
        first = compute(lst[:i])
        return first if first != -1 else compute(lst[i+1:])

2)跳步计算,查了下,是一道LeetCode原题
比如[2, 3, 1, 1, 4],每个位置是可以跳的最大值,问最少可以跳几步到最后一个位置。示例的答案是2

def compute2(lst2):
    temp_lst = [] # 保存状态信息
    steps = [] # 保存最终步数信息
    if len(lst2) == 0:
        return
    temp_lst.append([lst2[0], 0, 0])
    
    while len(temp_lst) > 0:
        # 取数据
        data, index, step = temp_lst[0]
        temp_lst.pop(0)
        
        # print(data, index, step)
        
        # 添加最终步数
        if index == len(lst2) - 1:
            steps.append(step)
            continue
            
        for i in range(1, data+1):
            if index+i < len(lst2):
                temp_lst.append([lst2[index+i], index+i, step+1])
                # print("add", lst2[index+i], "index", index+i, "step", step+1)
    
    # print(steps)
    min_step = -1
    for j in steps:
        if j < min_step or min_step == -1:
            min_step = j
    return min_step

返回目录

  1. 交叉科技(3月24日)自然语言处理实习岗
    20分钟,部门经理+同事面。
    拿我之前的笔试题简单问了下。因为之前CEO已经面试通过了,所以这轮比较水。
    面完后次日HR发了offer。
    返回目录

  2. 云日未来(3月24日)自然语言处理实习岗
    1小时,钉钉视频面,面试过程挺不友好的。
    一上来,自我介绍完,我说我讲下我的项目吧,人说,不用,你就说下你会啥吧。(当时就感觉挺尴尬的)
    然后整个过程问了很多问题,简历上的,还有python,SVM,BERT,word2vec等等,问得都很细节,一些问题我也答不上来。
    面试过程中,面试官自顾自地接听同事电话,完全无视我的存在,感觉不太尊重求职者。
    不过确实问的很多问题也是我的知识盲点,所以也算是一次不错的面试经历,学到了很多,虽然过程不太舒服。

返回目录

  1. 求职总结(3月26日)
    在交叉科技和鲸航科技之间,纠结了足足两天。
    交叉科技是清华交叉信息学院(姚班)老师的公司,给的NLP实习岗,可能会做新闻事件抽取,根据新闻事件预测股票涨跌,NLP+金融。在清华旁边,启迪大厦那儿。
    鲸航是北邮校友的公司,给的ASR实习岗(语言模型方向),可能会重写一下一些底层框架之类的,也可能偏产品。在北航旁边,给钱更多一些。
    最终还是决定去交叉科技,感觉在那边成长速度会更快一些。

求职过程中,最遗憾的是面陌陌。JD和经历很对口,几轮面试,面试官都很好,可惜最终因为自己的基础不够扎实,没能通过。
最气恼的是面字节跳动。自己状态不好,简单的图算法题都没写对,浪费了大厂面试机会。

最终还是从拿到的小公司offer中选择了一个自认为最好的,也算是一个月的求职有了一个还不错的结果。
总而言之,自身实力硬伤很多。专业知识还是学的不够扎实,知识面也不够广。
尤其比较遗憾的是,面试前的寒假,没有能够好好刷刷LeetCode,结果面试出的很多题都是LeetCode原题。
而且面试前期不知道有百面机器学习这本书,面试后期才发现。如果早一点看的话,很多机器学习相关的问题都可以回答地比较好。

返回目录

  1. 之后的学习方向(3月30日)
    数据结构与算法:之前学得比较零散,需要系统地梳理一遍,然后把LeetCode刷几遍,同时参与一些平台的竞赛。
    基础知识:包括机器学习、深度学习、自然语言处理在内的基础知识,需要系统复习并归纳,同时重视了解面试相关的题目。
    个人简历:需要不断补充完善,需要更优质的经历添加到简历中,包括论文、实习、竞赛、开源项目等。
    时间精力:放弃一些不切实际的幻想,不做无谓的尝试,把主要精力集中到专业方向上来,多学习,多实践。

你可能感兴趣的:(算法,python,机器学习,自然语言处理)