как использовать токены со склеарном в LDA - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть список токенизированных документов, содержащий как униграммы, так и биграммы, и я хотел бы выполнить на нем 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 документов и я уже их токенизировал, также метод нахождения биграммы не основан на nltk, так что я уже сделалэтот.Есть ли способ улучшить это без изменения ввода?Я очень новичок в использовании sklearn, поэтому заранее извиняюсь, если я совершаю очевидную ошибку.

1 Ответ

0 голосов
/ 26 ноября 2018

В CountVectorizer есть ngram_range параметр , который будет использоваться для принятия решения о том, будет ли словарь содержать уикрамы, биграммы, триграммы и т. Д .: -

ngram_range : кортеж (min_n, max_n)

Нижняя и верхняя граница диапазона значений n для различных извлекаемых n-граммов.Будут использованы все значения n такие, что min_n <= n <= max_n.</p>

Например:

  • 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' в связанной документации.

...