比较多个字符串以查找“平均” /最常见的字符串

时间:2019-04-04 09:21:36

标签: python string

问题:

我正在尝试在多个字符串中找到一个常见(最常见,甚至是“平均”)短语。各个字符串的结构非常糟糕,并且充满了不一致。许多字符串都添加了与所需输出无关的唯一位:一种新字符串,其作用类似于该组字符串的摘要。

为证明我已经提供了一个小示例,实际数据更加复杂,并且由更多字符串组成:

示例数据:

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 wordsFind 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

交集和两个以上列表的问题是,对于每个额外的列表/字符串,它只会删除越来越多的列表/字符串。如果词组中只有足够的差异,您很快就会在所有词组之间出现一个空的交集。

挑战:

  • 不能保证所有字符串中都有一个通用短语。
  • 不保证短语顺序一致。
  • 总字符串长度未固定。
  • 单词经常(但不总是)成组出现:例如大/小房子

可能的解决方案:

我想尝试但不知道如何正确解决的一件事是使用设置为百分比的字数统计,这样可以消除一定数量的单词出现阈值,但仍然需要未知的百分比阈值。单词对/组也将不包含在内。因此,这将更易于扩展,但可能不是适当的解决方案。

另一种想法是实现某种形式的近似字符串匹配,但这似乎只能以一种方式起作用:表达两个字符串之间的相似性。因此,它不会提供与所有给定字符串具有最高相似性的新字符串。

1 个答案:

答案 0 :(得分:0)

这不是一个完整的答案,但可能会给您一些想法。

  1. 将字符串拆分为逗号分隔的字符串列表是看给定示例的显而易见的第一步
  2. 从那里开始,如果输入结构合理,则可以按索引在输入列表上进行压缩,即。在提供的示例中, [[“Small house", "big house", "small house"],["red roof", "red roof", "red roof"], ...] 然后在该列表上工作,然后在每个子列表中使用mode元素(例如,只要它精确匹配至少30%的输入,否则忽略该子列表或将其进一步分解为例如单词并寻找最常见的单词) )
  3. 如果输入缺少足够的结构,则可以考虑将每个标记化的输入列表与自然值一起压缩。这将为您提供一种在输入列表中表示“出现的时间早”的方式,从而可能会出现一些标记,从而对最终包含在输出中的标记(或其词)强加一个顺序。