首页 > 解决方案 > Python:CountVectorizer 上的 ValueError。Series 的真值是模棱两可的

问题描述

我有这个数据集,我正在尝试使用 sklearn CountVectorizer 从中提取词袋,但它抛出了这个错误

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我怎样才能解决这个问题?

这是我的代码:

Token = df['Token']
from sklearn.feature_extraction.text import CountVectorizer

count_vector = CountVectorizer(Token)

count_vector.fit(Token)
count_vector.get_feature_names()
doc_array = count_vector.transform(Token).toarray()
doc_array

这是完整的追溯

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-166-56827f6e68fa> in <module>()
----> 1 count_vector.fit(Token)
      2 count_vector.get_feature_names()
      3 doc_array = count_vector.transform(Token).toarray()
      4 doc_array

C:\Users\ACER\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in fit(self, raw_documents, y)
   1022         self
   1023         """
-> 1024         self.fit_transform(raw_documents)
   1025         return self
   1026 

C:\Users\ACER\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in fit_transform(self, raw_documents, y)
   1056 
   1057         vocabulary, X = self._count_vocab(raw_documents,
-> 1058                                           self.fixed_vocabulary_)
   1059 
   1060         if self.binary:

C:\Users\ACER\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in _count_vocab(self, raw_documents, fixed_vocab)
    968         for doc in raw_documents:
    969             feature_counter = {}
--> 970             for feature in analyze(doc):
    971                 try:
    972                     feature_idx = vocabulary[feature]

C:\Users\ACER\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in <lambda>(doc)
    350                                                tokenize)
    351             return lambda doc: self._word_ngrams(
--> 352                 tokenize(preprocess(self.decode(doc))), stop_words)
    353 
    354         else:

C:\Users\ACER\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py in decode(self, doc)
    130             The string to decode
    131         """
--> 132         if self.input == 'filename':
    133             with open(doc, 'rb') as fh:
    134                 doc = fh.read()

C:\Users\ACER\AppData\Roaming\Python\Python37\site-packages\pandas\core\generic.py in __nonzero__(self)
   1476         raise ValueError("The truth value of a {0} is ambiguous. "
   1477                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1478                          .format(self.__class__.__name__))
   1479 
   1480     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

在对它进行标记之前,我也尝试过使用干净的数据集,但它也返回相同的错误

编辑:这是 df 输出

                                               Token    Sentimen
