gpt4 book ai didi

python - 编写一个 fasttext 自定义转换器

转载 作者:行者123 更新时间:2023-12-05 03:46:25 25 4
gpt4 key购买 nike

我有一个经过训练的自定义 fasttext 模型(fasttext 是 Facebook 开发的词嵌入算法)。我设法在一个函数中获得了预期的结果,但现在我想将它重写成一个定制的转换器,这样我就可以将它添加到我的 sklearn 管道中,因为它只接受转换器。

该函数接受一个词并返回该词的向量:

def name2vector(name=None):
vec = [np.array(model.get_word_vector(w)) for w in name.lower().split(' ')]
name_vec = np.sum(vec, axis=0) # If "name" is multiple words, sum the vectors
return (name_vec)

返回值:

array([-0.01087821,  0.01030535, -0.01402427,  0.0310982 ,  0.08786983,
-0.00404521, -0.03286128, -0.00842709, 0.03934859, -0.02717219,
0.01151722, -0.03253938, -0.02435859, 0.03330994, -0.03696496], dtype=float32))

我希望更改器(mutator)做与函数相同的事情。我知道我可以使用 BaseEstimatorTransformerMixin 通过读取 tutorial 将其重写为转换器但我仍然坚持这一点。一些建议会很好,谢谢。

最佳答案

假设您正在使用 pandas DataFrame,您可以这样做:

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression



class FastTextTransformer(TransformerMixin, BaseEstimator):
def __init__(self, model):
self.model = model

def get_params(self, deep):
return {'dimension': self.model.get_dimension()}

def fit(self, X, y):
# We assume the FT model was already fit
return self

def transform(self, X):
X_copy = X.copy()
X_copy = X_copy.apply(self.name2vector)

return pd.DataFrame(X_copy.tolist())

def name2vector(self, name):
vec = [np.array(self.model.get_word_vector(w)) for w in name.lower().split(' ')]
name_vec = np.sum(vec, axis=0) # If "name" is multiple words, sum the vectors
return name_vec


为了演示用法,让我们加载一个 fasttext 模型和一个亚马逊评论的示例数据集:

import fasttext as ft

ft_model = ft.load_model('amazon_review_polarity.ftz')
amz_df = pd.read_html('https://huggingface.co/datasets/amazon_polarity/viewer/amazon_polarity/test')[0]
amz_df.rename(columns={'content (string)': 'content', 'label (class label)': 'label'}, inplace=True)
amz_df

enter image description here

然后将其用作真正的 scikit-learn 管道。

pipe = Pipeline([
('ft', FastTextTransformer(ft_model)),
('clf', LogisticRegression()),
])

现在我们可以拟合和预测

pipe.fit(amz_df['content'], amz_df.label)
pipe.predict(pd.Series(['great', 'very cool', 'very disappointed']))

哪个返回

array(['positive', 'positive', 'negative'], dtype=object)

注意如果您想计算句子中单词的平均值,而不是总和,您可以将 name2vector 替换为内置方法 get_sentence_vector。对于监督模型,它将返回平均值。对于无监督的(CBOW 和 skipgram),它首先将每个向量除以其 L2 范数,然后取平均值。

查看讨论 here .

来源:Stefano Fiorucci - anakin87

关于python - 编写一个 fasttext 自定义转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65300462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com