sklearn中的TfidfVectorizer如何具体包含单词

Pas*_*ten 5 python nlp machine-learning scikit-learn

我对此有一些疑问TfidfVectorizer.

我不清楚如何选择单词.我们可以提供最低限度的支持,但在此之后,将决定选择哪些功能(例如,更高的支持更多机会)?如果我们说max_features = 10000,我们总能得到相同的吗?如果我们说max_features = 12000,我们会得到相同的10000功能,但额外增加了2000吗?

此外,有没有办法扩展,比如max_features=20000功能?我把它放在一些文本上,但我知道应该包含的一些单词,以及一些表情符号":-)"等.如何将这些添加到TfidfVectorizer对象中,以便可以使用该对象,用它来fitpredict

to_include = [":-)", ":-P"]
method = TfidfVectorizer(max_features=20000, ngram_range=(1, 3),
                      # I know stopwords, but how about include words?
                      stop_words=test.stoplist[:100], 
                      # include words ??
                      analyzer='word',
                      min_df=5)
method.fit(traindata)
Run Code Online (Sandbox Code Playgroud)

求结果:

X = method.transform(traindata)
X
<Nx20002 sparse matrix of type '<class 'numpy.int64'>'
 with 1135520 stored elements in Compressed Sparse Row format>], 
 where N is sample size
Run Code Online (Sandbox Code Playgroud)

mba*_*rov 20

你问了几个不同的问题.让我分开回答:

"我不清楚这些词是如何被选中的."

文档:

max_features : optional, None by default
    If not None, build a vocabulary that only consider the top
    max_features ordered by term frequency across the corpus.
Run Code Online (Sandbox Code Playgroud)

所有功能(在您的情况下为unigrams,bigrams和trigrams)按频率在整个语料库中排序,然后10000选择顶部.这些不常见的词语被抛弃了.

"如果我们说max_features = 10000,我们总是得到相同的吗?如果我们说max_features = 12000,我们会得到相同的10000个功能,但额外增加了2000个吗?"

是.这个过程是确定性的:对于给定的语料库和给定的语料库max_features,您将始终获得相同的功能.

我把它放在一些文本上,但我知道应该包含的一些单词,[...]如何将这些添加到TfidfVectorizer对象?

您可以使用该vocabulary参数指定应使用的功能.例如,如果您只想提取表情符号,则可以执行以下操作:

emoticons = {":)":0, ":P":1, ":(":2}
vect = TfidfVectorizer(vocabulary=emoticons)
matrix = vect.fit_transform(traindata)
Run Code Online (Sandbox Code Playgroud)

这将返回一个<Nx3 sparse matrix of type '<class 'numpy.int64'>' with M stored elements in Compressed Sparse Row format>].请注意,只有3列,每个功能一列.

如果您希望词汇表包含表情符号以及N最常见的功能,您可以先计算最常用的功能,然后将它们与表情符号合并并重新进行矢量化,如下所示:

# calculate the most frequent features first
vect = TfidfVectorizer(vocabulary=emoticons, max_features=10)
matrix = vect.fit_transform(traindata)
top_features = vect.vocabulary_
n = len(top_features)

# insert the emoticons into the vocabulary of common features
emoticons = {":)":0, ":P":1, ":(":2)}
for feature, index in emoticons.items():
    top_features[feature] = n + index

# re-vectorize using both sets of features
# at this point len(top_features) == 13
vect = TfidfVectorizer(vocabulary=top_features)
matrix = vect.fit_transform(traindata)
Run Code Online (Sandbox Code Playgroud)