Разбор списка твитов для использования Gensim Word2Vec - PullRequest
0 голосов
/ 08 февраля 2019

Я работаю над проблемой НЛП, и моя цель состоит в том, чтобы иметь возможность передавать мои данные в алгоритмы sklearn после использования Word2Vec через библиотеку Python Gensim.Основной проблемой, которую я пытаюсь решить, является бинарная классификация серии твитов.Для этого я изменяю код в этом git repo.

Вот часть кода, относящаяся к токенизации:

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
input_file["tokens"] = input_file["text"].apply(tokenizer.tokenize)
all_words = [word for tokens in input_file["tokens"] for word in tokens]
sentence_lengths = [len(tokens) for tokens in input_file["tokens"]]
vocabulary = sorted(set(all_words))

Теперь вот часть, гдеЯ использую sklearn-api от Gensim, чтобы попытаться векторизовать мои твиты:

from sklearn.model_selection import train_test_split
from gensim.test.utils import common_texts
from gensim.sklearn_api import W2VTransformer
text = input_file["text"].tolist()
labels = input_file["label"].tolist()
X_train, X_test, y_train, y_test = train_test_split(text, labels, test_size=0.2,random_state=40)
model = W2VTransformer(size=10, min_count=1, seed=1)
X_train_w2v = model.fit(common_texts).transform(X_train)

Это приводит к следующей ошибке:

KeyError: "word 'Great seeing you again, don't be a stranger!' not in vocabulary"

Кажется, что отчасти проблема в том, что Gensim ожидаетполучать по одному слову за раз, и вместо этого он получает целые твиты.

X_train относится к списку типов, вот первые три элемента списка:

["Great seeing you again, don't be a stranger!",
 "Beautiful day here in sunny Prague. Not a cloud in the sky",
 " pfft! i wish I had a laptop like that"]

Обновление

Чтобы исправить это, я попробовал следующее:

X_train_list = []
for sentence in X_train:
word_list = sentence.split(' ')
while("" in word_list): 
    word_list.remove("") 
X_train_list.append(word_list)
model = W2VTransformer(size=10, min_count=1, seed=1)
X_train_tfidf = model.fit(common_texts).transform(X_train_list)

Это приводит к следующей ошибке:

KeyError: "word 'here' not in vocabulary"

Если честно,это поражает меня!То, как обычное слово, подобное «здесь», отсутствует в словаре, мне не под силу.Также интересно, если твиты с блуждающими буквами будут вызывать ошибки, я думаю, что странные путаницы букв, которые часто встречаются за словами, вызовут подобные проблемы.

1 Ответ

0 голосов
/ 08 февраля 2019

Модель Gensim действительно ожидает список списков слов в качестве входных данных, а не просто список предложений.Ваш X_train должен выглядеть следующим образом:

[["Great", "seeing", "you", "again", "..."], 
["Beautiful", "day", "..."], 
...
] 

Обновление: Что касается новой части вашего вопроса, проблема в том, что common_texts представляет собой крошечный набор данных, состоящий только из 9 предложенийпоэтому неудивительно, что словарный запас очень маленький.Попробуйте потренироваться на большом наборе данных, прежде чем использовать transform.В вашем случае вы можете найти набор твитов для обучения.Вы также можете рассмотреть возможность использования FastText, если хотите получить векторы для слов из словарного запаса.

...