Python 比较多个字符串以查找';平均值'/最常用字符串 问题是:
我试图在许多字符串上找到一个常见的(最常见的,甚至是“平均”)短语。不同字符串之间的结构非常糟糕,并且充满了不一致性。许多字符串都添加了与所需输出无关的唯一位:一个新字符串,其作用类似于字符串集的某种摘要 为了说明这一点,我提供了一个小示例,实际数据更复杂,由更多字符串组成: 示例数据:Python 比较多个字符串以查找';平均值'/最常用字符串 问题是:,python,string,Python,String,我试图在许多字符串上找到一个常见的(最常见的,甚至是“平均”)短语。不同字符串之间的结构非常糟糕,并且充满了不一致性。许多字符串都添加了与所需输出无关的唯一位:一个新字符串,其作用类似于字符串集的某种摘要 为了说明这一点,我提供了一个小示例,实际数据更复杂,由更多字符串组成: 示例数据: 1. Small house, red roof, 2 windows, no garden 2. Big house, red roof, 2 windows, garage with driveway 3.
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=“”
对于范围(3)中的i:
summary+=f“{words['index'][i]}”
在这个更简单的数据集上,只需选取n个最常见的短语,就可以得到有用的摘要
看看类似的问题(例如或),它们之间有很多相似之处。“公共短语”存在于所有提供的字符串中,或者为单词出现设置了阈值。这里的情况都不是这样
我尝试的另一件事是使用交叉点:
短语=[]
对于df中的短语[‘短语’]:
短语.append(短语.split())
def intersect(列表1、列表2):
返回列表(集合(列表1)和集合(列表2))
打印(相交(短语[0],短语[1])
然后使用示例数据打印:
house red roof 2 windows
交叉点和两个以上列表的一个问题是,对于每个额外的列表/字符串,它只会删除越来越多的内容。如果短语中的差异足够大,则很快就会在所有短语中出现一个空交叉点
挑战:
- 不保证所有字符串中都有一个通用短语
- 短语不能保证顺序一致
- 摘要字符串长度不固定
- 单词经常(但不总是)以小组形式出现:例如大/小房子
另一个想法是实现某种形式的近似字符串匹配,但这似乎只在一种方式下起作用:表示两个字符串之间的相似性。因此,它不会提供与所有给定字符串具有最高相似性的新字符串。这不是一个完整的答案,但可能会给您一些想法
[“小房子”、“大房子”、“小房子”]、[“红屋顶”、“红屋顶”、“红屋顶”]、…]
处理该列表,然后获取每个子列表中的模式元素(例如,如果它与至少30%的输入精确匹配,则忽略子列表或将其进一步分解,例如,分解为单词并查找最常见的单词)这不是一个完整的答案,但可能会给你一些想法
[“小房子”、“大房子”、“小房子”]、[“红屋顶”、“红屋顶”、“红屋顶”]、…]
处理该列表,然后获取每个子列表中的模式元素(例如,如果它与至少30%的输入精确匹配,则忽略子列表或将其进一步分解,例如,分解为单词并查找最常见的单词)您是否考虑过使用
NLP
和词干分析来减少使用bigrams
时出现的唯一字符?也可以尝试使用LDA
建模。@KartikeySingh我目前正在尽可能多地清理文本,遗憾的是,到目前为止它提供的改进很少。您是否考虑过使用NLP
和词干分析
,以减少使用bigrams
时出现的唯一字符?还可以尝试研究LDA
建模。@KartikeySingh我目前正在尽可能多地清理文本,遗憾的是,到目前为止它提供的改进很少。我同意第一点,但如果数据没有结构化,最好创建一个da我同意第一点,但如果数据不是结构化的,最好创建一个逗号分隔数据的文档数据集,并在其上使用bigram。