我的方法也很暴力。。。 # coding=utf-8 import sys # 求特征的最大长度和最短长度 def max_min_ftv_length(features):     max = 0     min = 1000     for ftvs in features.values():         for ftv in ftvs:             if max < len(ftv):                 max = len(ftv)             if min > len(ftv):                 min = len(ftv)     return max, min # 最大正向匹配 def max_length_fit(fts, seq, mxfl, mnfl):     res_seq = ''     num = 0 # 统计实体属于特征类型的种类数     mid = 0     for i in range(len(seq)):         left = right = 0         if i+mxfl<len(seq) and i+mnfl<len(seq):             left = i + mnfl             right = i + mxfl + 1         elif i+mxfl>=len(seq) and i+mnfl<len(seq):             left = i + mnfl             right = len(seq) + 1         else:             continue         if(num != 0): #说明已经匹配到输入字符串最右端             break;         #print(left,right)         for j in range(left,right):# 只对特征最小长度到最大长度的区间进行搜索             #print(i,j,seq[i:j])             for ftk in fts.keys():                 if num==0:# 判定条件1:当前字符串能够匹配特征,多加一个字符就匹配不上,便是最大匹配                           # 判定条件2:当前字符串能够匹配特征,且已经到输入字符串最右端,便是最大匹配                     if (seq[i:j] in fts[ftk] and j!=len(seq) and seq[i:j+1] not in fts[ftk]) or (seq[i:j] in fts[ftk] and j==len(seq)):                         res_seq = res_seq + seq[mid:i] + ' ' + seq[i:j] + '/' + ftk                         num = num + 1                         mid = j                 elif (seq[i:j] in fts[ftk] and j!=len(seq) and seq[i:j+1] not in fts[ftk]) or (seq[i:j] in fts[ftk] and j==len(seq)):                     res_seq = res_seq + ',' + ftk             if num != 0 and j!=len(seq):                 #print('num',num,'j',j)                 res_seq = res_seq + ' '                 num = 0                 break;     if mid != len(seq)-1:         res_seq = res_seq + seq[mid:]     return res_seq if __name__ == '__main__':          #feature = sys.stdin.readline().strip()     #sequence = sys.stdin.readline().strip()     feature = "singer_周杰|周杰伦|刘德华|王力宏;song_冰雨|北京欢迎你|七里香;actor_周杰伦|孙俪"     sequence = "请播放周杰伦的七里香给周杰伦周杰孙俪听周杰王力宏"     features = {}     feature = feature.split(';')     for ft in feature:         ft = ft.split('_')         features[ft[0]] = ft[1].split('|')     mxfl, mnfl = max_min_ftv_length(features)     result = max_length_fit(features, sequence, mxfl, mnfl)     print(result)
点赞 评论

相关推荐

牛客网
牛客企业服务