найти предложение среди предложений из слов

#python #pandas #dataframe #named-entity-recognition

#python #панды #фрейм данных #распознавание именованных объектов

Вопрос:

У меня есть два фрейма данных Pandas. Тот, где все предложения разделены словами по вертикали и выглядят следующим образом

 Sentence | Text   
1            I
1          like
1          Cats
2          The
2          man
2         plays
2         soccer
2         today
  

И другой фрейм данных выглядит следующим образом:

 ID      | Text         | Tags
1         plays soccer   sport
2          man           human
3         like cats     interest
  

Что я хотел бы, так это сопоставить теги с первым фреймом данных для слов в предложении, которые соответствуют обоим местам, а те, которые не совпадают, получают «O», чтобы символизировать это.

 Sentence | Text        | Tags 
1          I             O
1          like          interest
1          Cats          interest
2          The           O
2          man           human
2          plays         sport
2          soccer        sport
2          today         O
  

Ответ №1:

Предположим, что df1 это ваша первая таблица, а df2 это ваша вторая (где ID — индекс), тогда вы можете:

  • Разнесите свою вторую таблицу ( str.split() explode() )
  • merge() с левым соединением
  • fillna() NaN с O

Например.:

 In []:
df1.merge(df2.assign(Text=df2.Text.str.split()).explode('Text'), 'left').fillna('O')

Out[]:
   Sentence    Text      Tags
0         1       I         O
1         1    like  interest
2         1    Cats         O
3         2     The         O
4         2     man     human
5         2   plays     sport
6         2  soccer     sport
7         2   today         O
  

В настоящее время это чувствительно к регистру, но это простое упражнение для объединения в столбце, который является str.lower() of Text .

Комментарии:

1. Спасибо за ваш комментарий. Однако, если у меня есть одно и то же слово в предложении, скажем, «человек». Первый тег — human, но в другом теге это может быть sapiens. Есть ли у вас какие-либо предложения о том, как следует относиться к этой двусмысленности? Не могли бы вы сохранить тот, где тег используется чаще всего? Если да, можете ли вы предложить, как написать этот код?