#python #pandas #module #sentiment-analysis #vader
Вопрос:
Давайте предположим, что я хотел бы набрать text
очки с помощью словаря под названием dictionary
:
text = "I would like to reduce carbon emissions"
dictionary = pd.DataFrame({'text': ["like","reduce","carbon","emissions","reduce carbon emissions"],'score': [1,-1,-1,-1,1]})
Я хотел бы написать функцию, которая суммирует каждый термин в dictionary
том, что есть text
. Однако в таком правиле должен быть нюанс: приоритет нграмм над униграммами.
Конкретно, если я суммирую униграммы в dictionary
том , что есть text
, я получу: 1 (-1) (-1) (-1)=-2
с тех пор like =1, reduce=-1, carbon =-1,emissions=-1
. Это не то, чего я хочу. Функция должна сказать следующее:
- рассмотрим сначала ngrams (
reduce carbon emissions
в примере), если там набор ngrams не пуст, то приписайте ему соответствующее значение, в противном случае, если набор ngrams пуст, то рассмотрим unigrams; - если набор nграмм непуст, игнорируйте те отдельные слова (униграммы), которые находятся в выбранных nграммах (например, игнорируйте «сокращение», «углерод» и «выбросы», которые уже находятся в «сокращение выбросов углерода»).
Такая функция должна дать мне такой вывод: 2
с like =1
reduce carbon emissions = 1
.
Я довольно новичок в Python и застрял. Кто-нибудь может мне в этом помочь?
Спасибо!
Комментарии:
1. Зачем для этого использовать фрейм данных?
2. Неудачный ответ: Я уже неделю использую python для НЛП, поэтому я предполагаю использовать то, что я использовал бы в R.
Ответ №1:
Я бы отсортировал ключевые слова по длине, чтобы гарантировать, что re
они будут соответствовать нграммам до одного грамма:
import re
pat = '|'.join(sorted(dictionary.text, key=len, reverse=True))
found = re.findall(fr'b({pat})b', text)
Выход:
['like', 'reduce carbon emissions']
Чтобы получить ожидаемый результат:
scores = dictionary.set_index('text')['score']
scores.re_index(found).sum()
Комментарии:
1. Спасибо! Поправьте меня, если я ошибаюсь, но
re
, похоже, мое условие 2 также верно? Это означает, что он автоматически исключает униграммы, содержащиеся в выбранной ngram. Правильно?2. Да, шаблон ищется слева направо и жадный. Если он найдет более длинную подстроку, эта часть больше не будет искать.
3. не могли бы вы добавить строку кода, в которой добавляется оценка выбранных слов (1 1=2)? Это было бы здорово
4. @Rollo99 см. Обновленный ответ.