0   ['pilihanny', 'sekolah', 'online', 'offlineken...   0
1   ['mentang', 'sekolah', 'online', '']    0
2   ['terimakasih', 'ya', 'umat', 'kristiani', 'be...   0
3   ['sekolah', 'online', 'tambah', 'rantai', 'cov...   0
4   ['kaya', 'kakak', 'kakak', 'ni', 'jd', 'tumbal...   0
5   ['klian', 'sekolah', 'online', '', 'daring', '...   0
6   ['ga', 'raja', 'udh', 'taun', 'ak', 'sekolah',...   0
7   ['wkwkwk', 'biar', 'hemat', 'nder', 'sekolah',...   0
8   ['tau', 'tuh', 'jarang', 'gerak', 'sekolah', '...   0
9   ['saking', 'lam', 'sekolah', 'online', 'sampe'...   0
10  ['sebenernya', 'dalem', 'giat', 'tuh', 'kayak'...   1
11  ['pagi', 'telpon', 'ibuk', 'camer', 'wkwkw', '...   1
12  ['ow', 'ya', 'sekolah', 'tekan', 'banget', 'an...   1
13  ['pd', 'gak', 'takut', 'ya', 'anak', 'tular', ...   1
14  ['efek', 'anak', 'addict', 'teknologi', '', 'o...   1
15  ['pikir', 'pikir', 'mending', 'sekolah', 'onli...   1
16  ['udah', 'nyaman', 'sekolah', 'online', 'gimna...   1
17  ['ajar', '', 'saran', 'ku', 'kalo', 'udh', 'la...   1
18  ['produktif', 'sekolah', 'online', '', 'i', 'c...   1
19  ['online', 'aja', 'yg', 'beli', 'saham', 'bei'...   1
20  ['solusi', '', 'biar', 'anak', 'anak', 'sekola...   2
...

编辑 2:添加了我的干净数据集。我尝试将“预处理”传递给 CountVectorizer,但它仍然返回相同的错误

    tweet   Sentimen    Preprocess
0   Sampai sekarang pilihanny hanya sekolah online...   0   sampai sekarang pilihanny hanya sekolah online...
1   @shizunecarla mentang-mentang sekolah online :)     0   mentang-mentang sekolah online :)
2   @jehianps Terimakasih Ya Umat Kristiani berkat...   0   terimakasih ya umat kristiani berkat kalian s...
3   sekolah masih online, supaya tidak menambah ra...   0   sekolah masih online, supaya tidak menambah ra...
4   @cirokuchan kayanya seluruh kakak kakak ni jd ...   0   kayanya seluruh kakak kakak ni jd tumbal pas ...
5   klian yang sekolah online / daring waktu pel p...   0   klian yang sekolah online / daring waktu pel p...
6   @jaejenay ga keraja udh setaun ak sekolah onli...   0   ga keraja udh setaun ak sekolah online km do...
7   @subtanyarl Wkwkwk biar lebih hemat lah nder, ...   0   wkwkwk biar lebih hemat lah nder, apalagi sek...
8   @gbiyel Ketauan tuh jarang bergerak, pasti sek...   0   ketauan tuh jarang bergerak, pasti sekolah on...
9   @innerchild_ug saking lamnya sekolah online sa...   0   saking lamnya sekolah online sampe lupa tangg...
10  @schfess Sebenernya didalem kegiatannya tuh ka...   1   sebenernya didalem kegiatannya tuh kayak nege...
11  Terus pagi2 ditelpon sama ibuk camer wkwkw. Mi...   1   terus pagi ditelpon sama ibuk camer wkwkw. min...
12  Ow ya, kalau dilihat2 sekolah disini menekanka...   1   ow ya, kalau dilihat sekolah disini menekankan...
13  @thiyut Kok pd gak takut ya anaknya ketularan ...   1   kok pd gak takut ya anaknya ketularan .\n\ne...
14  @asti_c mungkin efeknya anak lebih addict sama...   1   mungkin efeknya anak lebih addict sama teknol...
15  dipikir pikir mending sekolah online drpd offl...   1   dipikir pikir mending sekolah online drpd offl...
16  Udah nyaman sekolah online gimna dong? T-tapi ...   1   udah nyaman sekolah online gimna dong? t-tapi ...
17  @pixshii buat belajar  saran ku kalo udh lang...  1   buat belajar  saran ku kalo udh langganan le...
18  Malah merasa lebih produktif sejak sekolah onl...   1   malah merasa lebih produktif sejak sekolah onl...
19  @adit_wr @BTannadi @Felicia_Putri online ajala...   1   online ajalah, mana ada lagi yg beli saham k...
20  Makanya harus ada solusi. Membiarkan anak ana...    2   makanya harus ada solusi. membiarkan anak ana...
21  @cccc0123cccc Dari pada main ga jelas. Anak an...   2   dari pada main ga jelas. anak anak di pemukim...
22  Gila nambah2in beban bgt ngurusin sekolah onli...   2   gila nambahin beban bgt ngurusin sekolah onlin...
23  Tapi sepanjang yg terlihat, anak2 sekolah onli...   2   tapi sepanjang yg terlihat, anak sekolah onlin...
24  Belasan tahun kita sering nganggep kalau "seko...   2   belasan tahun kita sering nganggep kalau "seko...
25  dipikiran guru sekolah online gini termasuk li...   2   dipikiran guru sekolah online gini termasuk li...
26  mentang mentang sekolah online, tangga merah t...   2   mentang mentang sekolah online, tangga merah t...
27  @schfess Prinsipku dari kaya gini, terlena sam...   2   prinsipku dari kaya gini, terlena sampe sma. ...
28  Italia sdh 8 bln tatap muka.\nTp khusus SD krn...   2   italia sdh bln tatap muka.\ntp khusus sd krn ...
29  2 hari lagi nak bukak sekolah, setahun cuti ni...   2   hari lagi nak bukak sekolah, setahun cuti ni ...

编辑 4:没关系,@Luke 解决方案是正确的,我的问题是在预处理阶段之后我将“令牌”值保存到新的 csv,当我加载它时,值从 [mentang, sekolah, online, '']变为['mentang', 'sekolah', 'online', ''],这就是导致解决方案不起作用的原因

标签: pythonscikit-learncountvectorizer

解决方案


当您在每一行中有列表时,您需要使用自定义analyzer,因为默认分析器都调用预处理器和标记器,但自定义分析器将跳过此操作。

import pandas as pd

# Create Sample DataFrame
data = {'Token': [ ['mentang', 'sekolah', 'online', '']], 'Sentiment': [0]}
df = pd.DataFrame(data)

Token = df['Token']
from sklearn.feature_extraction.text import CountVectorizer

# Custom Analyzer
count_vector = CountVectorizer(analyzer=lambda x: x)

count_vector.fit(Token)
count_vector.get_feature_names() # Results in: ['', 'mentang', 'online', 'sekolah']

doc_array = count_vector.transform(Token).toarray() # Results in: array([[1, 1, 1, 1]])

推荐阅读