如何在LDA中将令牌与sklearn一起使用

时间:2018-11-26 09:59:51

标签: python-3.x scikit-learn lda countvectorizer

我有一个带标记的文档的列表,其中包含字母组合词,二元语法,并且我想对其进行sklearn lda。我尝试了以下代码:

my_data =[['low-rank matrix','detection method','problem finding'],['probabilistic inference','problem finding','statistical learning','solution' ],['detection method','probabilistic inference','population','language']...]
tf_vectorizer = CountVectorizer(min_df=2, max_features=n_features,
                                stop_words='english')
tf = tf_vectorizer.fit_transform(mydata)

lda = LatentDirichletAllocation(n_topics=3, max_iter=5,random_state=10)

但是当我打印输出时,我得到这样的东西:

topic 0:
detection,finding, solution ,method,problem 
topic 1:
language, statistical , problem, learning,finding 
and so on..

字母被打破并且彼此分开。我有10,000个文档,并且已经将它们标记化,而且查找bigram的方法不是基于nltk的,所以我已经这样做了。 有什么方法可以在不更改输入的情况下改善此情况?  如果我犯了一些明显的错误,我会很提前使用sklearn道歉。

1 个答案:

答案 0 :(得分:0)

CountVectorizer has a ngram_range param,它将用于确定词汇表中是否包含uniqram,bigrams或trigram等:-

  

ngram_range :元组(min_n,max_n)

     

  要提取的不同n-gram的n值范围。的所有值   n使得将使用min_n <= n <= max_n。

例如:

  • ngram_range=(1,1) =>将仅包含字母组合
  • ngram_range=(1,2) =>将包括字母组合和二元组
  • ngram_range=(2,2) =>将仅包含二元组
  • 依此类推...

您尚未定义,因此默认为ngram_range=(1,1),因此此处仅使用字母组合。

tf_vectorizer = CountVectorizer(min_df=2, 
                                max_features=n_features,
                                stop_words='english',
                                ngram_range = (2,2))  # You need this
tf = tf_vectorizer.fit_transform(my_data)

其次,您说您拥有already tokenize数据并在代码中显示列表列表(my_data)。这不适用于CountVectorizer。为此,您需要传递一个简单的字符串列表,CountVectorizer将自动在它们上应用标记化。因此,您将需要对此进行自己的预处理步骤。请参阅链接文档中的其他参数'preprocessor''tokenizer''analyzer'