Python Pandas-сравнить текст столбца и обеспечить совпадающее количество слов


Я пытаюсь разработать инструмент сравнения строк. У меня есть два набора данных json, как показано ниже.

DF 1:

ID  Subject
1   Angular JS : getting unexpected cross symbol with Image
2   Cordova debug: the specified file was not found
3   get custom mask for phone numbers
4   Remove files for the Xcode Bots Unit Test Coverage
5   "Upload to Mongodb collection in aldeed:autoform
6   Mask for phone numbers

DF 2:

ID  Subject
1   Please provide custom mask for phone numbers
2   Files for the Xcode Bots Unit Test Coverage need to be removed
3   Upload to Mongodb collection

Теперь, с python + pandas, для каждого идентификатора таблицы 2, я хочу найти запись в строке таблицы 1, которая соответствует близко, последовательность слов не имеет значения, нужно исключить специальные символы из сравнения.

Например:

For ID 1 - ID 2 has 5 matching words
For ID 1 - ID 6 has 4 matching words
For ID 2 - ID 4 has 8 matching words
For ID 3 - ID 4 has 4 matching words

Какие-нибудь указатели?

1 2

1 ответ:

Я думаю, что вы можете объединить предыдущее Решение и регулярное выражение С merge, groupby по ID1 и ID2 с аггегацией size:

Другим возможным решением является использование:

.replace(r'[\-\!\@\#\$\%\^\&\*\(\)\_\+\[\]\;\'\.\,\/\{\}\:\"\<\>\?\|]','')
df1 = df1.set_index('ID')
df2 = df2.set_index('ID')

df3 = (df1['Subject'].str
                     .replace(r'[^a-zA-Z\s]' , '')
                     .str
                     .lower()
                     .str
                     .split('\s+', expand=True)
                     .stack()
                     .reset_index(drop=True, level=1)
                     .reset_index(name='val'))

df4 = (df2['Subject'].str
                     .replace(r'[^a-zA-Z\s]' , '')
                     .str
                     .lower()
                     .str
                     .split('\s+', expand=True)
                     .stack()
                     .reset_index(drop=True, level=1)
                     .reset_index(name='val'))
df5 = (pd.merge(df3, df4, on='val', suffixes=('1','2')))
print (df5)
    ID1         val  ID2
0     2         the    2
1     4         the    2
2     3      custom    1
3     3        mask    1
4     6        mask    1
5     3         for    1
6     3         for    2
7     4         for    1
8     4         for    2
9     6         for    1
10    6         for    2
11    3       phone    1
12    6       phone    1
13    3     numbers    1
14    6     numbers    1
15    4       files    2
16    4       xcode    2
17    4        bots    2
18    4        unit    2
19    4        test    2
20    4    coverage    2
21    5      upload    3
22    5          to    2
23    5          to    3
24    5     mongodb    3
25    5  collection    3
print (df5.groupby(['ID1','ID2']).size().reset_index(name='c'))
   ID1  ID2  c
0    2    2  1
1    3    1  5
2    3    2  1
3    4    1  1
4    4    2  8
5    5    2  1
6    5    3  4
7    6    1  4
8    6    2  1