金融市场中的NLP——情感分析( 三 )

B、 基于Tfidf向量的传统机器学习输入被NLTK word_tokenize()标记化 , 然后词干化和删除停用词 。 然后输入到TfidfVectorizer, 通过Logistic回归和随机森林分类器进行分类 。
### 逻辑回归pipeline1 = Pipeline([('vec', TfidfVectorizer(analyzer='word')),('clf', LogisticRegression())])pipeline1.fit(X_train, Y_train)### 随机森林与网格搜索pipeline2 = Pipeline([('vec', TfidfVectorizer(analyzer='word')),('clf', RandomForestClassifier())])param_grid = {'clf__n_estimators': [10, 50, 100, 150, 200],'clf__min_samples_leaf': [1, 2],'clf__min_samples_split': [4, 6],'clf__max_features': ['auto']}model = GridSearchCV(pipeline2, param_grid=param_grid, cv=kfold, scoring=scoring, verbose=verbose, refit=refit, n_jobs=-1, return_train_score=True)model.fit(X_train, Y_train)tfidf_best = model.best_estimator_C、 LSTM由于LSTM被设计用来记忆表达上下文的长期记忆 , 因此使用自定义的tokenizer并且输入是字符而不是单词 , 所以不需要词干化或输出停用词 。 输入先到一个嵌入层 , 然后是两个lstm层 。 为了避免过拟合 , 应用dropout , 然后是全连接层 , 最后采用log softmax 。
class TextClassifier(nn.Module):def __init__(self, vocab_size, embed_size, lstm_size, dense_size, output_size, lstm_layers=2, dropout=0.1):"""初始化模型"""super().__init__()self.vocab_size = vocab_sizeself.embed_size = embed_sizeself.lstm_size = lstm_sizeself.dense_size = dense_sizeself.output_size = output_sizeself.lstm_layers = lstm_layersself.dropout = dropoutself.embedding = nn.Embedding(vocab_size, embed_size)self.lstm = nn.LSTM(embed_size, lstm_size, lstm_layers, dropout=dropout, batch_first=False)self.dropout = nn.Dropout(dropout)if dense_size == 0:self.fc = nn.Linear(lstm_size, output_size)else:self.fc1 = nn.Linear(lstm_size, dense_size)self.fc2 = nn.Linear(dense_size, output_size)self.softmax = nn.LogSoftmax(dim=1)def init_hidden(self, batch_size):"""初始化隐藏状态"""weight = next(self.parameters()).datahidden = (weight.new(self.lstm_layers, batch_size, self.lstm_size).zero_(),weight.new(self.lstm_layers, batch_size, self.lstm_size).zero_())return hiddendef forward(self, nn_input_text, hidden_state):"""在nn_input上执行模型的前项传播"""batch_size = nn_input_text.size(0)nn_input_text = nn_input_text.long()embeds = self.embedding(nn_input_text)lstm_out, hidden_state = self.lstm(embeds, hidden_state)# 堆叠LSTM输出 , 应用dropoutlstm_out = lstm_out[-1,:,:]lstm_out = self.dropout(lstm_out)# 全连接层if self.dense_size == 0:out = self.fc(lstm_out)else:dense_out = self.fc1(lstm_out)out = self.fc2(dense_out)# Softmaxlogps = self.softmax(out)return logps, hidden_state作为替代 , 还尝试了斯坦福大学的GloVe词嵌入 , 这是一种无监督的学习算法 , 用于获取单词的向量表示 。 在这里 , 用6百万个标识、40万个词汇和300维向量对Wikipedia和Gigawords进行了预训练 。 在我们的词汇表中 , 大约90%的单词都是在这个GloVe里找到的 , 其余的都是随机初始化的 。
D、 BERT和ALBERT我使用了Huggingface中的transformer实现BERT模型 。 现在他们提供了tokenizer和编码器 , 可以生成文本id、pad掩码和段id , 可以直接在BertModel中使用 , 我们使用标准训练过程 。
与LSTM模型类似 , BERT的输出随后被传递到dropout , 全连接层 , 然后应用log softmax 。 如果没有足够的计算资源预算和足够的数据 , 从头开始训练模型不是一个选择 , 所以我使用了预训练的模型并进行了微调 。 预训练的模型如下所示:


推荐阅读