Сопоставьте предложение с его словарем в sklearn

Я использую CountVectorizer, чтобы получить список слов в списке строк

from sklearn.feature_extraction.text import CountVectorizer
raw_text = [
    'The dog hates the black cat',
    'The black dog is good'
]
raw_text = [x.lower() for x in raw_text]
vocabulary = vectorizer.vocabulary_ 
vocabulary = dict((v, k) for k, v in vocabulary.iteritems())
vocabulary

В словаре у меня есть следующие данные, которые верны

{0: u'black', 1: u'cat', 2: u'dog', 3: u'good', 4: u'hates', 5: u'is', 6: u'the'}

Теперь я хотел бы получить исходные предложения, «сопоставленные» с этими новыми значениями, например:

expected_output = [
    [6, 2, 4, 6, 0, 1],
    [6, 0, 2, 5, 3]
]

Я попытался изучить документацию Sklearn, но я не могу найти ничего, что, кажется, делает это, и я даже не знаю правильной терминологии для операции, которую я пытаюсь выполнить, поэтому я не могу найти никаких результатов в Google.

Есть ли способ достичь этого результата?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
410
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Можете ли вы попробовать следующее:

mydict = {0: u'black', 1: u'cat', 2: u'dog',
          3: u'good', 4: u'hates', 5: u'is', 6: u'the'}


def get_val_key(val):
    return list(mydict.keys())[list(mydict.values()).index(val.lower())]


raw_text = [
    'The dog hates the black cat',
    'The black dog is good'
]
expected_output = [list(map(get_val_key, text.split())) for text in raw_text]
print(expected_output)

Выход:

[[6, 2, 4, 6, 0, 1], [6, 0, 2, 5, 3]]

Работает, но имеет квадратичную временную сложность из-за использования списка значений. Другой ответ здесь обеспечивает гораздо лучшее типичное время выполнения, изменив dict.

Inon Peled 15.03.2019 14:00
Ответ принят как подходящий

Ищите каждое слово следующим образом:

from sklearn.feature_extraction.text import CountVectorizer
raw_text = [
    'The dog hates the black cat',
    'The black dog is good'
]

cv = CountVectorizer()
cv.fit_transform(raw_text)


vocab = cv.vocabulary_.copy()

def lookup_key(string):
    s = string.lower()
    return [vocab[w] for w in s.split()]

list(map(lookup_key, raw_text))

Вне:

[[6, 2, 4, 6, 0, 1], [6, 0, 2, 5, 3]]

По сравнению с решением в другом ответе здесь, это решение обычно должно иметь гораздо лучшее время выполнения для больших объемов текста.

Inon Peled 15.03.2019 13:58
.split() не учитывает стоп-слова или другие предубеждения, которые может использовать countVectorizer при построении словаря.
Venkatachalam 15.03.2019 14:55

@AI_Learning хороший момент. Возможно, использование -1 для любых удаленных стоп-слов было бы достаточным для варианта использования OP.

Brendan Martin 15.03.2019 15:05

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

from sklearn.feature_extraction.text import CountVectorizer
raw_text = [
    'The dog hates the black cat',
    'The black dog is good'
]
vectorizer = CountVectorizer()
vectorizer.fit(raw_text)

analyzer = vectorizer.build_analyzer()
[[vectorizer.vocabulary_[i]  for i in analyzer(doc)]  for doc in raw_text]

Выход:

[[6, 2, 4, 6, 0, 1], [6, 0, 2, 5, 3]]

Другие вопросы по теме