当前位置: 首页 > 知识库问答 >
问题:

调用StanfordCoreNLP API与MapReduce工作

许毅
2023-03-14

我正在尝试使用MapReduce处理大量文档,其想法是在mapper中将文件拆分为文档,并在reducer阶段应用stanford coreNLP注释器。

我有一个相当简单(标准)的“tokenize、ssplit、pos、lemma、ner”管道,reducer只调用一个函数,将这些注释器应用于reducer传递的值,并返回注释(作为字符串列表),但生成的输出是垃圾。

我已经观察到,如果我从映射器中调用注释函数,作业将返回预期的输出,但这超出了整个并行性。此外,当我忽略在reducer中获得的值,只对一个伪字符串应用注释器时,该作业将返回预期的输出。

这可能表明该过程中存在一些线程安全问题,但我无法确定在哪里,我的注释函数是同步的,管道是私有的。

有人能提供一些如何解决这个问题的建议吗?

-昂树

编辑:

这是我的减速机的样子,希望这增加了更多的清晰度

public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
        while (values.hasNext()) {
            output.collect(key, new Text(se.getExtracts(values.next().toString()).toString()));             
        }
    }
}

这是获取提取的代码:

final StanfordCoreNLP pipeline; 
public instantiatePipeline(){
    Properties props = new Properties();
    props.put("annotators", "tokenize, ssplit, pos, lemma, ner");

}


synchronized List<String> getExtracts(String l){
    Annotation document = new Annotation(l);

    ArrayList<String> ret = new ArrayList<String>();

    pipeline.annotate(document);

    List<CoreMap> sentences = document.get(SentencesAnnotation.class);
    int sid = 0;
    for(CoreMap sentence:sentences){
        sid++;
        for(CoreLabel token: sentence.get(TokensAnnotation.class)){
            String word = token.get(TextAnnotation.class);
            String pos = token.get(PartOfSpeechAnnotation.class);
            String ner = token.get(NamedEntityTagAnnotation.class);
            String lemma = token.get(LemmaAnnotation.class);

            Timex timex = token.get(TimeAnnotations.TimexAnnotation.class);

            String ex = word+","+pos+","+ner+","+lemma;
            if(timex!=null){
                ex = ex+","+timex.tid();
            }
            else{
                ex = ex+",";
            }
            ex = ex+","+sid;
            ret.add(ex);
        }
    }

共有1个答案

牧信厚
2023-03-14

我解决了这个问题,实际上问题在于我读取的文件中的文本编码(将其转换为文本可能会导致进一步的损坏),这导致了标记化和垃圾溢出方面的问题。我正在清理输入字符串并应用严格的UTF-8编码,现在一切正常。

 类似资料:
  • java.io.ioException:映射项中的类型不匹配:应为org.apache.hadoop.io.text,已收到org.apache.hadoop.mapred.maptask$MapOutputBuffer.Collect(Maptask.java:870)在org.apache.hadoop.mapred.maptask$NewOutputCollector.Write(Mapta

  • 大数据 概述 大数据: 收集到的数据已经远远超出了我们的处理能力。 大数据 场景 假如你为一家网络购物商店工作,很多用户访问该网站,其中有些人会购买商品,有些人则随意浏览后就离开。 对于你来说,可能很想识别那些有购物意愿的用户。 那么问题就来了,数据集可能会非常大,在单机上训练要运行好几天。 接下来:我们讲讲 MapRedece 如何来解决这样的问题 MapRedece Hadoop 概述 Had

  • 我想知道输出收集器的“实例”输出是否用于映射函数:output.collect(键,值)这个输出 - 是否在某个地方存储键值对?即使它发出到化简器函数,它们也必须是中间文件,对吧?这些文件是什么?它们是否可见并由编程者决定?我们在主函数中指定的输出密钥类和输出值类是这些存储位置吗?[文本.class和可写.class] 我给出了MapReduce中字数统计示例的标准代码,我们可以在网络中的许多地方

  • 请..来个身体救救我!!!! 这是main.class 源代码:https://github.com/yezhang1989/k-means-clustering-on-MapReduce

  • 主要内容:Word Count,集群模式在学习了之前的 MapReduce 概念之后,我们应该已经知道什么是 Map 和 Reduce,并了解了他们的工作方式。 本章将学习如何使用 MapReduce。 Word Count Word Count 就是"词语统计",这是 MapReduce 工作程序中最经典的一种。它的主要任务是对一个文本文件中的词语作归纳统计,统计出每个出现过的词语一共出现的次数。 Hadoop 中包含了许多经典的 M

  • 大数据 概述 大数据: 收集到的数据已经远远超出了我们的处理能力。 大数据 场景 假如你为一家网络购物商店工作,很多用户访问该网站,其中有些人会购买商品,有些人则随意浏览后就离开。 对于你来说,可能很想识别那些有购物意愿的用户。 那么问题就来了,数据集可能会非常大,在单机上训练要运行好几天。 接下来:我们讲讲 MapRedece 如何来解决这样的问题 MapRedece Hadoop 概述 Ha