0

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

我正在使用spintax给定一组可选短语来生成大块文本。我spin在循环内部插入了一个范围从 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'])

对,所以这是我的代码的示例。L是一个列表,它采用生成的文本并且L2是一个 ID 列表(不打算解释该列表的内容,因为它是题外话)。因此,我的df2DataFrame 将如下所示:

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

所以此时,每个 Id 都有 10 个文本字符串。我需要把这些降到 1,我的问题就从这里开始了。我想确保这些文本字符串在某种程度上都彼此不同。从每个 Id 的这 10 个字符串中,我需要选择 1 个与其他 Id 的字符串不同的字符串。

希望这有点道理...

总结一下,如果你在途中迷路了:有没有办法比较字符串之间的相似度?一种比较文本字符串并选择所有字符串中最不同的字符串的方法?

4

1 回答 1

1

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

为了找到最不相似的Text,我们可以使用TF-IDF将每个编码Text为一个数字向量。然后我们找到euclidean distance每组中每对行之间的距离,并对每行的距离求和,并假设最大均值是最不相似的。最后,我们获取每组 中均值最大的索引Id's

数据:

| 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 |
于 2019-10-01T14:59:40.410 回答