Проблемы при векторизации TFIDF токенизированных документов?

1

Я вектурирую текст 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']
  • 1
    tokenizer=dummy_fun приводит к списку символов, потому что токенизатор должен взять строку и вернуть итерируемый токен. Поскольку dummy_fun возвращает строку, она интерпретируется как итерация символов. Попробуйте вместо этого return doc.split() .
  • 0
    Не могли бы вы обновить свой ответ и регулярным выражением, и фиктивным методом только для дальнейшего использования в сообществе? @acattle
Показать ещё 1 комментарий
Теги:
machine-learning
nlp
scikit-learn

1 ответ

2
Лучший ответ

Проблема в том, что токенизация по умолчанию, используемая 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 для регулярных выражений.

  • 0
    Спасибо за помощь! ... по какой-то причине я получаю: ValueError: empty vocabulary; perhaps the documents only contain stop words
  • 0
    Я обновил больше информации, спасибо за помощь еще раз!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню