两个以上字符串中最长的公共单词序列

2024-04-29 06:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个句子列表中找到最长的单词序列(超过两个句子)。在

示例:

list = ['commercial van for movers', 'partial van for movers', 'commercial van for moving' ]
sents = pd.Series(list)

this answer中,解决方案工作正常,但它捕获部分单词并返回以下结果:

^{pr2}$

输出应该是

'van for'

我找不到修改它以返回所需输出的方法


Tags: 示例列表for序列单词vanpartiallist
2条回答

关键是修改为按整词子序列搜索。在

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)

演示:

^{pr2}$

您可以为第一个句子的所有子序列创建一个有序的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'

相关问题 更多 >