1

ツイート データから次のオカレンスを削除したいと考えています。

@が付いているもの (例: @nike)

:// で始まるもの

私のscalaスクリプト内にはストップワードがありますが、それらは出力と正確に一致する必要があります. 削除したい単語のすべての可能性を説明する @* や ://* などのストップワードを追加する方法はありますか?

val source = CSVFile("output.csv")

val tokenizer = {
SimpleEnglishTokenizer() ~>            // tokenize on space and punctuation
WordsAndNumbersOnlyFilter() ~>         // ignore non-words and non-numbers
CaseFolder() ~>                        // lowercase everything
MinimumLengthFilter(3)                 // take terms with >=3 characters 
}

val text = {
source ~>                              // read from the source file
Column(1) ~>                           // select column containing text
TokenizeWith(tokenizer) ~>             // tokenize with tokenizer above
TermCounter() ~>                       // collect counts (needed below)
TermMinimumDocumentCountFilter(30) ~>   // filter terms in <4 docs
TermStopListFilter(List("a", "and", "I", "but", "what")) ~> // stopword list
TermDynamicStopListFilter(10) ~>       // filter out 30 most common terms  
DocumentMinimumLengthFilter(5)         // take only docs with >=5 terms 
}

Tokenizer は、これらの文字以外の文字を認識していないようです。ただし、問題なく除外されます。ご協力いただきありがとうございます!

4

1 に答える 1

1

私は stanford-nlp を使ったことがないので、ここにはまだ多くの詳細が欠けていますが、ここに私が理解できるものがあります.

フォークされた scalanlp リポジトリから、次のように定義TermStopListFilterされているソース コードを見つけました。

/**
 * Filters out terms from the given list.
 * 
 * @author dramage
 */
case class TermStopListFilter[ID:Manifest](stops : List[String])
extends Stage[LazyIterable[Item[ID,Iterable[String]]],LazyIterable[Item[ID,Iterable[String]]]] {
  override def apply(parcel : Parcel[LazyIterable[Item[ID,Iterable[String]]]]) : Parcel[LazyIterable[Item[ID,Iterable[String]]]] = {
    val newMeta = {
      if (parcel.meta.contains[TermCounts]) {
        parcel.meta + parcel.meta[TermCounts].filterIndex(term => !stops.contains(term)) + TermStopList(stops)
      } else {
        parcel.meta + this;
      }
    }

    Parcel(parcel.history + this, newMeta,
      parcel.data.map((doc : Item[ID,Iterable[String]]) => (doc.map(_.filter(term => !stops.contains(term))))));
  }

  override def toString =
    "TermStopListFilter("+stops+")";
}

コードで私はそれを見る

if (parcel.meta.contains[TermCounts]) {
  parcel.meta + 
  parcel.meta[TermCounts].filterIndex(term => !stops.contains(term)) +
  TermStopList(stops)
}

TermCountsデータから取得されたオブジェクトは、 を使用metaして用語をstops要素と照合することにより、含まれている用語をフィルター処理しているように見えますcontains

より一般的な表現でフィルタリングするにTermStopListFilterは、正規表現を使用する の新しいバージョンを実装するだけで十分です。たとえば、

import scala.util.matching.Regex

/**
 * Filters out terms that matches the supplied regular expression.
 */
case class TermStopListFilter[ID:Manifest](regex: String)
extends Stage[LazyIterable[Item[ID,Iterable[String]]],LazyIterable[Item[ID,Iterable[String]]]] {
  override def apply(parcel : Parcel[LazyIterable[Item[ID,Iterable[String]]]]) : Parcel[LazyIterable[Item[ID,Iterable[String]]]] = {

    //extract the pattern from the regular expression string
    val pat = regex.r.pattern

    val newMeta = {
      if (parcel.meta.contains[TermCounts]) {
        parcel.meta + parcel.meta[TermCounts].filterIndex(term => pat.matcher(term).matches) // something should be added here??
      } else {
        parcel.meta + this; // is this still correct?
      }
    }

    Parcel(parcel.history + this, newMeta,
      parcel.data.map((doc : Item[ID,Iterable[String]]) => (doc.map(_.filter(term => pat.matcher(term).matches)))));
  }

  override def toString =
    "TermStopListFilter("+regex+")";
}
于 2013-01-11T10:45:58.450 に答える