Я вектурирую текст blob с токенами, которые имеют следующий стиль:
hi__(how are you), 908__(number code), the__(POS)
Поскольку вы можете видеть, что токены привязали некоторую информацию с помощью __(info)
, я извлекаю ключевые слова, используя tfidf, следующим образом:
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(doc)
indices = np.argsort(vectorizer.idf_)[::-1]
features = vectorizer.get_feature_names()
Проблема в том, что когда я делаю описанную выше процедуру для извлечения ключевых слов, я подозреваю, что объект vectorizer удаляет скобки из моего текстового элемента. Таким образом, какой параметр из объекта tfidf vectorizer можно использовать для сохранения такой информации в скобках?
ОБНОВИТЬ
Я также попытался:
from sklearn.feature_extraction.text import TfidfVectorizer
def dummy_fun(doc):
return doc
tfidf = TfidfVectorizer(
analyzer='word',
tokenizer=dummy_fun,
preprocessor=dummy_fun,
token_pattern=None)
а также
from sklearn.feature_extraction.text import TfidfVectorizer
def dummy_fun(doc):
return doc
tfidf = TfidfVectorizer(
tokenizer=dummy_fun,
preprocessor=dummy_fun,
token_pattern=None)
Однако это возвращает мне последовательность символов вместо токенов, которые я уже обозначил:
['e', 's', '_', 'a', 't', 'o', 'c', 'r', 'i', 'n']
Проблема в том, что токенизация по умолчанию, используемая TfidfVectorizer
явно игнорирует все знаки пунктуации:
token_pattern: строка
Регулярное выражение, обозначающее то, что составляет "токен", используется только в случае анализатора == 'word'. Регулярное выражение по умолчанию выбирает маркеры из 2 или более буквенно-цифровых символов (пунктуация полностью игнорируется и всегда рассматривается как разделитель токенов).
Ваша проблема связана с этим предыдущим вопросом, но вместо того, чтобы рассматривать знаки препинания как отдельные токены, вы хотите предотвратить token__(info)
от разделения токена. В обоих случаях решение заключается в написании пользовательского token_pattern
, хотя точные шаблоны разные.
Предполагая, что у каждого маркера уже есть __(info)
:
vectorizer = TfidfVectorizer(token_pattern=r'(?u)\b\w\w+__\([\w\s]*\)')
X = vectorizer.fit_transform(doc)
Я просто изменил значение token_pattern
по умолчанию, так что теперь он соответствует любым token_pattern
или более буквенно-цифровым символам, за которыми следуют __(
, 0 или более буквенно-числовые или пробельные символы и заканчивающиеся на a )
. Если вы хотите получить дополнительную информацию о том, как написать свой собственный token_pattern
, см. token_pattern
Python для регулярных выражений.
ValueError: empty vocabulary; perhaps the documents only contain stop words
tokenizer=dummy_fun
приводит к списку символов, потому что токенизатор должен взять строку и вернуть итерируемый токен. Посколькуdummy_fun
возвращает строку, она интерпретируется как итерация символов. Попробуйте вместо этогоreturn doc.split()
.