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 = '請播放周杰倫的七里香給我聽'
下面給出第2題的題目截圖,有興趣的夥伴一起討論~