#python #pandas #csv #nltk
#python #pandas #csv #nltk
Вопрос:
У меня странная проблема, приводящая к неправильному выводу, предоставляемому словосочетаниями NLTK. Короче говоря, когда я передаю объект pandas, созданный в python envi (PyCharm или Jupyter), в функцию, я получаю правильный результат. Когда я сохраняю этот объект в csv и загружаю его в объект pandas, функции возвращают отдельные буквы и / или цифры вместо полных слов. Должно быть, что-то не так с загрузкой csv через pandas, но я понятия не имею, что не так…
вот код.
Функция, которая применяется:
def counts(x):
trigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_documents(x)
finder.nbest(trigram_measures.pmi, 100)
s = pd.Series(x)
ngram_list = [pair for row in s for pair in ngrams(row, 3)]
c = Counter(ngram_list).most_common(3)
return pd.DataFrame([(x.name, ) element for element in c], columns=['group', 'Ngram', 'Frequency'])
Вот объект:
d = {'words' : pd.Series((['coffee', 'maker', 'brewing', 'properly', '2', '420', '420', '420'],
['galley', 'work', 'table', 'stuck'],
['cloth', 'stuck'],
['stuck', 'coffee'])),
'group' : pd.Series([1, 2, 1, 2])}
df_cleaned = pd.DataFrame(d)
Затем я применяю функцию сверху некоторые дополнительные функции:
output = df_cleaned.groupby('group', as_index=False).words.apply(counts).reset_index(drop=True)
Результат правильный:
Но когда объект pandas сохраняется и загружается, результат выглядит примерно так:
вот код для сохранения и загрузки:
df.to_csv('test_file.csv', index=False, sep=',')
df = pd.read_csv('path/test_file.csv',
sep=',', usecols=['group','words'])
Я обнаружил кавычки в загруженном объекте pandas, поэтому я удалил их перед применением функции»
df = df.replace({''': ''}, regex=True)
output = df_cleaned.groupby('group', as_index=False).words.apply(counts).reset_index(drop=True)
Теперь он возвращает неправильные результаты.
Есть ли какие-либо предложения, в какую сторону мне пойти?
Ответ №1:
Я воспроизвел то, что вы описали в следующих шагах. Я не вижу никаких ошибок
import pandas as pd
d = {'words' : pd.Series((['coffee', 'maker', 'brewing', 'properly', '2','420', '420', '420'],
['galley', 'work', 'table', 'stuck'],
['cloth', 'stuck'],
['stuck', 'coffee'])),
'group' : pd.Series([1, 2, 1, 2])}
df_cleaned = pd.DataFrame(d)
df_cleaned
Используемая вами функция является
import nltk
from nltk.util import ngrams
from nltk.collocations import *
from collections import Counter
def counts(x):
trigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_documents(x)
finder.nbest(trigram_measures.pmi, 100)
s = pd.Series(x)
ngram_list = [pair for row in s for pair in ngrams(row, 3)]
c = Counter(ngram_list).most_common(3)
return pd.DataFrame([(x.name, ) element for element in c], columns=['group', 'Ngram', 'Frequency'])
Затем вы применяете counts
к данным
output = df_cleaned.groupby('group',
as_index=False).words.apply(counts).reset_index(drop=True)
и сохраните результаты в файл
output.to_csv('test_file.csv', index=False, sep=',')
df = pd.read_csv('test_file.csv',sep=',')
Я не вижу никаких проблем
Комментарии:
1. Бен, проблема начинается при попытке применить функцию к загруженным данным (‘test_file.csv как df). В моей среде этот код завершается с ошибкой >>>output = df_cleaned.groupby(‘group’, as_index =False). words.apply(подсчитывает).reset_index(drop=True)<<< для df, загруженного из csv.
2. Из вашего комментария я не могу понять, что не удается. Возможно, вы могли бы перефразировать свой вопрос и примеры кода, чтобы прояснить, с чем вы столкнулись? Если у вас есть записная книжка, которая воспроизводит проблему, это было бы полезно.
3. Я нашел решение. Проблема была сгенерирована чтением csv. Он теряет кортеж из исходной базы данных и возвращает массив list списков. Я изменил код, добавив ‘word_tokenize’ к команде: ‘…ngrams(word_tokenize(строка), 3)’. Я не совсем понимаю, почему это работает так, как работает, но проблема исчезла. Спасибо, что уделили мне время.
4. Проблема возникнет, когда вы примените этот код к df: output = df.groupby(‘group’, as_index=False). words.apply(количество).reset_index(drop=True) Это исчезает, когда функция ngram модифицируется путем добавления ‘word_tokenize’ и выглядит следующим образом: ‘ngram_list = [пара для строки в s для пары в ngrams (word_tokenize(строка), 3)]»