文字列の単語数を数える機能はありますか?例えば:
str1 <- "How many words are in this sentence"
7の結果を返します。
文字列の単語数を数える機能はありますか?例えば:
str1 <- "How many words are in this sentence"
7の結果を返します。
回答:
あなたは使用することができますstrsplit
し、sapply
機能
sapply(strsplit(str1, " "), length)
lengths
:各要素の長さを発見し、ベースR内の関数、lengths(strsplot(str, " "))
正規表現記号\\W
を使用して単語以外の文字を照合し、を使用+
して1つ以上の行を示しgregexpr
、文字列内のすべての一致を検索します。単語は、単語区切り文字の数に1を加えたものです。
lengths(gregexpr("\\W+", str1)) + 1
これは、「言葉」は満たしていないとき、文字ベクトルの先頭または末尾に空白文字列で失敗する\\W
の非単語(一方が他方の正規表現で仕事ができる、という考え方\\S+
、[[:alpha:]]
などが、常にがあります正規表現アプローチによるエッジケース)などstrsplit
。各単語にメモリを割り当てるソリューションよりも効率的である可能性があります。正規表現については、?regex
ます。
更新コメントと@Andriによる別の回答に記載されているように、アプローチは(ゼロ)と1単語の文字列、および末尾の句読点で失敗します
str1 = c("", "x", "x y", "x y!" , "x y! z")
lengths(gregexpr("[A-z]\\W+", str1)) + 1L
# [1] 2 2 2 3 3
他の回答の多くも、これらまたは同様の(たとえば、複数のスペース)場合に失敗します。元の回答の「1つの単語の概念」に関する私の回答の警告は句読点の問題をカバーしていると思います(解決策:たとえば、別の正規表現を選択してください[[:space:]]+
)が、0と1単語の場合は問題です。@Andriのソリューションでは、0語と1語を区別できません。したがって、単語を見つけるために「ポジティブ」なアプローチを取ることは、
sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0))
につながる
sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0))
# [1] 0 1 2 2 3
この場合も、正規表現は「単語」のさまざまな概念に合わせて改良される可能性があります。
gregexpr()
メモリ効率が良いので、の使用が好きです。代替使用strsplit()
される(@ user813966のような、しかし区切るよう言葉を正規表現で)と単語を区切るの元概念を利用します
lengths(strsplit(str1, "\\W+"))
# [1] 0 1 2 2 3
これには、作成される各単語と中間の単語リストに新しいメモリを割り当てる必要があります。データが「大きい」場合、これは比較的コストがかかる可能性がありますが、おそらくほとんどの目的で効果的で理解しやすいでしょう。
str1 <- c('s ss sss ss', "asdf asd hello this is your life!"); sapply(gregexpr("\\W+", str1), length) + 1
リターン4
と8
。最初は正解、2番目は多すぎます。句読点を数えていると思います。
sapply(gregexpr("\\W+", "word"), length) + 1
2を返します
最も簡単な方法は次のとおりです。
require(stringr)
str_count("one, two three 4,,,, 5 6", "\\S+")
...非スペース文字のすべてのシーケンスをカウントします(\\S+
)。
しかし、カウントしたい単語の種類と、ベクトル全体でも機能する単語を決定できる小さな関数についてはどうでしょうか。
require(stringr)
nwords <- function(string, pseudo=F){
ifelse( pseudo,
pattern <- "\\S+",
pattern <- "[[:alpha:]]+"
)
str_count(string, pattern)
}
nwords("one, two three 4,,,, 5 6")
# 3
nwords("one, two three 4,,,, 5 6", pseudo=T)
# 6
ライブラリのstr_count
関数stringr
を、次のようなエスケープシーケンス\w
で使用します。
任意の「単語」文字(現在のロケールでは文字、数字、またはアンダースコア:UTF-8モードではASCII文字と数字のみが考慮されます)
例:
> str_count("How many words are in this sentence", '\\w+')
[1] 7
私がテストできた他の9つの回答のうち、これまでに提示されたすべての入力に対して機能したのは2つ(Vincent Zoonekyndとpetermeissnerによる)だけですが、必要なものもありstringr
ます。
ただし、このソリューションのみが、これまでに提示されたすべての入力に加えて、"foo+bar+baz~spam+eggs"
またはなどの入力で機能します"Combien de mots sont dans cette phrase ?"
。
基準:
library(stringr)
questions <-
c(
"", "x", "x y", "x y!", "x y! z",
"foo+bar+baz~spam+eggs",
"one, two three 4,,,, 5 6",
"How many words are in this sentence",
"How many words are in this sentence",
"Combien de mots sont dans cette phrase ?",
"
Day after day, day after day,
We stuck, nor breath nor motion;
"
)
answers <- c(0, 1, 2, 2, 3, 5, 6, 7, 7, 7, 12)
score <- function(f) sum(unlist(lapply(questions, f)) == answers)
funs <-
c(
function(s) sapply(gregexpr("\\W+", s), length) + 1,
function(s) sapply(gregexpr("[[:alpha:]]+", s), function(x) sum(x > 0)),
function(s) vapply(strsplit(s, "\\W+"), length, integer(1)),
function(s) length(strsplit(gsub(' {2,}', ' ', s), ' ')[[1]]),
function(s) length(str_match_all(s, "\\S+")[[1]]),
function(s) str_count(s, "\\S+"),
function(s) sapply(gregexpr("\\W+", s), function(x) sum(x > 0)) + 1,
function(s) length(unlist(strsplit(s," "))),
function(s) sapply(strsplit(s, " "), length),
function(s) str_count(s, '\\w+')
)
unlist(lapply(funs, score))
出力:
6 10 10 8 9 9 7 6 6 11
'[\\w\']+'
(テストできないため、xkcd.com / 1638が適用される場合があります)。それ以外の場合はわかりません。正規表現は、一般的な場合にそれを処理するのに十分強力です:)
'\\w+(\'\\w{1,2})?'
場合は、適切な解決策になる可能性があります。
o'clock
、friggin'
あなたはそうすることができます\w+('\w*)?
(アポストロフィで始まる単語があるかどうかはわかりませんか?)。さらに時間を処理するために、あなたはそれらを同じように一致\d?\d:\d\d|\w+('\w*)?
させるか、あなたのニーズに応じてさらに複雑なことをすることを試みることができます。しかし、これはRについてではなく、単語をどのように定義するかについてのことなので、特定のニーズをカバーするために別の質問を投稿することができますか?
str2 <- gsub(' {2,}',' ',str1)
length(strsplit(str2,' ')[[1]])
ザ・ gsub(' {2,}',' ',str1)
作るには、必ずすべての単語は、一つのスペースで2つの以上のスペースのすべての出現箇所を置き換えることで、一つだけのスペースで区切られます。
ザ・ strsplit(str,' ')
すべてのスペースでの文章を分割して、リスト内の結果を返します。[[1]]
そのリストの中から単語のベクトルをつかみます。length
どのように多くの単語をカウントアップ。
> str1 <- "How many words are in this sentence"
> str2 <- gsub(' {2,}',' ',str1)
> str2
[1] "How many words are in this sentence"
> strsplit(str2,' ')
[[1]]
[1] "How" "many" "words" "are" "in" "this" "sentence"
> strsplit(str2,' ')[[1]]
[1] "How" "many" "words" "are" "in" "this" "sentence"
> length(strsplit(str2,' ')[[1]])
[1] 7
を使用してstr_match_all
、単語を識別する正規表現を使用できます。以下は、最初、最後、および複製されたスペースで機能します。
library(stringr)
s <- "
Day after day, day after day,
We stuck, nor breath nor motion;
"
m <- str_match_all( s, "\\S+" ) # Sequences of non-spaces
length(m[[1]])
stringi
パッケージからこの機能を試してください
require(stringi)
> s <- c("Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
+ "nibh augue, suscipit a, scelerisque sed, lacinia in, mi.",
+ "Cras vel lorem. Etiam pellentesque aliquet tellus.",
+ "")
> stri_stats_latex(s)
CharsWord CharsCmdEnvir CharsWhite Words Cmds Envirs
133 0 30 24 0 0
単語が1つしかない場合、ソリューション7では正しい結果が得られません。gregexprの結果の要素(一致しない場合は-1)を数えるだけでなく、0より大きい要素を数える必要があります。
エルゴ:
sapply(gregexpr("\\W+", str1), function(x) sum(x>0) ) + 1
str1
単語以外の文字で開始または終了する場合でも、これには問題があります。それが心配だ場合は、このバージョンでは唯一の単語の間にスペースを探します:sapply(gregexpr("\\b\\W+\\b", str, perl=TRUE), function(x) sum(x>0) ) + 1
次の関数と正規表現は、特にシングルハイフンとダブルハイフンを処理する場合に単語カウントに役立つことがわかりました。前者は一般に単語の区切りとしてカウントされるべきではありません。たとえば、よく知られているhi-fiです。一方、ダブルハイフンは、括弧で囲まれた注釈など、空白で囲まれない句読点区切り文字です。
txt <- "Don't you think e-mail is one word--and not two!" #10 words
words <- function(txt) {
length(attributes(gregexpr("(\\w|\\w\\-\\w|\\w\\'\\w)+",txt)[[1]])$match.length)
}
words(txt) #10 words
Stringiは便利なパッケージです。ただし、この例では、ハイフンが原因で単語が過大評価されています。
stringi::stri_count_words(txt) #11 words
stringrパッケージ、1はまた、forループによって例えば文字列のベクトルを横断することができ、簡単なスクリプトを書くことができます。
まあ言ってみれば
df $ text
分析に関心のある文字列のベクトルが含まれています。まず、以下のように既存のデータフレームdfに列を追加します。
df$strings = as.integer(NA)
df$characters = as.integer(NA)
次に、次のように文字列のベクトルに対してforループを実行します。
for (i in 1:nrow(df))
{
df$strings[i] = str_count(df$text[i], '\\S+') # counts the strings
df$characters[i] = str_count(df$text[i]) # counts the characters & spaces
}
結果の列:文字列と文字には単語と文字の数が含まれ、これは文字列のベクトルに対して一度に実行されます。