在NLP中结合文本和数字特征进行机器学习

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: 在NLP中结合文本和数字特征进行机器学习

应用于自然语言处理的机器学习数据通常包含文本和数字输入。例如,当您通过twitter或新闻构建一个模型来预测产品未来的销售时,在考虑文本的同时考虑过去的销售数据、访问者数量、市场趋势等将会更有效。您不会仅仅根据新闻情绪来预测股价的波动,而是会利用它来补充基于经济指标和历史价格的模型。这篇文章展示了如何在scikit-learn(对于Tfidf)和pytorch(对于LSTM / BERT)中组合文本输入和数字输入。

scikit-learn(例如用于Tfidf)

当你有一个包含数字字段和文本的训练dataframe ,并应用一个来自scikit-lean或其他等价的简单模型时,最简单的方法之一是使用sklearn.pipeline的FeatureUnion管道。

下面的示例假定X_train是一个dataframe ,它由许多数字字段和最后一列的文本字段组成。然后,您可以创建一个FunctionTransformer来分隔数字列和文本列。传递给这个FunctionTransformer的函数可以是任何东西,因此请根据输入数据修改它。这里它只返回最后一列作为文本特性,其余的作为数字特性。然后在文本上应用Tfidf矢量化并输入分类器。该样本使用RandomForest作为估计器,并使用GridSearchCV在给定参数中搜索最佳模型,但它可以是其他任何参数。

640.png

importnumpyasnpfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.pipelineimportPipeline, FeatureUnionfromsklearn.ensembleimportRandomForestClassifierfromsklearn.preprocessingimportFunctionTransformerfromsklearn.model_selectionimportGridSearchCV, StratifiedKFold#CreateFunctionTransformertouseFeatureUniondefget_numeric_data(x):
return [record[:-2].astype(float) forrecordinx]
defget_text_data(x):
return [record[-1] forrecordinx]
transfomer_numeric=FunctionTransformer(get_numeric_data)
transformer_text=FunctionTransformer(get_text_data)
#CreateapipelinetoconcatenateTfidfVectorandNumericdata#UseRandomForestClassifierasanexamplepipeline=Pipeline([
    ('features', FeatureUnion([
            ('numeric_features', Pipeline([
                ('selector', transfomer_numeric)
            ])),
              ('text_features', Pipeline([
                ('selector', transformer_text),
                ('vec', TfidfVectorizer(analyzer='word'))
            ]))
          ])),
    ('clf', RandomForestClassifier())
])
#GridSearchParametersforRandomForestparam_grid= {'clf__n_estimators': np.linspace(1, 100, 10, dtype=int),
'clf__min_samples_split': [3, 10],
'clf__min_samples_leaf': [3],
'clf__max_features': [7],
'clf__max_depth': [None],
'clf__criterion': ['gini'],
'clf__bootstrap': [False]}
#Trainingconfigkfold=StratifiedKFold(n_splits=7)
scoring= {'Accuracy': 'accuracy', 'F1': 'f1_macro'}
refit='F1'#PerformGridSearchrf_model=GridSearchCV(pipeline, param_grid=param_grid, cv=kfold, scoring=scoring,
refit=refit, n_jobs=-1, return_train_score=True, verbose=1)
rf_model.fit(X_train, Y_train)
rf_best=rf_model.best_estimator_

Scikit-learn提供了很好的api来管理ML管道,它只完成工作,还可以以同样的方式执行更复杂的步骤。

Pytorch(例如LSTM, BERT)

如果您应用深度神经网络,更常见的是使用Tensorflow/Keras或Pytorch来定义层。两者都有类似的api,并且可以以相同的方式组合文本和数字输入,下面的示例使用pytorch。

要在神经网络中处理文本,首先它应该以模型所期望的方式嵌入。有一个dropout 层也是常见的,以避免过拟合。该模型在与数字特征连接之前添加一个稠密层(即全连接层),以平衡特征的数量。最后,应用稠密层输出所需的输出数量。

640.png

