Python 两个以上字符串中最长的常用单词序列

Python 两个以上字符串中最长的常用单词序列,python,string,Python,String,我试图在一系列句子(超过两个句子)中找到最长的常用单词序列 例如: list = ['commercial van for movers', 'partial van for movers', 'commercial van for moving' ] sents = pd.Series(list) 在中,解决方案工作正常,但它捕获部分单词并返回以下内容: 'ial van for mov' 输出应该是 'van for' 我找不到修改它以返回所需输出的方法关键是修改以按整个单词子序列搜索

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

例如:

list = ['commercial van for movers', 'partial van for movers', 'commercial van for moving' ]
sents = pd.Series(list)
在中,解决方案工作正常,但它捕获部分单词并返回以下内容:

'ial van for mov'
输出应该是

'van for'

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

关键是修改以按整个单词子序列搜索

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)
演示:


您可以创建第一个句子的所有子序列的有序幂集,然后搜索其他句子中的每个字符串,删除未找到的子字符串

最后,选择空格最多的候选子字符串,如果出现平局,则选择最长的子字符串

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'

尝试将每个字符串拆分为单词列表,然后使用您需要的解决方案provided@bunji这不太容易。解决方案使用中的
来测试子字符串,但不能使用
中的
来测试子列表。您必须确定现在最长的值:最大字数或最长子链?仅连接子字符串不起作用。您仍然可以找到部分单词。感谢您的更正,我删除了我的答案,因为您的答案已被接受:)您可以修改此选项以返回可能不在所有输入字符串中的最长整词序列吗?我在这里发布了一个问题:在修复您的导入(
组合
,而不是
组合
)后,我从该代码中获得了
'
的结果。
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'