我有一个带标记的文档的列表,其中包含字母组合词,二元语法,并且我想对其进行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道歉。
答案 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'
。