Вопросы

Как подсчитать конкретные термины в токенизированных предложениях с помощью pandas df

Я новичок в Python и nltk, поэтому был бы очень признателен за ваш вклад в решение следующей проблемы.

Цель:

Я хочу найти и подсчитать появление определенной терминологии в токенизированных предложениях, которые хранятся в pandas DataFrame. Термины, которые я ищу, хранятся в списке строк. Вывод следует сохранить в новом столбце.

Поскольку слова, которые я ищу, имеют грамматические наклонения (например, кошки вместо кошки), мне нужно решение, которое не только отображает точные совпадения. Я предполагаю, что выделение данных и поиск определенных основ было бы правильным подходом, но давайте предположим, что это не вариант, поскольку у нас все равно будут семантические совпадения.

Что я пробовал на данный момент:

Для дальнейшей обработки данных я предварительно обработал данные, выполнив следующие действия:

  1. Поместите все в нижний регистр
  2. Удалить знаки препинания
  3. Токенизация
  4. Удалить стоп-слова

Я попытался найти отдельные термины с помощью str.count('cat'), но это не помогло, и данные были помечены как отсутствующие с помощью NaN. Кроме того, я не знаю, как эффективно перебирать список слов для поиска при использовании pandas.

Мой код на данный момент:

import numpy as np
import pandas as pd
import re
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords

# Function to remove punctuation
def remove_punctuation(text):
    return re.sub(r'[^\w\s]','',text)


# Target data where strings should be searched and counted
data = {'txt_body': ['Ab likes dogs.', 'Bc likes cats.',
                     'De likes cats and dogs.', 'Fg likes cats, dogs and cows.',
                     'Hi has two grey cats, a brown cat and two dogs.']}


df = pd.DataFrame(data=data)

# Search words stored in a list of strings
search_words = ['dog', 'cat', 'cow']

# Store stopwords from nltk.corpus
stop_words = set(stopwords.words('english'))

# Data preprocessing
df['txt_body'] = df['txt_body'].apply(lambda x: x.lower())
df['txt_body'] = df['txt_body'].apply(remove_punctuation)
df['txt_body'] = df['txt_body'].fillna("").map(word_tokenize)
df['txt_body'] = df['txt_body'].apply(lambda x: [word for word in x if word not in stop_words])

# Here is the problem space
df['search_count'] = df['txt_body'].str.count('cat')



print(df.head())

Ожидаемый результат:

                                       txt_body  search_count
0                             [ab, likes, dogs]             1
1                             [bc, likes, cats]             1
2                       [de, likes, cats, dogs]             2
3                 [fg, likes, cats, dogs, cows]             3
4  [hi, two, grey, cats, brown, cat, two, dogs]             3

Хотите считать префиксы? В противном случае вам придется лемматизировать или выполнять некоторую обработку токенов …   —  person cru-436    schedule 15.12.2020

Читать:
Как проверить конкретную версию Subversion из командной строки?

Привет! Да, было бы хорошо считать только части самого слова. Лемматизация — это небольшая проблема, поскольку я ищу решение, которое также можно было бы применить с неанглийским набором данных. Но стемминг не должен быть проблемой … Что бы вы посоветовали?   —  person cru-436    schedule 15.12.2020

Похожие записи

Произошла незаконная операция доступа с отражением

admin

Как настроить клиент DynamoDB на AWS (JAVA)

admin

html не имеет новой строки с pugjs

admin

Доступ к значению оператора воздушного потока вне оператора

admin

Как изменить цвет строки состояния по умолчанию при переопределении стиля пользовательского интерфейса системы в Swift

admin