Поиск нескольких слов в предложении в Dataframe и преобразование в сумму баллов - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть следующий фрейм данных:

    Sentence
0   Cat is a big lion
1   Dogs are descendants of wolf
2   Elephants are pachyderm
3   Pachyderm animals include rhino, Elephants and hippopotamus

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

Name          Score
cat             1
dog             2
wolf            2
lion            3
elephants       5
rhino           4
hippopotamus    5

Например, для строки 0 счет будет 1 (кошка) + 3 (лев) = 4

Я хочу создать вывод, который выглядит следующим образом.

    Sentence                                                      Value
0   Cat is a big lion                                                4
1   Dogs are descendants of wolf                                     4
2   Elephants are pachyderm                                          5
3   Pachyderm animals include rhino, Elephants and hippopotamus      14

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

nltk

Возможно, вам потребуется загрузить материал

import nltk

nltk.download('punkt')

Затем настройте основание и токенизацию

from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize

ps = PorterStemmer()

Создать удобный словарь

m = dict(zip(map(ps.stem, scores.Name), scores.Score))

И генерировать баллы

def f(s):
  return sum(filter(None, map(m.get, map(ps.stem, word_tokenize(s)))))

df.assign(Score=[*map(f, df.Sentence)])

                                            Sentence  Score
0                                  Cat is a big lion      4
1                       Dogs are descendants of wolf      4
2                            Elephants are pachyderm      5
3  Pachyderm animals include rhino, Elephants and...     14
0 голосов
/ 10 сентября 2018

Попытка использования findall с re re.I

df.Sentence.str.findall(df1.Name.str.cat(sep='|'),flags=re.I).\
   map(lambda x : sum([df1.loc[df1.Name==str.lower(y),'Score' ].values for y in x])[0])
Out[49]: 
0     4
1     4
2     5
3    14
Name: Sentence, dtype: int64
0 голосов
/ 10 сентября 2018

В качестве первого усилия вы можете попробовать подход на основе split и map, а затем вычислить оценку, используя groupby.

v = df1['Sentence'].str.split(r'[\s.!?,]+', expand=True).stack().str.lower()
df1['Value'] = (
    v.map(df2.set_index('Name')['Score'])
     .sum(level=0)
     .fillna(0, downcast='infer'))

df1
                                            Sentence  Value
0                                  Cat is a big lion      4
1                       Dogs are descendants of wolf      4  # s/dog/dogs in df2  
2                            Elephants are pachyderm      5
3  Pachyderm animals include rhino, Elephants and...     14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...