Python: извлекать ключевые слова построчно из CSV - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь извлечь ключевые слова построчно из CSV-файла и создать поле ключевых слов.Прямо сейчас я могу получить полную добычу.Как получить ключевые слова для каждой строки / поля?

Данные:

id,some_text
1,"What is the meaning of the word Himalaya?"
2,"Palindrome is a word, phrase, or sequence that reads the same backward as forward"

Код: это поиск по всему тексту, но не по строкам.Нужно ли ставить что-то еще, кроме replace(r'\|', ' ')?

import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords

df = pd.read_csv('test-data.csv')
# print(df.head(5))

text_context = df['some_text'].str.lower().str.replace(r'\|', ' ').str.cat(sep=' ') # not put lower case?
print(text_context)
print('')
tokens=nltk.tokenize.word_tokenize(text_context)
word_dist = nltk.FreqDist(tokens)
stop_words = stopwords.words('english')
punctuations = ['(',')',';',':','[',']',',','!','?']
keywords = [word for word in tokens if not word in stop_words and not word in punctuations]
print(keywords)

конечный вывод:

id,some_text,new_keyword_field
1,What is the meaning of the word Himalaya?,"meaning,word,himalaya"
2,"Palindrome is a word, phrase, or sequence that reads the same backward as forward","palindrome,word,phrase,sequence,reads,backward,forward"

1 Ответ

0 голосов
/ 26 мая 2018

Вот простой способ добавить новый столбец ключевых слов в ваш фрейм данных с помощью pandas apply.Применить работает, сначала определив функцию (get_keywords в нашем случае), которую мы можем применить к каждой строке или столбцу.

import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords

# I define the stop_words here so I don't do it every time in the function below
stop_words = stopwords.words('english')
# I've added the index_col='id' here to set your 'id' column as the index. This assumes that the 'id' is unique.
df = pd.read_csv('test-data.csv', index_col='id')  

Здесь мы определяем нашу функцию, которая будет применяться ккаждая строка с помощью df.apply в следующей ячейке.Вы можете видеть, что эта функция get_keywords принимает row в качестве аргумента и возвращает строку ключевых слов, разделенных запятыми, как у вас в желаемом выводе выше («значение, слово, гималаи»).В этой функции мы опускаем, маркируем, отфильтровываем пунктуацию с помощью isalpha(), отфильтровываем наши stop_words и соединяем наши ключевые слова вместе, чтобы сформировать желаемый результат.

# This function will be applied to each row in our Pandas Dataframe
# See the docs for df.apply at: 
# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html
def get_keywords(row):
    some_text = row['some_text']
    lowered = some_text.lower()
    tokens = nltk.tokenize.word_tokenize(lowered)
    keywords = [keyword for keyword in tokens if keyword.isalpha() and not keyword in stop_words]
    keywords_string = ','.join(keywords)
    return keywords_string

Теперь, когда мы определили нашу функцию, которая будетприменяться мы называем df.apply(get_keywords, axis=1).Это вернет Pandas Series (аналогично списку).Поскольку мы хотим, чтобы этот ряд был частью нашего информационного кадра, мы добавляем его как новый столбец, используя df['keywords'] = df.apply(get_keywords, axis=1)

# applying the get_keywords function to our dataframe and saving the results
# as a new column in our dataframe called 'keywords'
# axis=1 means that we will apply get_keywords to each row and not each column
df['keywords'] = df.apply(get_keywords, axis=1)

Вывод: Кадр данных после добавления столбца ключевых слов

...