gpt4 book ai didi

python - 使用 scikit-learn 实现 skip gram?

转载 作者:太空狗 更新时间:2023-10-29 20:39:24 24 4
gpt4 key购买 nike

有什么方法可以在 scikit-learn 库中实现 skip-gram 吗?我已经手动生成了一个包含 n-skip-gram 的列表,并将其作为 CountVectorizer() 方法的词汇表传递给 skipgrams。

不幸的是,它的预测性能很差:准确率只有 63%。但是,我使用默认代码中的 ngram_range(min,max)CountVectorizer() 上获得了 77-80% 的准确率。

有没有更好的方法在 scikit learn 中实现 skip-grams?

这是我的部分代码:

corpus = GetCorpus() # This one get text from file as a list

vocabulary = list(GetVocabulary(corpus,k,n))
# this one returns a k-skip n-gram

vec = CountVectorizer(
tokenizer=lambda x: x.split(),
ngram_range=(2,2),
stop_words=stopWords,
vocabulary=vocabulary)

最佳答案

要在 scikit-learn 中使用 skip-grams 对文本进行矢量化,只需将 skip-gram 标记作为词汇表传递给 CountVectorizer 是行不通的。您需要修改 token 的处理方式,这可以通过自定义分析器来完成。下面是一个生成 1-skip-2-grams 的矢量化器示例,

from toolz import itertoolz, compose
from toolz.curried import map as cmap, sliding_window, pluck
from sklearn.feature_extraction.text import CountVectorizer

class SkipGramVectorizer(CountVectorizer):
def build_analyzer(self):
preprocess = self.build_preprocessor()
stop_words = self.get_stop_words()
tokenize = self.build_tokenizer()
return lambda doc: self._word_skip_grams(
compose(tokenize, preprocess, self.decode)(doc),
stop_words)

def _word_skip_grams(self, tokens, stop_words=None):
# handle stop words
if stop_words is not None:
tokens = [w for w in tokens if w not in stop_words]

return compose(cmap(' '.join), pluck([0, 2]), sliding_window(3))(tokens)

例如,在 this Wikipedia example 上,

text = ['the rain in Spain falls mainly on the plain']

vect = SkipGramVectorizer()
vect.fit(text)
vect.get_feature_names()

这个向量化器会产生以下标记,

['falls on',  'in falls',  'mainly the',  'on plain',
'rain spain', 'spain mainly', 'the in']

关于python - 使用 scikit-learn 实现 skip gram?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39725052/

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