classLSTMTextClassifier(nn.Module):
def__init__(self, vocab_size, embed_size, lstm_size, dense_size, numeric_feature_size, output_size, lstm_layers=1, dropout=0.1):
super().__init__()
self.vocab_size=vocab_sizeself.embed_size=embed_sizeself.lstm_size=lstm_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(0.2)
self.fc1=nn.Linear(lstm_size, dense_size)
self.fc2=nn.Linear(dense_size+numeric_feature_size, output_size)
self.softmax=nn.LogSoftmax(dim=1)
definit_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_())
returnhiddendefforward(self, nn_input_text, nn_input_meta, hidden_state):
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_out=lstm_out[-1,:,:]
lstm_out=self.dropout(lstm_out)
dense_out=self.fc1(lstm_out)
concat_layer=torch.cat((dense_out, nn_input_meta.float()), 1)
out=self.fc2(concat_layer)
logps=self.softmax(out)
returnlogps, hidden_stateclassBertTextClassifier(nn.Module):
def__init__(self, hidden_size, dense_size, numeric_feature_size, output_size, dropout=0.1):
super().__init__()
self.output_size=output_sizeself.dropout=dropout#Usepre-trainedBERTmodelself.bert=BertModel.from_pretrained('bert-base-uncased', output_hidden_states=True, output_attentions=True)
forparaminself.bert.parameters():
param.requires_grad=Trueself.weights=nn.Parameter(torch.rand(13, 1))
self.dropout=nn.Dropout(dropout)
self.fc1=nn.Linear(hidden_size, dense_size)
self.fc2=nn.Linear(dense_size+numeric_feature_size, output_size)
self.softmax=nn.LogSoftmax(dim=1)
defforward(self, input_ids, nn_input_meta):        
all_hidden_states, all_attentions=self.bert(input_ids)[-2:]
batch_size=input_ids.shape[0]
ht_cls=torch.cat(all_hidden_states)[:, :1, :].view(13, batch_size, 1, 768)
atten=torch.sum(ht_cls*self.weights.view(13, 1, 1, 1), dim=[1, 3])
atten=F.softmax(atten.view(-1), dim=0)
feature=torch.sum(ht_cls*atten.view(13, 1, 1, 1), dim=[0, 2])
dense_out=self.fc1(self.dropout(feature))
concat_layer=torch.cat((dense_out, nn_input_meta.float()), 1)
out=self.fc2(concat_layer)
logps=self.softmax(out)
returnlogps

以上代码在前向传播时使用torch.cat将数字特征和文本特征进行组合,并输入到后续的分类器中进行处理。

目录
相关文章
|
26天前
|
机器学习/深度学习 自然语言处理 知识图谱
GraphRAG在自然语言处理中的应用:从问答系统到文本生成
【10月更文挑战第28天】作为一名自然语言处理(NLP)和图神经网络(GNN)的研究者,我一直在探索如何将GraphRAG(Graph Retrieval-Augmented Generation)模型应用于各种NLP任务。GraphRAG结合了图检索和序列生成技术,能够有效地处理复杂的语言理解和生成任务。本文将从个人角度出发,探讨GraphRAG在构建问答系统、文本摘要、情感分析和自动文本生成等任务中的具体方法和案例研究。
52 5
|
28天前
|
自然语言处理 Python
如何使用自然语言处理库`nltk`进行文本的基本处理
这段Python代码展示了如何使用`nltk`库进行文本的基本处理,包括分词和词频统计。首先需要安装`nltk`库,然后通过`word_tokenize`方法将文本拆分为单词,并使用`FreqDist`类统计每个单词的出现频率。运行代码后,会输出每个词的出现次数,帮助理解文本的结构和常用词。
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
52 2
|
2月前
|
机器学习/深度学习 数据采集 自然语言处理
利用机器学习进行文本情感分析
【10月更文挑战第4天】本文将介绍如何使用机器学习技术对文本进行情感分析,包括预处理、特征提取、模型训练和结果评估等步骤。我们将使用Python编程语言和scikit-learn库来实现一个简单的情感分析模型,并对模型的性能进行评估。
|
3月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
50 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
2月前
|
自然语言处理
【NLP自然语言处理】文本特征处理与数据增强
【NLP自然语言处理】文本特征处理与数据增强
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】python之人工智能应用篇——文本生成技术
文本生成是指使用自然语言处理技术,基于给定的上下文或主题自动生成人类可读的文本。这种技术可以应用于各种领域,如自动写作、聊天机器人、新闻生成、广告文案创作等。
122 8
|
4月前
|
机器学习/深度学习 存储 人工智能
自然语言处理 Paddle NLP - 检索式文本问答-理论
自然语言处理 Paddle NLP - 检索式文本问答-理论
30 1
|
4月前
|
机器学习/深度学习 自然语言处理 算法
nlp文本提取关键词
8月更文挑战第21天
49 0
|
4月前
|
机器学习/深度学习 人机交互 API
【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战
【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战
239 0