Python 使用CountVectorizer进行词干分析后对文本数据集进行矢量化时获得全部零

Python 使用CountVectorizer进行词干分析后对文本数据集进行矢量化时获得全部零,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我正在对文本数据进行数据清理和预处理。 经过标记化和必要的步骤后,我现在正试图使用sklearnCountVectorizer从数据生成一个矩阵,但当我运行代码时,它只打印出零 这是我在阻止它之后处理的实际文本 # Stemming from nltk.stem import PorterStemmer ps = PorterStemmer() stemmed_words=[] for w in filtered_sent: stemmed_words.append(ps.stem(

我正在对文本数据进行数据清理和预处理。 经过标记化和必要的步骤后,我现在正试图使用sklearn
CountVectorizer
从数据生成一个矩阵,但当我运行代码时,它只打印出零

这是我在阻止它之后处理的实际文本

# Stemming
from nltk.stem import PorterStemmer

ps = PorterStemmer()

stemmed_words=[]
for w in filtered_sent:
    stemmed_words.append(ps.stem(w))

print("Filtered Sentence:",filtered_sent[0:50])
print("Stemmed Sentence:",stemmed_words[0:50])
这是文本
词干词的输出

print("Stemmed Sentence:",stemmed_words[0:50])
这是生成矩阵的代码

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

cv = CountVectorizer(analyzer='word', ngram_range=(2, 2))
text_counts = cv.fit_transform(stemmed_words)
print(text_counts[0:10].toarray())
这是我的输出

print(text_counts[0:10].toarray())
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

我想知道为什么我只得到零而没有混合值。谢谢

您需要将未发音的句子输入到
CountVectorizer
tfidvectorizer
中,否则它会将每个单词理解为一个单独的句子。因此,只有零,因为它无法在您的输入中找到bi-gram

更简单的方法是更改矢量器的
build\u analyzer
方法(在
self.analyzer=='word':
之后),这样您就不必单独执行

从sklearn.feature\u extraction.text导入TfidfVectorizer、CountVectorizer
从nltk.stem导入PorterStemmer
作为pd进口熊猫
ps=PorterStemmer()
类CustomVectorizer(CountVectorizer):
#覆盖build_analyzer方法,允许
#为矢量器创建自定义分析器
def生成分析器(自身):
“”“返回处理预处理和标记化的可调用对象”“”
如果可调用(self.analyzer):
返回式自动分析器
preprocess=self.build\u预处理器()
如果self.analyzer==“char”:
返回lambda doc:self.\u char\u ngrams(预处理(self.decode(doc)))
elif self.analyzer==“char\u wb”:
返回lambda doc:self.\u char\u wb\ngrams(
预处理(自解码(doc)))
elif self.analyzer==“word”:
tokenize=self.build\u标记器()
lemmatize=lambda文件:\
[ps.stem(令牌)用于文档中的令牌]
停止单词=self.get\u停止单词()
返回lambda doc:self.\u word\n rams(
lemmatize(标记化(预处理(自解码(doc))),
停止(用词)
其他:
raise VALUERROR(“%s”不是有效的令牌化方案/分析器“%s”
自动分析仪)
句子=[“破解亚当迪斯科库奇狂喜”放弃另一个句子,“另一个句子”]
vec=自定义矢量器(analyzer='word',ngram_范围=(2,2))
文本计数=向量拟合变换(句子)
打印(pd.DataFrame(text\u counts.toarray(),columns=vec.get\u feature\u names())

您需要将未发音的句子输入到
CountVectorizer
TfidfVectorizer
中,否则它会将每个单词理解为一个单独的句子。因此,只有零,因为它无法在您的输入中找到bi-gram

更简单的方法是更改矢量器的
build\u analyzer
方法(在
self.analyzer=='word':
之后),这样您就不必单独执行

从sklearn.feature\u extraction.text导入TfidfVectorizer、CountVectorizer
从nltk.stem导入PorterStemmer
作为pd进口熊猫
ps=PorterStemmer()
类CustomVectorizer(CountVectorizer):
#覆盖build_analyzer方法,允许
#为矢量器创建自定义分析器
def生成分析器(自身):
“”“返回处理预处理和标记化的可调用对象”“”
如果可调用(self.analyzer):
返回式自动分析器
preprocess=self.build\u预处理器()
如果self.analyzer==“char”:
返回lambda doc:self.\u char\u ngrams(预处理(self.decode(doc)))
elif self.analyzer==“char\u wb”:
返回lambda doc:self.\u char\u wb\ngrams(
预处理(自解码(doc)))
elif self.analyzer==“word”:
tokenize=self.build\u标记器()
lemmatize=lambda文件:\
[ps.stem(令牌)用于文档中的令牌]
停止单词=self.get\u停止单词()
返回lambda doc:self.\u word\n rams(
lemmatize(标记化(预处理(自解码(doc))),
停止(用词)
其他:
raise VALUERROR(“%s”不是有效的令牌化方案/分析器“%s”
自动分析仪)
句子=[“破解亚当迪斯科库奇狂喜”放弃另一个句子,“另一个句子”]
vec=自定义矢量器(analyzer='word',ngram_范围=(2,2))
文本计数=向量拟合变换(句子)
打印(pd.DataFrame(text\u counts.toarray(),columns=vec.get\u feature\u names())

欢迎来到SO!你也可以分享几行文字吗?另外,
ngram_range=(2,2)
应该是
ngram_range=(1,2)
?我将编辑文章标题,以便它更准确地代表实际问题。现在,我投票决定结束这项工作,因为提供的代码不完整,也没有数据。请参阅:。能否尝试将单词数组替换为句子数组。也就是说,
stemmed_words=[“0 crack adam disco cooki negalis discard”,“另一句话”]
这将很困难,因为这就像数据清理的过程一样,文档是句子,但在预处理过程中它将被分解为单词列表。欢迎这样做!你也可以分享几行文字吗?另外,
ngram_range=(2,2)
应该是
ngram_range=(1,2)
?我将编辑文章标题,以便它更准确地代表实际问题。现在,我投票决定结束这项工作,因为提供的代码不完整,也没有数据。请参阅:。能否尝试将单词数组替换为句子数组。也就是说,
词干单词=[“0 crack adam disco cooki negalis discard”,“另一句话”]
这将很困难,因为这就像数据清理过程一样,文档是句子,但在预处理过程中它将被分解成li
print(text_counts[0:10].toarray())
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
   adam disco  anoth sentenc  cooki ecstasi  crack adam  discard anoth  disco cooki  ecstasi discard
0           1              1              1           1              1            1                1
1           0              1              0           0              0            0                0