我想从CSV文件中的数据中删除重复项。 第一列是年份,第二列是句子。无论年份信息如何,我都希望删除任何重复的句子。
是否有可以在val text = {}中插入的命令来删除这些欺骗?
我的脚本是:
val source = CSVFile("science.csv");
val text = {
source ~>
Column(2) ~>
TokenizeWith(tokenizer) ~>
TermCounter() ~>
TermMinimumDocumentCountFilter(30) ~>
TermDynamicStopListFilter(10) ~>
DocumentMinimumLengthFilter(5)
}
谢谢!
答案 0 :(得分:1)
基本上你需要一个distinct版本,你可以在其中指定使对象(行)唯一的东西(第二列)。
给出代码:(修改后的SeqLike.distinct)
type Row = (Int, String)
def distinct(rows:Seq[Row], f: Row => AnyRef) = {
val b = newBuilder
val seen = mutable.HashSet[AnyRef]()
val key = f(x)
for (x <- rows) {
if (!seen(key)) {
b += x
seen += key
}
}
b.result
}
如果您有一个行列表(行是一个元组),您可以根据第二列
获取已过滤/唯一的行distinct(rows, (_._2))
答案 1 :(得分:0)
您是否需要重现代码?如果没有,那么在Excel中,单击“数据”选项卡,单击“1”正上方的小方框,然后单击“A”的左侧以突出显示所有内容,单击“删除重复项”,确保“我的数据有标题”如果您有标题,则选中该选项,然后取消选中具有年份的列,只保留其旁边带有复选标记的列。这将删除重复的句子,但保留年份的第一个实例。
答案 2 :(得分:0)
由于集合自然会消除重复,因此一种简单的方法是使用自定义排序将行填充到TreeSet
中,该排序仅考虑每行的文本部分。
以下是演示上述内容的示例脚本:
import collection.immutable.TreeSet
import scala.io.Source
val lines = Source.fromFile("science.csv").getLines()
val uniques = lines.foldLeft(TreeSet[String]()(Ordering.by(_.split(',')(1)))) {
(s, l) =>
if (s contains l) s
else s + l
}
uniques.toList.sorted foreach println
脚本将行序列折叠成一个树集,其中自定义顺序基于逗号分隔行的第二部分。最简单的折叠函数是(s, l) => s + l
;然而,这将导致后期年份覆盖行与早年相同文本的行。这就是我必须首先测试收容的原因。
现在我们已经准备好了,我们只需要在打印前按年重新排序集合(假设输入按年份排序)。