当前位置: 首页 > 知识库问答 >
问题:

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

彭鸿畅
2023-03-14

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

为了说明这一点,我提供了一个小示例,实际数据更复杂,由更多字符串组成:

示例数据:

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个最常见的短语,就可以得到有用的摘要。

查看类似的问题(例如,从包含最常用单词的多个字符串中提取新字符串,或在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

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

挑战:

  • 不保证所有字符串中都有一个通用短语。

我想尝试但不知道如何正确处理的一件事是使用wordcounts设置为百分比,这将消除一个单词出现次数阈值,但仍然需要一个未知的百分比阈值。也不包含单词对/组。因此,这将更容易扩大规模,但可能不是一个合适的解决方案。

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

共有1个答案

任飞鸣
2023-03-14

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

  1. 将字符串拆分为逗号分隔的字符串列表显然是查看给定示例的第一步
 类似资料:
  • 问题内容: 我正在尝试 使用循环从两个不同的用户输入中打印常用字母。(我需要使用for循环来完成它。)我遇到了两个问题:1.我的语句“ If char not in output …”没有提取唯一值。2.输出为我提供了单个字母列表,而不是单个字符串。我尝试分割输出,但是分割遇到类型错误。 问题答案: 您正在尝试执行“设置相交”。Python有 相同的方法。您可以将其用于您的用例,例如: 将返回字符

  • 问题内容: 我有一个简单的疑问。如果有人帮助我,那就太好了。 我有两个字符串: 这两个值相等,但是如何在Java中比较它们呢?我们拥有并用于比较字符串alpha值,类似地,如何比较数字值。 问题答案: 这就对了。您可以使用方法将数字字符串转换为整数,该方法将返回类型。然后比较与相同。

  • 问题内容: 我想知道如何在一行中比较多个字符串。我尝试使用|| 但不适用于布尔值或字符串。这是我的代码是什么样的: 对于那些将其标记为重复的对象,我在此处检查了200多个关于堆栈溢出的问题,但没有一个起作用。@Chrylis发布的一个实际上没有帮助。他们只是在问==和.equals()的区别 问题答案: 首先,不要用于字符串。稍后您将了解原因。您想按字符串的内容而不是它们在内存中的位置比较字符串。

  • 首先,考虑这个例子: 我期望什么:因为“123”是一个< code>const char*,我期望这些字符串的地址(就像其中一个答案所说的)被比较。 …因为和将只比较这些字符串的基址。不是字符串本身的内容。 但输出仍然是。好吧,我们实际上不知道如何比较两个prvalue对象的地址(或者至少我不明白会怎么做)。所以让我们将这些字符串声明为变量,看看会发生什么: 输出仍然是 。所以字符串不会衰减吗?或

  • 查找字符串中出现最多的字符和个数? 如 sdsdsddssssssdd -> 字符最多的是s,出现9次 思路说明 利用python中的collections模块的Counter,查此函数详细内容.对字符串进行统计。 然后将结果转化为字典类型。 特别注意,在字符串中可能会出现数量并列第一的字符,因此要通过循环找出最大数之后,再通过循环找出最大数对应的字母(键)。 解答1(python) import

  • 问题内容: 我知道的结果是布尔值,因此无法进行比较,但是我们如何检查是否存在多个字符? 问题答案: 这不是您想要的。请使用堆栈语句: 或者,由于我是 正则表达式的狂热者 ,因此这是一种使用 正则表达式 的方法!:) 由于user2980077 ,此后修复的代码中有一个错误