我正在尝试在多个字符串中找到一个常见(最常见,甚至是“平均”)短语。各个字符串的结构非常糟糕,并且充满了不一致。许多字符串都添加了与所需输出无关的唯一位:一种新字符串,其作用类似于该组字符串的摘要。
为证明我已经提供了一个小示例,实际数据更加复杂,并且由更多字符串组成:
示例数据:
1. Small house, red roof, 2 windows, no garden
2. Big house, red roof, 2 windows, garage with driveway
3. Small house, red roof, 2 windows, nice view
所需的输出应接近:
Small house, red roof, 2 windows
在结构更多的较小数据集上,我以前依靠字数统计:
words = df['Phrases'].str.split(expand=True).stack().value_counts()
words = words.reset_index()
summary = ""
for i in range(3):
summary += f"{words['index'][i]} "
在这个更简单的数据集上,只需采用n个最常用的词组即可得出有用的摘要。
看看类似的问题(例如New string from multiple strings with most common words或Find the most common String in ArrayList()),它们之间有很多相似之处。在所有提供的字符串中都存在“常用短语”,或者对于单词出现有设定的阈值。这两种情况都不是。
我尝试的另一件事是使用交叉点:
phrases = []
for phrase in df['Phrases']:
phrases.append(phrase.split())
def intersect(list1, list2):
return list(set(list1) & set(list2))
print (intersect(phrases[0], phrases[1])
使用示例数据,然后将其打印:
house red roof 2 windows
交集和两个以上列表的问题是,对于每个额外的列表/字符串,它只会删除越来越多的列表/字符串。如果词组中只有足够的差异,您很快就会在所有词组之间出现一个空的交集。
挑战:
我想尝试但不知道如何正确解决的一件事是使用设置为百分比的字数统计,这样可以消除一定数量的单词出现阈值,但仍然需要未知的百分比阈值。单词对/组也将不包含在内。因此,这将更易于扩展,但可能不是适当的解决方案。
另一种想法是实现某种形式的近似字符串匹配,但这似乎只能以一种方式起作用:表达两个字符串之间的相似性。因此,它不会提供与所有给定字符串具有最高相似性的新字符串。
答案 0 :(得分:0)
这不是一个完整的答案,但可能会给您一些想法。
[[“Small house", "big house", "small house"],["red roof", "red roof", "red roof"], ...]
然后在该列表上工作,然后在每个子列表中使用mode元素(例如,只要它精确匹配至少30%的输入,否则忽略该子列表或将其进一步分解为例如单词并寻找最常见的单词) )