1

CSVファイルのデータから重複を削除したいのですが。最初の列は年で、2番目の列は文です。年の情報に関係なく、文の重複を削除したいと思います。

これらの重複を削除するためにvaltext= {}に挿入できるコマンドはありますか?

私のスクリプトは次のとおりです。

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

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

ありがとうございました!

4

3 に答える 3

1

基本的に、オブジェクト(行)を一意にするもの(2番目の列)を指定できる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
 }

行のリスト(行はタプル)がある場合は、2番目の列に基づいてフィルター処理された/一意の行を取得できます。

distinct(rows, (_._2))
于 2013-01-12T00:31:38.473 に答える
0

コードを再現可能にする必要がありますか?そうでない場合は、Excelで[データ]タブをクリックし、[1]のすぐ上と[A]の左側にある小さなボックスをクリックしてすべてを強調表示し、[重複を削除]をクリックして、[データにヘッダーが含まれている]を確認しますヘッダーがある場合はが選択され、年のある列のクリックを解除し、横にチェックマークが付いた文のある列のみを保持します。これにより、重複する文は削除されますが、その年の最初のインスタンスが発生し続けます。

于 2013-01-10T15:04:56.187 に答える
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

スクリプトは、行のシーケンスを、コンマ区切り行の2番目の部分に基づくカスタム順序でツリーセットに折り畳みます。最も単純なfold関数は次のようになり(s, l) => s + lます; ただし、その結果、後年の行が前の年の同じテキストの行を上書きすることになります。これが、私が最初に封じ込めをテストしなければならなかった理由です。

これでほぼ準備が整いました。印刷する前に、コレクションを年ごとに再注文する必要があります(これは、入力が年ごとに注文されたと仮定しています)。

于 2013-01-10T15:52:50.693 に答える