Как создать функцию, которая оценивает nграммы перед униграммами в Python?

#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 . Это не то, чего я хочу. Функция должна сказать следующее:

  1. рассмотрим сначала ngrams ( reduce carbon emissions в примере), если там набор ngrams не пуст, то приписайте ему соответствующее значение, в противном случае, если набор ngrams пуст, то рассмотрим unigrams;
  2. если набор 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 см. Обновленный ответ.