我已经将句子标记化为单词RDD。所以现在我需要二元组。
例如。This is my test => (This is), (is my), (my test)
为此,我通过搜索找到了.sliding运算符。但是我在我的eclipse上没有得到这个选项(希望它在新版本的spark上可用)
那么,我如何在没有.sliding的情况下实现这一点呢?
添加代码以开始-
public static void biGram (JavaRDD<String> in)
{
JavaRDD<String> sentence = in.map(s -> s.toLowerCase());
//get bigram from sentence w/o sliding - CODE HERE
}发布于 2016-12-27 14:28:26
您可以简单地使用spark中的n元语法转换功能。
public static void biGram (JavaRDD<String> in)
{
//Converting string into row
JavaRDD<Row> sentence = sentence.map(s -> RowFactory.create(s.toLowerCase()));
StructType schema = new StructType(new StructField[] {
new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
});
//Creating dataframe
DataFrame dataFrame = sqlContext.createDataFrame(sentence, schema);
//Tokenizing sentence into words
RegexTokenizer rt = new RegexTokenizer().setInputCol("sentence").setOutputCol("split")
.setMinTokenLength(4)
.setPattern("\\s+");
DataFrame rtDF = rt.transform(dataFrame);
//Creating bigrams
NGram bigram = new NGram().setInputCol(rt.getOutputCol()).setOutputCol("bigram").setN(2); //Here setN(2) means bigram
DataFrame bigramDF = bigram.transform(rtDF);
System.out.println("Result :: "+bigramDF.select("bigram").collectAsList());
}发布于 2016-05-23 16:08:45
滑动确实是ngram的一种方式。问题是,滑动在迭代器上工作,只需拆分句子并在数组上滑动即可。我正在添加一个Scala代码。
val sentences:RDD[String] = in.map(s => s.toLowerCase())
val biGrams:RDD[Iterator[Array[String]]] = sentences.map(s => s.split(" ").sliding(2)) https://stackoverflow.com/questions/37298476
复制相似问题