Выбор строк, которые больше всего отличаются друг от друга в Python - PullRequest
0 голосов
/ 01 октября 2019

Хорошо, поэтому этот вопрос может быть немного странным, поэтому сначала позвольте мне дать вам краткий обзор.

Я использую 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 - это список идентификаторов (не собираюсь объяснять, что с этим списком, поскольку он не по теме). Поэтому мой df2 DataFrame будет выглядеть следующим образом:

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

Итак, на данный момент для каждого идентификатора есть 10 текстовых строк. Мне нужно свести их к 1, и здесь мои проблемы начинаются. Я хочу убедиться, что все эти текстовые строки в некоторой степени отличаются друг от друга. Из этих 10 строк на Id мне нужно будет выбрать 1, который будет отличаться от строк других Id.

Надеюсь, это имеет смысл ...

Как итог, если вы заблудились в пути: есть ли способ сравнить сходство между строками? Как сравнить текстовые строки и выбрать строку, которая наиболее отличается от всех?

1 Ответ

1 голос
/ 01 октября 2019

В приведенных ниже данных Text в Index 0 & 2 и Text в Index 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 |

In:

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']]

Out:

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