Создание функции для подсчета количества позиций в экземпляре pandas

Я использовал NLTK для размещения предложений pos_tag в кадре данных pandas из старого конкурса Yelp. Это возвращает список кортежей (слово, POS). Я хотел бы подсчитать количество частей речи для каждого экземпляра. Как бы я, скажем, создал функцию для подсчета количества глаголов в каждом отзыве? Я знаю, как применять функции к фичам — тут нет проблем. Я просто не могу понять, как считать вещи внутри кортежей внутри списков внутри функции pd.

The head is here, as a tsv: https://pastebin.com/FnnBq9rf

person itsbrycehere    schedule 22.02.2018    source источник


Ответы (3)


Спасибо @zhangyulin за вашу помощь. Через два дня я узнал невероятно важные вещи (как начинающий программист!). Вот решение!

def NounCounter(x):
   nouns = []
   for (word, pos) in x:
        if pos.startswith("NN"):
            nouns.append(word)
    return nouns

df["nouns"] = df["pos_tag"].apply(NounCounter)
df["noun_count"] = df["nouns"].str.len()
person itsbrycehere    schedule 24.02.2018

Например, для dataframe df количество существительных в обзорах столбцов можно сохранить в новый столбец noun_count, используя этот код.

def NounCount(x):
    nounCount = sum(1 for word, pos in pos_tag(word_tokenize(x)) if pos.startswith('NN'))
    return nounCount

df["noun_count"] = df["reviews"].apply(NounCount)

df.to_csv('./dataset.csv')
person Isurie    schedule 16.01.2021

Есть несколько способов сделать это, и один очень простой способ - сопоставить список (или ряд панд) кортежей с индикатором того, является ли слово глаголом, и подсчитать количество единиц, которые у вас есть.

Предположим, у вас есть что-то вроде этого (пожалуйста, поправьте меня, если это не так, поскольку вы не привели пример):

a = pd.Series([("run", "verb"), ("apple", "noun"), ("play", "verb")])

Вы можете сделать что-то подобное, чтобы отобразить серию и суммировать количество:

a.map(lambda x: 1 if x[1]== "verb" else 0).sum()

Это вернет вам 2.


Я взял предложение из ссылки, которой вы поделились:

text = nltk.word_tokenize("My wife took me here on my birthday for breakfast and it was excellent.")
tag = nltk.pos_tag(text)
a = pd.Series(tag)
a.map(lambda x: 1 if x[1]== "VBD" else 0).sum()
# this returns 2
person TYZ    schedule 22.02.2018
comment
Я был близок к этому, но это дало мне ту же ошибку, что и сейчас: индекс списка вне диапазона. Вот код, который я использую df["noun_count"] = df["pos_tag"].map(lambda x: 1 if x[1] == "NN" or "NNP" or "NNS" else 0).sum() - person itsbrycehere; 22.02.2018
comment
@itsbrycehere Если вы можете опубликовать данные, с которыми вы работаете, это поможет мне определить проблему. - person TYZ; 22.02.2018
comment
Спасибо за помощь Yilun, это выше в [ссылка] (pastebin.com/FnnBq9rf) - person itsbrycehere; 22.02.2018
comment
@itsbrycehere У меня не было этой ошибки, можете ли вы обновить свой вопрос и показать мне свои df["pos_tag"], всего несколько из них? Каждая строка должна быть кортежем с двумя элементами. - person TYZ; 23.02.2018
comment
Это цв главы df[pos_tag] pastebin.com/NwShUvha - person itsbrycehere; 23.02.2018
comment
Я думаю, что я пытаюсь сделать что-то вроде этого, но для ячеек в кадре данных. stackoverflow .com/questions/33587667/ - person itsbrycehere; 23.02.2018