web-dev-qa-db-ja.com

Python TfidfVectorizer throwing:empty vocabulary;おそらくドキュメントにはストップワードしか含まれていない "

PythonのTfidfを使用してテキストのコーパスを変換しようとしています。しかし、それをfit_transformしようとすると、値エラーValueError:empty vocabulary;が表示されます。おそらく、ドキュメントにはストップワードのみが含まれています。

In [69]: TfidfVectorizer().fit_transform(smallcorp)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-69-ac16344f3129> in <module>()
----> 1 TfidfVectorizer().fit_transform(smallcorp)

/Users/maxsong/anaconda/lib/python2.7/site-packages/sklearn/feature_extraction/text.pyc in fit_transform(self, raw_documents, y)
   1217         vectors : array, [n_samples, n_features]
   1218         """
-> 1219         X = super(TfidfVectorizer, self).fit_transform(raw_documents)
   1220         self._tfidf.fit(X)
   1221         # X is already a transformed view of raw_documents so

/Users/maxsong/anaconda/lib/python2.7/site-packages/sklearn/feature_extraction/text.pyc in fit_transform(self, raw_documents, y)
    778         max_features = self.max_features
    779 
--> 780         vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary)
    781         X = X.tocsc()
    782 

/Users/maxsong/anaconda/lib/python2.7/site-packages/sklearn/feature_extraction/text.pyc in _count_vocab(self, raw_documents, fixed_vocab)
    725             vocabulary = dict(vocabulary)
    726             if not vocabulary:
--> 727                 raise ValueError("empty vocabulary; perhaps the documents only"
    728                                  " contain stop words")
    729 

ValueError: empty vocabulary; perhaps the documents only contain stop words

私はSOの質問をここで読みます: TfidfVectorizer scikit-learnのカスタムボキャブラリーを使用した問題TfidfVectorizerを使用するというオグリセルの提案を試しました(** params).build_analyzer()(dataset2)を実行して、テキスト分析ステップの結果を確認すると、期待どおりに機能しているようです:以下のスニペット:

In [68]: TfidfVectorizer().build_analyzer()(smallcorp)
Out[68]: 
[u'due',
 u'to',
 u'lack',
 u'of',
 u'personal',
 u'biggest',
 u'education',
 u'and',
 u'husband',
 u'to',

他に私が間違っていることはありますか?私が供給しているコーパスは、改行で区切られた1つの巨大な長い文字列です。

ありがとう!

13
Max Song

文字列が1つしかないからだと思います。文字列のリストに分割してみてください。例:

In [51]: smallcorp
Out[51]: 'Ah! Now I have done Philosophy,\nI have finished Law and Medicine,\nAnd sadly even Theology:\nTaken fierce pains, from end to end.\nNow here I am, a fool for sure!\nNo wiser than I was before:'

In [52]: tf = TfidfVectorizer()

In [53]: tf.fit_transform(smallcorp.split('\n'))
Out[53]: 
<6x28 sparse matrix of type '<type 'numpy.float64'>'
    with 31 stored elements in Compressed Sparse Row format>
17
herrfz

バージョン0.12では、ドキュメントの最小頻度を2に設定しました。これは、少なくとも2回出現する単語のみが考慮されることを意味します。この例を機能させるには、min_df=1を設定する必要があります。 0.13以降、これがデフォルト設定です。 0.12を使っていると思いますよね?

4
Andreas Mueller

文字列を1つだけにするように要求する場合は、代わりに単一の文字列をタプルとして置くこともできます。持つ代わりに:

smallcorp = "your text"

タプル内に置くほうがよいでしょう。

In [22]: smallcorp = ("your text",)
In [23]: tf.fit_transform(smallcorp)
Out[23]: 
<1x2 sparse matrix of type '<type 'numpy.float64'>'
    with 2 stored elements in Compressed Sparse Row format>
0
iparjono

大きなコーパスでTF-IDF Python 3スクリプトを実行しているときに同様のエラーが発生しました。一部の小さなファイルには(明らかに)キーワードがなく、エラーメッセージがスローされました。

役に立たなかったいくつかの解決策(len(filtered = 0、...の場合にfilteredリストにダミー文字列を追加する)を試しました。最も簡単な解決策は、try: ... except ... continue式を追加することでした。

pattern = "(?u)\\b[\\w-]+\\b"
cv = CountVectorizer(token_pattern=pattern)

# filtered is a list
filtered = [w for w in filtered if not w in my_stopwords and not w.isdigit()]

# ValueError:
# cv.fit(text)
# File "tfidf-sklearn.py", line 1675, in tfidf
#   cv.fit(filtered)
#   File "/home/victoria/venv/py37/lib/python3.7/site-packages/sklearn/feature_extraction/text.py", line 1024, in fit
#   self.fit_transform(raw_documents)
#   ...
#   ValueError: empty vocabulary; perhaps the documents only contain stop words

# Did not help:
# https://stackoverflow.com/a/20933883/1904943
#
# if len(filtered) == 0:
#     filtered = ['xxx', 'yyy', 'zzz']

# Solution:
try:
    cv.fit(filtered)
    cv.fit_transform(filtered)
    doc_freq_term_matrix = cv.transform(filtered)
except ValueError:
    continue
0
Victoria Stuart