我试图在一个句子列表中找到最长的常用单词序列(超过两个句子)。
示例:
list = ['commercial van for movers', 'partial van for movers', 'commercial van for moving' ]
sents = pd.Series(list)
在this answer中,解决方案工作正常,但它捕获了部分单词并返回以下内容:
'ial van for mov'
输出应为
'van for'
我无法找到修改它以返回所需输出的方法
答案 0 :(得分:3)
关键是要修改为按全字子序列搜索。
routes
演示:
from itertools import islice
def is_sublist(source, target):
slen = len(source)
return any(all(item1 == item2 for (item1, item2) in zip(source, islice(target, i, i+slen))) for i in range(len(target) - slen + 1))
def long_substr_by_word(data):
subseq = []
data_seqs = [s.split(' ') for s in data]
if len(data_seqs) > 1 and len(data_seqs[0]) > 0:
for i in range(len(data_seqs[0])):
for j in range(len(data_seqs[0])-i+1):
if j > len(subseq) and all(is_sublist(data_seqs[0][i:i+j], x) for x in data_seqs):
subseq = data_seqs[0][i:i+j]
return ' '.join(subseq)
答案 1 :(得分:0)
您可以创建第一个句子的所有子序列的有序powerset,然后在其他句子中搜索每个字符串,删除未找到的子字符串。
最后,您选择具有大多数空格的候选子字符串,如果出现平局,请选择最长的子字符串。
from itertools import combinations
mylist = ['commercial van for movers',
'partial van for movers',
'commercial van for moving' ]
s0 = mylist[0].split()
candidates = [' '.join(s0[slice(*c)]) for c in combinations(list(range(len(s0)+1)), 2)]
for s in mylist:
for i,c in reversed(list(enumerate(candidates.copy()))):
if not c in s:
candidates.pop(i)
max(candidates, key=lambda x: (x.count(' '), len(x)))
# returns:
'van for'