2018年秋招阿里的笔试编程题

题目1

    只需开口说话就能控制计算机做自己想做的事情,这种新奇的人机交互方式已经从科幻小说进入了现实世界。那么机器是如何理解人说的话呢?这是一个复杂的过程,其中一个重要的任务就是教会机器理解话语中的重点,即关键词。比如对机器人说“请播放周杰伦的青花瓷”,机器要理解”周杰伦”是一位歌手,而“青花瓷”是一首歌曲。而我们知道,“周杰”也是一位歌手,那机器如何抉择呢?为了简化问题,我们使用从左到右的最大长度匹配的原则:在本句里面,“周杰”的字符串长度比“周杰伦”小,所以识别“周杰伦”为歌手。
    通过互联网,我们能收集到一个庞大的知识库,帮助我们教机器来做这件事情。知识库中的所有歌曲的列表,所有歌手的列表,以及其他各种实体的列表。那么怎么使用这些实体通过上面的规则来教会机器是识别关键词呢?

编译说明

编译器版本python2.7.6

 请使用标准输出(sys.stout);已禁用图形、文件、网络、系统相关的操作,如Process,httplib,os;缩进可以使用tab、4个空格或2个空格,但是只能任选一种,不可混用。如果使用sys.readline,因为默认会带换行符,所以要strip(”)进行截取,建议使用raw_input()
时间限制:3s(c/c++以外语言:5s) 内存限制:128M(c/c++以外的语言为:640M)

输入:

输入数据包含两行,
  第一行,实体列表,多种实体之间用分号分隔开,实体名和实体值之间用下划线隔开,多个实体值之间用竖线隔开,所有标点都是英文状态下的,格式如下:
  实体名称1_实体值1|实体值2|…;实体名称2_实体值1|实体值2|…;….
  第二行:用户的自然语言指令

输入范例:

  singer_周杰|周杰伦|刘德华|王力宏;song_冰雨|北京欢迎你|七里香;actor_周杰伦|孙俪
  请播放周杰伦的七里香给我听

输出范例

请播放 周杰伦/actor,singer 的 七里香/song 给我听

  笔者在看到这一题时,一时兴起,边看综艺边敲代码,但对算法的了解甚少,只能按照自己的思路来解答,不成熟和不好之处,还望来者给予点评。望各位来者可以与笔者在评论区讨论这个问题,可以共同学习

思路:

  输出范例的句子,在实体值处截断并以’ ‘联接,因此,以实体值为切分的字符串,将用户输入的自然语言切分,并插入输入范例第一行中的实体名称。如此,笔者整理思路如下:
  step1:将输入的第一行按实体名称和实体值进行切分,并记为字典的形式:如{‘singer’:[‘周杰’,’周杰伦’,’刘德’华],’sng’:[冰雨’,’北京欢迎你’,’七里香’],’actor’:[‘周杰伦’,’孙俪’]
  ste2:判断上述字典中的value值是否存在于用户输入的自然语言里面,记录出现在用户输入的自然语言实体名称和实体值,并将具体相同的实体值对应的实体名称放在一起,如:{‘singer,actor’:’周杰伦‘,’song‘:’七里香’}
  step3:根据step2中的字典,用其value值切分用户输入的自然语言,并插入实体名称。

程序代码如下(代码版本python3,如注释处,修改一处即可适应于python2)

# encoding:utf-8
""" author:someone
    编译版本:python3
"""

def getDict():
    a = input('请输入规则:') # python2用raw_input("请输入规则:"),其它地方可不用修改
    b = input('请输入语句:')
    a1 = a.split(';')
    a2 = [each.split('_') for each in a1]
    a3, b1, b2 = {}, {}, {}
    for each0 in a2:
        a3[each0[0]] = each0[1].split('|')
    for each1 in a3.keys():
        b21 = []
        for each11 in a3[each1]:
            if each11 in b:
                b21.append(each11)
        if len(b21) > 1:
            b3 = [len(each2) for each2 in b21]
            b4 = b3.index(max(b3))
            b1[each1] = b21[b4]
        elif len(b21)==1:
            b1[each1] = b21[0]
        else:
            pass
    list_a = list(b1.keys())
    for i in range(0, len(list_a)):
        if list_a[i] in ''.join(b2.keys()):
            pass
        else:
            a0 = b1[list_a[i]]
            z0 = list_a[i]
            for j in range(i + 1, len(list_a)):
                b0 = b1[list_a[j]]
                if a0 == b0:
                    z0 = z0 + ',' + list_a[j]
            b2[z0] = a0
    return b2,b

def get():
    import time
    time1 = time.time()
    b2,b = getDict()
    list_b = list(b2.keys())
    b01 = b.split(b2[list_b[0]])
    j0 = 1
    for i0 in range(0,len(b01)-1):
        b01.insert(i0+j0,b2[list_b[0]]+'/'+list_b[0])
    if len(list_b)>1:
        for i1 in range(1,len(list_b)):
            b02 = []
            for each in b01:
                if b2[list_b[i1]] in each:
                    m = len(b02)
                    j = 0
                    b02.extend(each.split(b2[list_b[i1]]))
                    for i2 in range(m+1,len(b02)):
                        b02.insert(i2+j,b2[list_b[i1]]+'/'+list_b[i1])
                else:
                    b02.append(each)
            b01 = b02
        print(' '.join(b02))
    else:
        print(' '.join(b01))
if __name__=='__main__':
    get()
    # 例子
    # a = 'singer_周杰|周杰伦|刘德华|王力宏;song_冰雨|北京欢迎你|七里香;actor_周杰伦|孙俪'
    # b = '请播放周杰伦的七里香给我听'

###代码链接:https://gitee.com/someone317/codes/l8e7c4vjidgu6qwkzmh2o74
输入范例截图:
这里写图片描述
这里写图片描述这里写图片描述这里写图片描述`

欢迎各位来者一起讨论自然语言处理的问题~,未经同意,不得转载

下面给出第2题的题目截图,有兴趣的伙伴一起讨论~
这里写图片描述这里写图片描述这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39441762/article/details/82526537