在 pyspark 中编写自定义 NER 和 POS 标记器以在管道方法中用于文本输入的特征提取
Writing a custom NER and POS tagger in pyspark to use in the pipeline method for feature extraction of textual inputs
我正在做一个文本分类项目,我正在使用 mllib 的管道方法来链接特征提取阶段。我的数据集由英语句子组成。我有来自 mllib 的 Tokenizer 和 TFIDF Vectorizer 库,我可以直接在管道中使用它们。
但是作为特征提取过程的一部分,我还需要提取 POS 标签和 NER 标签。 Pyspark 没有它的库,我不知道如何为 NER 和 POS 标记编写自定义转换器。我对 Spark 和 Python 很陌生。我正在使用 Spark 1.6 和 Python 2.7.
你可以试试这个:
class POSWordTagger(Transformer, HasInputCol, HasOutputCol):
@keyword_only
def __init__(self, inputCol=None, outputCol=None, stopwords=None):
super(POSWordTagger, self).__init__()
self.stopwords = Param(self, "stopwords", "")
self._setDefault(stopwords=set())
kwargs = self.__init__._input_kwargs
self.setParams(**kwargs)
@keyword_only
def setParams(self, inputCol=None, outputCol=None, stopwords=None):
kwargs = self.setParams._input_kwargs
return self._set(**kwargs)
def setStopwords(self, value):
self._paramMap[self.stopwords] = value
return self
def getStopwords(self):
return self.getOrDefault(self.stopwords)
def _transform(self, dataset):
def f(s):
tokens = nltk.tokenize.wordpunct_tokenize(s)
pos_tags = nltk.pos_tag(tokens)
return pos_tags
t = ArrayType(StringType())
out_col = self.getOutputCol()
in_col = dataset[self.getInputCol()]
return dataset.withColumn(out_col, udf(f, t)(in_col))
我正在做一个文本分类项目,我正在使用 mllib 的管道方法来链接特征提取阶段。我的数据集由英语句子组成。我有来自 mllib 的 Tokenizer 和 TFIDF Vectorizer 库,我可以直接在管道中使用它们。
但是作为特征提取过程的一部分,我还需要提取 POS 标签和 NER 标签。 Pyspark 没有它的库,我不知道如何为 NER 和 POS 标记编写自定义转换器。我对 Spark 和 Python 很陌生。我正在使用 Spark 1.6 和 Python 2.7.
你可以试试这个:
class POSWordTagger(Transformer, HasInputCol, HasOutputCol):
@keyword_only
def __init__(self, inputCol=None, outputCol=None, stopwords=None):
super(POSWordTagger, self).__init__()
self.stopwords = Param(self, "stopwords", "")
self._setDefault(stopwords=set())
kwargs = self.__init__._input_kwargs
self.setParams(**kwargs)
@keyword_only
def setParams(self, inputCol=None, outputCol=None, stopwords=None):
kwargs = self.setParams._input_kwargs
return self._set(**kwargs)
def setStopwords(self, value):
self._paramMap[self.stopwords] = value
return self
def getStopwords(self):
return self.getOrDefault(self.stopwords)
def _transform(self, dataset):
def f(s):
tokens = nltk.tokenize.wordpunct_tokenize(s)
pos_tags = nltk.pos_tag(tokens)
return pos_tags
t = ArrayType(StringType())
out_col = self.getOutputCol()
in_col = dataset[self.getInputCol()]
return dataset.withColumn(out_col, udf(f, t)(in_col))