Setelah cukup banyak berkomentar dengan OP, saya memutuskan akan lebih baik untuk merangkum saran saya di sini.
Masalah pertama adalah ada dua kesalahan ketik di data_count = df['test'].apply(pd.value_counts())
.
Baris itu seharusnya data_count = df['text'].apply(pd.value_counts)
.
df['test']
akan memunculkan KeyError
karena tidak ada kolom 'test'
di pandas.DataFrame
OP. Kesalahan ketik lainnya adalah pemanggilan pandas.value_counts
tanpa argumen ke pemanggil metode pandas.Series.apply
. Ini akan memunculkan TypeError
karena fakta bahwa fungsi pandas.value_counts
memerlukan setidaknya satu argumen. Namun hal ini mudah diperbaiki dengan menghapus pemanggil karena tujuan dari metode pandas.Series.apply
adalah agar metode tersebut memanggil fungsi agar kita menggunakan setiap nilai dalam rangkaian sebagai argumen.
Masalah berikutnya yang saya perhatikan adalah tiga panggilan lainnya dari metode pandas.Series.apply
:
df['text'].apply(lambda x: tokenizer.tokenize(x.lower()))
df['text'].apply(lambda x: remove_stopwords(x))
df['text'].apply(lambda x: word_lemmatizer(x))
Ketiga baris ini ditulis seolah-olah pandas.Series.apply
adalah metode inplace, padahal sebenarnya bukan. Untuk benar-benar mengubah objek pandas.DataFrame
yang ditetapkan ke df
, kita harus benar-benar menggunakan penugasan di sini:
df['text'] = df['text'].apply(lambda x: tokenizer.tokenize(x.lower()))
df['text'] = df['text'].apply(remove_stopwords)
df['text'] = df['text'].apply(word_lemmatizer)
Selain itu, ekspresi lambda hanya diperlukan pada panggilan pertama untuk melakukan bagian x.lower()
, karena remove_stopwords
dan word_lemmatizer
keduanya mengambil nilai apa adanya, kita tidak memerlukan lambda tambahan. Terakhir, ketiga baris dapat diringkas menjadi satu panggilan pandas.Series.apply
karena fungsi-fungsi ini diterapkan pada nilai yang sama:
df['text'] = df['text'].apply(
lambda x: word_lemmatizer(
remove_stopwords(
tokenizer.tokenize(x.lower())
)
)
)
Kode lengkap yang saya harap OP dapat kumpulkan dari komentar saya akan terlihat seperti ini:
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
from nltk.stem import WordNetLemmatizer
import pandas as pd
tokenizer = RegexpTokenizer(r'\w+')
lemmatizer = WordNetLemmatizer()
def remove_stopwords(df_text):
words = [w for w in df_text if w not in stopwords.words('english')]
return words
def word_lemmatizer(df_text):
lem_text = [lemmatizer.lemmatize(i) for i in df_text]
return lem_text
df = pd.read_csv('test.csv', encoding='utf-8', converters={'text': str}, sep="\t")
df['text'] = df['text'].apply(
lambda x: word_lemmatizer(
remove_stopwords(
tokenizer.tokenize(x.lower())
)
)
)
data_count = df['text'].apply(pd.value_counts)
data_count.to_excel("test.xlsx")
File excel yang dibuat akan terlihat seperti ini.
Catatan: Output yang ditampilkan di tangkapan layar saya adalah dari menjalankan kode ini pada satu kolom csv yang terdiri dari 100 kalimat pertama buku Dune, saya tidak melakukannya repot-repot membuat ulang csv yang ditampilkan di tangkapan layar OP, karena satu-satunya hal yang penting adalah ada kolom dengan sekumpulan kata bahasa Inggris bernama 'teks'
Dengan semua ini sekarang didokumentasikan dalam jawaban ini, OP masih memiliki satu komentar yang belum diutarakan:
@ Phillyclause89 oke jadi saya bisa mengeluarkan csv dengan setiap kata dipecah ke dalam selnya sendiri, lalu bagaimana saya menggunakan jumlah nilai? Saya akan melampirkan csv baru di postingan asli.
Rekomendasi saya adalah pandas.value_counts
digunakan seperti yang saya tunjukkan pada contoh kode di atas (di dalam pandas.Series.Apply
dan tanpa memanggilnya.) Dari sana Anda dapat menggunakan berbagai metode agg seperti sum untuk menemukan jumlah kata di semua baris:
agg_data_count = data_count.sum().sort_values(0,ascending=False)
agg_data_count.to_excel("sums.xlsx")
Dengan membuka sums.xlsx kita bisa mendapatkan daftar kata-kata yang bagus dan berapa kali kata-kata itu muncul di seluruh kumpulan data: ![masukkan deskripsi gambar di sini](https://i.stack.imgur.com/WBFn1.png)
person
Phillyclause89
schedule
24.06.2020
'amazonfresh-test.csv'
? - person Phillyclause89   schedule 23.06.2020'test'
didata_count = df['test'].apply(pd.value_counts())
? Saya tidak melihatnya sebagai kolom yang ada di csv sumber Anda dan saya tidak melihat Anda membuat kolom seperti itu di mana pun dalam kode Anda sebelum Anda menggunakan metodepandas.Series.apply
di dalamnya. - person Phillyclause89   schedule 23.06.2020pandas.value_counts
. Adapandas.Series.value_counts
, tapi saya tidak yakin apakah ini yang ingin Anda gunakan di sini. apakah Anda hanya mencoba menghitung setiap token yang tersisa setelah menghapus kata-kata berhenti? mungkin mencoba:data_count = df['text'].apply(lambda x: len(x))
? - person Phillyclause89   schedule 23.06.2020data_count = df['text'].apply(pd.value_counts())
atau apakah ada kesalahan ketik lain pada baris itu? seperti yang tertulis saya mendapatkanTypeError: value_counts() missing 1 required positional argument: 'values'
ketika saya mencoba menjalankannya. Bagaimana Anda mengidentifikasi bahwa garis ini adalah leher botol Anda? Apakah Anda yakin itu bukan salah satu dari.apply
panggilan lainnya? - person Phillyclause89   schedule 23.06.2020pandas.Series.apply
bukan metode inplace secara default. Saya rasa Anda ingin melakukandf['text'] = df['text'].apply(func)
di tiga baris yang sepertinya Anda ingin memberi tokenisasi dan memfilter data di kolom teks. 2) Saya rasa Anda ingin menghapus pemanggil dari fungsipd.value_counts
di barisdata_count = df['test'].apply(pd.value_counts())
. coba lakukandata_count = df['test'].apply(pd.value_counts)
? - person Phillyclause89   schedule 23.06.2020