8

tm text-mining R パッケージのソース コードのファイルtransform.RにはremovePunctuation()、現在次のように定義されている関数があります。

function(x, preserve_intra_word_dashes = FALSE)
{
    if (!preserve_intra_word_dashes)
        gsub("[[:punct:]]+", "", x)
    else {
        # Assume there are no ASCII 1 characters.
        x <- gsub("(\\w)-(\\w)", "\\1\1\\2", x)
        x <- gsub("[[:punct:]]+", "", x)
        gsub("\1", "-", x, fixed = TRUE)
    }
}

科学会議からいくつかの要約を解析してマイニングする必要があります (彼らの Web サイトから UTF-8 としてフェッチされます)。要約には、特に単語境界で削除する必要がある Unicode 文字が含まれています。通常の ASCII 句読点文字だけでなく、いくつかの Unicode ダッシュ、Unicode 引用符、数学記号...

テキストには URL もあり、単語内の句読点文字を保持する必要がある句読点があります。tmの組み込みremovePunctuation()機能が過激すぎる。

removePunctuation()したがって、要件に応じて削除を行うためのカスタム関数が必要です。

カスタム Unicode 関数は現在このようになっていますが、期待どおりに動作しません。私は R をめったに使用していないので、R で物事を成し遂げるには、最も単純なタスクであっても時間がかかります。

私の機能:

corpus <- tm_map(corpus, rmPunc =  function(x){ 
# lookbehinds 
# need to be careful to specify fixed-width conditions 
# so that it can be used in lookbehind

x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{5})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{4})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{3})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>]{2})([[:alnum:]])'," \\2", x, perl=TRUE) ;
x <- gsub('(.*?)(?<=^[[:punct:]’“”:±</>])([[:alnum:]])'," \\2", x, perl=TRUE) ; 
# lookaheads (can use variable-width conditions) 
x <- gsub('(.*?)(?=[[:alnum:]])([[:punct:]’“”:±]+)$',"\1 ", x, perl=TRUE) ;

# remove all strings that consist *only* of punct chars 
gsub('^[[:punct:]’“”:±</>]+$',"", x, perl=TRUE) ;

}

期待どおりに動作しません。と思いますが、何の役にも立ちません。句読点はまだ用語文書マトリックス内にあります。次を参照してください。

 head(Terms(tdm), n=30)

  [1] "<></>"                      "---"                       
  [3] "--,"                        ":</>"                      
  [5] ":()"                        "/)."                       
  [7] "/++"                        "/++,"                      
  [9] "..,"                        "..."                       
 [11] "...,"                       "..)"                       
 [13] "“”,"                        "(|)"                       
 [15] "(/)"                        "(.."                       
 [17] "(..,"                       "()=(|=)."                  
 [19] "(),"                        "()."                       
 [21] "(&)"                        "++,"                       
 [23] "(0°"                        "0.001),"                   
 [25] "0.003"                      "=0.005)"                   
 [27] "0.006"                      "=0.007)"                   
 [29] "000km"                      "0.01)" 
...

だから私の質問は:

  1. function(){} を呼び出しても期待どおりの結果が得られないのはなぜですか? どうすれば機能を改善できますか?
  2. \P{ASCII}ifなどの Unicode 正規表現パターン クラス \P{PUNCT}は、R の perl 互換正規表現でサポートされていますか? PCREでは (デフォルトでは) そうではないと思います: : "最も重要なものはサポートされていますが、\p を使用したさまざまな Unicode プロパティのサポートのみが不完全です。"
4

2 に答える 2

2

スサナの答えが好きな限り、新しいバージョンのtmでコーパスを壊しています(もはや PlainTextDocument ではなく、メタを破壊しています)。

リストと次のエラーが表示されます。

Error in UseMethod("meta", x) : 
no applicable method for 'meta' applied to an object of class "character"

使用する

tm_map(your_corpus, PlainTextDocument)

コーパスを返しますが、 $meta が壊れています (特にドキュメント ID が失われます。

解決

content_transformerを使用する

toSpace <- content_transformer(function(x,pattern)
    gsub(pattern," ", x))
your_corpus <- tm_map(your_corpus,toSpace,"„")

出典: R を使用したハンズオン データ サイエンス、テキスト マイニング、Graham.Williams@togaware.com http://onepager.togaware.com/

アップデート

この関数は、英数字以外のものをすべて削除します (つまり、UTF-8 絵文字など)。

removeNonAlnum <- function(x){
  gsub("[^[:alnum:]^[:space:]]","",x)
}
于 2015-07-13T14:04:07.703 に答える