Использование CountVectorizer Sklearn для поиска нескольких строк не по порядку

Можно ли использовать CountVectorizer для определения наличия набора слов в корпусе независимо от порядка?

Он может делать упорядоченные фразы: Как я могу использовать sklearn CountVectorizer с mutliple строки?

Тем не менее, в моем случае набор слов не попадает рядом с каждым, поэтому токенизация всей фразы, а затем попытка найти в каком-то текстовом документе приведет к нулевым находкам.

Я мечтаю, чтобы произошло следующее:

import numpy as np
from sklearn import feature_extraction

sentences = [ "The only cool Washington is DC", 
              "A cool city in Washington is Seattle",
              "Moses Lake is the dirtiest water in Washington" ]

listOfStrings = ["Washington DC",
                 "Washington Seattle",  
                 "Washington cool"]

vectorizer = CountVectorizer(vocabulary=listOfStrings)
bagowords = np.matrix(vectorizer.fit_transform(sentences).todense())
bagowords
matrix([[1, 0, 1],
        [0, 1, 1],
        [0, 0, 0],])

Фактическая проблема влечет за собой большее количество промежуточных слов, и поэтому удаление стоп-слов здесь не будет правильным решением. Любой совет будет потрясающим!


person Levi Huddleston    schedule 26.10.2018    source источник
comment
Поскольку вы говорите, что независимо от порядка, будет ли совпадение действительным, если в предложении DC означает округ Колумбия в Вашингтоне? Здесь округ Колумбия на много слов опережает Вашингтон.   -  person Vivek Kumar    schedule 29.10.2018
comment
Да, это все равно будет действительным совпадением!   -  person Levi Huddleston    schedule 29.10.2018


Ответы (1)


Как обсуждалось в комментариях, поскольку вы хотите узнать, присутствуют ли в документе только определенные слова, вам нужно будет немного изменить словарный запас (listOfStrings).

sentences = [ "The only cool Washington is DC", 
              "A cool city in Washington is Seattle",
              "Moses Lake is the dirtiest water in Washington" ]

from sklearn.feature_extraction.text import CountVectorizer
listOfStrings = ["washington", "dc", "seattle", "cool"]
vectorizer = CountVectorizer(vocabulary=listOfStrings,
                             binary=True)   

bagowords = vectorizer.fit_transform(sentences).toarray()

vectorizer.vocabulary
['washington', 'dc', 'seattle', 'cool']

bagowords
array([[1, 1, 0, 1],
       [1, 0, 1, 1],
       [1, 0, 0, 0]])

Я добавил binary=True в CountVectorizer, так как вам не нужны фактические подсчеты, а только проверьте, присутствует ли слово или нет.

Вывод bagowords соответствует указанному вами порядку словарного запаса (listOfStrings). Таким образом, первый столбец показывает, присутствует ли в документах «вашинтон» или нет, второй столбец проверяет наличие «dc» и так далее.

Конечно, вам нужно будет уделить внимание другим параметрам в CountVectorizer, которые могут повлиять на это. Например:,

  • lowercase по умолчанию равно True, поэтому я использовал строчные буквы в listOfStrings. В противном случае «DC», «Dc», «dc» считаются отдельными словами.
  • Вам также следует изучить влияние параметра token_pattern, который по умолчанию сохраняет только буквенно-цифровые строки длиной 2 или более. Поэтому, если вы хотите обнаружить однобуквенные слова, такие как «а», «я» и т. д., вам нужно будет изменить это.

Надеюсь это поможет. Если ничего не понятно, не стесняйтесь спрашивать.

person Vivek Kumar    schedule 30.10.2018
comment
Я ценю ваш вклад, но моя цель здесь состояла в том, чтобы выяснить, появляется ли список ключевых терминов в корпусе в целом, а не по отдельности. Мне нравится использование binary=True. Раньше я делал это вручную. Но то, как это устроено, я не знаю, встречаются ли Сиэтл и Вашингтон в конкретном предложении. Конечно, с этим примером я мог бы вычислить это, но с более крупным примером я не смог бы сопоставить список ключевых терминов. Любые мысли о том, как я могу искать список ключевых слов, которые не появляются рядом друг с другом, и возвращать 1 или 0 в зависимости от того, встречаются ли все эти слова? - person Levi Huddleston; 30.10.2018