Я использую 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.
Есть ли способ достичь этого результата?






Можете ли вы попробовать следующее:
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]]
Ищите каждое слово следующим образом:
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]]
По сравнению с решением в другом ответе здесь, это решение обычно должно иметь гораздо лучшее время выполнения для больших объемов текста.
.split() не учитывает стоп-слова или другие предубеждения, которые может использовать countVectorizer при построении словаря.
@AI_Learning хороший момент. Возможно, использование -1 для любых удаленных стоп-слов было бы достаточным для варианта использования OP.
Я думаю, вы можете просто подогнать текст для создания словаря, а затем использовать словарь для создания необходимого сопоставления, используя 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]]
Работает, но имеет квадратичную временную сложность из-за использования списка значений. Другой ответ здесь обеспечивает гораздо лучшее типичное время выполнения, изменив dict.