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

使用 MapReduce 删除包含特定单词的整个句子

卞云瀚
2023-03-14

我正在学习MapReduce,我想读取一个输入文件(逐句)并将每个句子写入一个输出文件,前提是它不包含单词“snake”。

例如。输入文件:

This is my first sentence. This is my first sentence.
This is my first sentence.

The snake is an animal. This is the second sentence. This is my third sentence.

Another sentence. Another sentence with snake.

则输出文件应为:

This is my first sentence. This is my first sentence.
This is my first sentence.

This is the second sentence. This is my third sentence.

Another sentence.

为此,我在< code>map方法中检查句子(< code>value)是否包含单词snake。如果句子中不包含snake单词,那么我将在< code>context中书写该句子。

此外,我将化简器任务的数量设置为0,否则在输出文件中,我以随机顺序获取句子(例如,第一个句子,然后是第三个句子,然后是第二个句子,依此类推)。

我的代码确实正确地过滤了含有snake单词的句子,但问题是它将每个句子都写在一个新行中,就像这样:

This is my first sentence. 
 This is my first sentence. 

This is my first sentence. 
 This is the second sentence. 
 This is my third sentence. 


Another sentence. 

. 

如何才能把一个句子写在新的一行里,只有那个句子出现在输入文本的新一行里?以下是我的代码:

public class RemoveSentence {

    public static class SentenceMapper extends Mapper<Object, Text, Text, NullWritable>{

        private Text removeWord = new Text ("snake");

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            if (!value.toString().contains(removeWord.toString())) {
                Text currentSentence = new Text(value.toString()+". ");
                context.write(currentSentence, NullWritable.get());
            }
        }
    }


    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.set("textinputformat.record.delimiter", ".");

        Job job = Job.getInstance(conf, "remove sentence");
        job.setJarByClass(RemoveSentence.class);

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(NullWritable.class);

        job.setMapperClass(SentenceMapper.class);
        job.setNumReduceTasks(0);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

这个解决方案和其他解决方案表示,这应该足以设置<code>上下文。写入(字,空) 但在我的情况下不起作用。

另一个问题与< code > conf . set(" textinputformat . record . delimiter ",")有关);。这就是我如何定义句子之间的分隔符,因此有时输出文件中的句子以空格开始(例如,第二个< code >这是我的第一个句子。)。作为替代,我尝试将它设置为< code > conf . set(" textinputformat . record . delimiter ",". ");(句号后有一个空格),但这样Java应用程序就不会在输出文件中写入所有的句子。

共有1个答案

訾高明
2023-03-14

你离解决这个问题已经很近了。想想你的MapReduce程序是如何工作的。你的map方法将每个由“.”分隔的句子(如你所知,默认为换行符)作为一个新值,然后将其写入文件。你需要一个属性来禁止在每次map()调用后写入换行符。我不确定,但我认为这样的属性不存在。

一种解决方法是让它正常处理。示例记录如下:

这是第一句话。这是第二条蛇。这是最后一次。

找到“snake”一词,如果找到,则立即删除前一个“.”到下一个“。打包新字符串并将其写入上下文。

当然,如果你能找到一种方法在map()调用后禁用换行符,那么这将是最简单的。

希望这能有所帮助。

 类似资料:
  • 我对Xpath有问题。我试图查找div第一次迭代的所有文本节点,但排除其中包含关键字的节点。 一个简单的例子: 我想从第一个div“blabla”中获取所有文本,但排除所有包含“bananas”一词的段落。在这种情况下,我只想要“我也喜欢苹果”。段落数和单词“bananas”的位置是随机的。 以下是我尝试过的: 我不知道为什么这样不行。如果有人有想法,我们将不胜感激!

  • 我需要VBA代码,可以删除整个行,如果两个单元格(可以在工作表的任何列)包含一个特定的文本。 我有一个每日生成的打印报告文件,该文件中的文本(在一个非特定列中)和也在任何列中。 #代表一个数字,所以在我的文件中可以有0-99999…,这取决于打印了多少页。 该文件包含从到的列和数千行,和文本可以位于每列上,具体取决于打印作业。 我希望VBA查看整个工作表,如果一行包含和,则应该删除整行。

  • 给定一个整数< code>n,程序必须删除包含< code>n个元音的每个单词。该字符串是从test.txt文件中读取的,该文件包含以下内容:< code>Astazi nu este maine。目前我的程序包含一个< code>count1函数,它计算字符串中每个单词的字符数和元音数。当输入< code>n元音字母以删除所需单词并打印更新后的字符串时,如何使用< code>count1函数中的

  • 我是开发map-duce函数的新手。考虑我有包含四列数据的csv文件。 例如: 现在,我想说 因为这些行在第四列中包含40个。 如何编写map归约函数?

  • 问题内容: 我正在尝试从文本中提取所有包含指定单词的句子。 但它正在回报我: 代替 : 有什么帮助吗? 问题答案:

  • 问题内容: 我正在使用。 我想删除句子中所有出现的特定单词,但是我不想删除包含z或AZ之间其他字符的任何其他单词。 例如 ,以下是我要删除的句子: 预期产量 : 请注意,如果该单词包含+和之前或之后的任何其他单词,我也想删除它。 到目前为止,这是我尝试过的: 我正在输出: 在上面的输出中,我期望不被替换,应该完全替换。 我应该如何实现呢?任何建议将不胜感激。 编辑: 为清楚起见,这是我正在寻找的另