Что вызывает проблему: csv, pandas или nltk?

#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)]»