1

x、y、z の 3 つの単語があり、そこから 2 つの複合語 xy と yz を作成できます。

自然に発生するテキストでは、x、y、および z が互いに続くことがあります。最初のケースでは、私は持っています:

text="x-y z"

そして、「y z」ではなく「xy」を検出したい。私が行った場合:

v=c("x-y","y z")
vv=paste("\\b",v,"\\b",sep="")
sapply(vv,grepl,text,perl=TRUE)

私は c(TRUE,TRUE) を得ます。つまり、grepl は、y が単語内ダッシュを介して既に x にリンクされているという事実を捉えていないため、「y z」は実際にはテキスト内に存在しません。したがって、テキストの先頭に空白を追加した後、後読みを使用します。

text=paste("",text,sep=" ")
vv=paste("(?<= )\\b",v,"\\b",sep="")
sapply(vv,grepl,text,perl=TRUE)

今回は、目的の c(TRUE, FALSE) が得られます。さて、2番目のケースでは、私は持っています:

text="x y-z"

「x y」ではなく「yz」を検出したい。今回は先読みによる対称的なアプローチを採用して、次のことを試しました。

text=paste(text,"",sep=" ")
v=c("x y","y-z")
vv=paste("(?= )\\b",v,"\\b",sep="")
sapply(vv,grepl,text,perl=TRUE)

しかし今回は、予想どおり c(FALSE,TRUE) ではなく c(FALSE,FALSE) を取得しました。最初の位置の FALSE が予期されます (先読みにより、y の後の単語内ダッシュの存在が検出され、"x y" との一致が妨げられました)。しかし、「yz」とのマッチングを妨げているものは本当にわかりません。

ご協力ありがとうございました。

4

1 に答える 1

1

これは、達成したいことのコメントの説明と一致すると思います。

spaceInvader <- function(a, b, text) {
  # look ahead of `a` to see if there is a space
  hasa <- grepl(paste0(a, '(?= )'), text, perl = TRUE)
  # look behind `b` to see if there is a space 
  hasb <- grepl(paste0('(?<= )', b), text, perl = TRUE)

  result <- c(hasa, hasb)
  names(result) <- c(a, b)
  cat('In: "', text, '"\n', sep = '')
  return(result)
}

spaceInvader('x-y', 'y z', 'x-y z')
# In: "x-y z"
#   x-y   y z 
#  TRUE FALSE 
spaceInvader('x y', 'y-z', 'x y-z')
# In: "x y-z"
#   x y   y-z 
# FALSE  TRUE 
spaceInvader('x-y', 'y z', 'x y-z')
# In: "x y-z"
#   x-y   y z 
# FALSE FALSE 
spaceInvader('x y', 'y-z', 'x-y z')
# In: "x-y z"
#   x y   y-z 
# FALSE FALSE 

これは問題ですか?

spaceInvader('x-y', 'y-z', 'x-y-z')
# In: "x-y-z"
#   x-y   y-z 
# FALSE FALSE
于 2015-01-29T23:03:03.263 に答える