在Python中选择彼此差异最大的字符串

在Python中选择彼此差异最大的字符串,python,pandas,spintax,Python,Pandas,Spintax,好吧,这个问题可能有点奇怪,首先让我给你一个简短的背景 我正在使用,以便在给定一组可选短语的情况下生成大块文本。我在一个范围从0到10的循环中插入旋转,因此它创建了多个字符串,每个字符串都是不同的 for i in range(0, 10): L.append(spintax.spin( " ----<h1>{" +Title+ " - {køb online|sammenlign {priser|online supermarkederne}} v

好吧,这个问题可能有点奇怪,首先让我给你一个简短的背景

我正在使用,以便在给定一组可选短语的情况下生成大块文本。我在一个范围从0到10的循环中插入旋转,因此它创建了多个字符串,每个字符串都是不同的

for i in range(0, 10):
   L.append(spintax.spin(            
  " ----<h1>{" +Title+ " - {køb online|sammenlign {priser|online supermarkederne}} via x.dk|Få din "+y+ "\
  leveret til døren og spar penge via x.dk|Køb din "+y+ " online og spar penge  via x.dk }\
  \n  \
  ----<h2>{{Få adgang til|vælg fra} {et stort|Danmarks største} {udvalg} af} " +y+ "<h2>\
  \n  \
  {Når|Hvis} du {besøger|handler ind gennem|benytter|køber ind via|køber dine varer via}\
  x.dk, {er det {vigtigt|væsentligt} at forstå|skal du huske|skal du vide}"))

  L2.append(df['ID'][index])
df2 = pd.DataFrame(np.column_stack([L, L2]), columns=['Text' ,'ID'])
现在,每个Id有10个文本字符串。我需要把它们降到1,我的问题开始了。我想确保这些文本字符串在某种程度上彼此不同。从每个Id的这10个字符串中,我需要选择1个与其他Id的字符串不同的字符串

希望这有点道理

作为总结,如果您在途中迷路了:有没有办法比较字符串之间的相似性?比较文本字符串并选择其中差异最大的字符串的方法?

在下面的数据中,索引0和2中的文本以及索引4和5中的文本在每个唯一Id中最为相似,因为它们包含彼此的文本。因此,每个Id中最不相似的是索引1和索引3

为了找到最不相似的文本,我们可以使用TF-IDF将每个文本编码为数字向量。然后,我们找到每组中每对行之间的欧几里德距离,将每行的距离相加,并假设最大平均值是最不相似的。最后,我们获取每组Id的最大平均值的索引

数据:

在:

输出:


所以这取决于你对最不同的定义。A和Z的区别比B大吗?或者你希望它是基于哪个词在其他词中没有的词最多?这也是解决问题的根本。您可以使用它,但由于您处理的是大量数据,因此这将成为一个优化问题,这可能很棘手。@MyNameIsCaleb是第一个选项。单词相似度应该很低,所以看起来不像是同一件事了。@0x5453我会研究一下,谢谢!不过,数据并没有那么大——该表大约有500行。另一方面,文本栏的内容非常大。哇,这个解决方案非常棒。非常非常感谢!
Index            Text                                 Id
0            <h1>Få din Mælk & Fløde leveret til      4169
             døren og spar penge via...
1            <h1>Mælk & Fløde - køb online via x.dk   4169
              ....
12           <h1>Få din Yoghurt leveret til døren     4178
             og spar penge via 
              ....
| Index | Text                                                       | Id   |
|-------|------------------------------------------------------------|------|
| 0     | Få din Mælk & Fløde leveret til døren og spar penge via... | 4169 |
| 1     | Mælk & Fløde - køb online via x.dk                         | 4169 |
| 2     | Fløde leveret til døren og spar penge via...               | 4169 |
| 3     | Få din Mælk & Fløde leveret til døren og spar penge via... | 4170 |
| 4     | Mælk & Fløde - køb online via x.dk                         | 4170 |
| 5     | køb online via x.dk                                        | 4170 |
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.spatial.distance import cdist

df = pd.read_clipboard()
df.columns = df.columns.str.strip()

v = TfidfVectorizer()
X = v.fit_transform(df['Text'])

df = df.join(pd.DataFrame(X.toarray()))

group = df.groupby('Id', as_index=False)

df = group.apply(lambda x : x.iloc[cdist(x.iloc[:,3:].values, x.iloc[:,3:].values).mean(axis=0).argmax()])

df[['Index', 'Text', 'Id']]
|   | Index | Text                                                       | Id   |
|---|-------|------------------------------------------------------------|------|
| 0 | 1     | Mælk & Fløde - køb online via x.dk                         | 4169 |
| 1 | 3     | Få din Mælk & Fløde leveret til døren og spar penge via... | 4170 |