1

我想从我的 CSV 文件中的数据中删除重复项。第一列是年份,第二列是句子。无论年份信息如何,我都想删除任何重复的句子。

有没有我可以在 val text = { } 中插入的命令来删除这些欺骗?

我的脚本是:

val source = CSVFile("science.csv");

val text = {
source ~>                              
Column(2) ~>                           
TokenizeWith(tokenizer) ~>             
TermCounter() ~>                       
TermMinimumDocumentCountFilter(30) ~>  
TermDynamicStopListFilter(10) ~>      
DocumentMinimumLengthFilter(5)         
} 

谢谢!

4

3 回答 3

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))
于 2013-01-12T00:31:38.473 回答
0

由于集合自然地消除了重复,一种简单的方法是将行填充到 aTreeSet中,使用仅考虑每行的文本部分的自定义排序。

更新

这是一个示例脚本来演示上述内容:

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; 但是,这将导致具有较晚年份的行覆盖具有早年相同文本的行。这就是为什么我必须首先测试收容措施。

现在我们几乎准备好了,我们只需要在打印之前按年份重新排序集合(假设输入是按年份排序的)。

于 2013-01-10T15:52:50.693 回答
0

你需要让你的代码可重现吗?如果没有,那么在excel中,点击“数据”选项卡,点击“1”正上方和“A”左侧的小框突出显示所有内容,点击“删除重复项”,确保“我的数据有标题”如果您有标题,则选中,然后取消单击包含年份的列,只保留旁边带有复选标记的句子的列。这将删除重复的句子,但保留年份的第一个实例。

于 2013-01-10T15:04:56.187 回答