代码之家  ›  专栏  ›  技术社区  ›  Jacek Kotowski

R: regexpr()如何在模式参数中使用向量

  •  5
  • Jacek Kotowski  · 技术社区  · 7 年前

    我想从一套短文中的词典中学习术语的位置。问题在于以下代码的最后几行大致基于 From of list of strings, identify which are human names and which are not

    library(tm)
    
    pkd.names.quotes <- c(
      "Mr. Rick Deckard",
      "Do Androids Dream of Electric Sheep",
      "Roy Batty",
      "How much is an electric ostrich?",
      "My schedule for today lists a six-hour self-accusatory depression.",
      "Upon him the contempt of three planets descended.",
      "J.F. Sebastian",
      "Harry Bryant",
      "goat class",
      "Holden, Dave",
      "Leon Kowalski",
      "Dr. Eldon Tyrell"
    ) 
    
    
    firstnames <- c("Sebastian", "Dave", "Roy",
                    "Harry", "Dave", "Leon",
                    "Tyrell")
    
    dict  <- sort(unique(tolower(firstnames)))
    
    corp <- VCorpus(VectorSource(pkd.names.quotes))
    #strange but Corpus() gives wrong segment numbers for the matches.
    
    tdm  <-
      TermDocumentMatrix(corp, control = list(tolower = TRUE, dictionary = dict))
    
    inspect(corp)
    inspect(tdm)
    
    View(as.matrix(tdm))
    
    data.frame(
      Name      = rownames(tdm)[tdm$i],
      Segment = colnames(tdm)[tdm$j],
      Content = pkd.names.quotes[tdm$j],
      Postion = regexpr(
        pattern = rownames(tdm)[tdm$i],
        text = tolower(pkd.names.quotes[tdm$j])
      )
    )
    

           Name Segment          Content Postion
    1       roy       3        Roy Batty       1
    2 sebastian       7   J.F. Sebastian      -1
    3     harry       8     Harry Bryant      -1
    4      dave      10     Holden, Dave      -1
    5      leon      11    Leon Kowalski      -1
    6    tyrell      12 Dr. Eldon Tyrell      -1
    
    Warning message:
    In regexpr(pattern = rownames(tdm)[tdm$i], text = tolower(pkd.names.quotes[tdm$j])) :
      argument 'pattern' has length > 1 and only the first element will be used
    

    我知道解决方法 模式=粘贴(向量,折叠=“|”) 但我的向量可以很长(所有流行名称)。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    你可以矢量化 regexpr 使用 mapply :

    是的多变量版本 sapply 将乐趣应用于每个…参数的第一个元素、第二个元素、第三个元素,等等。

    data.frame(
      Name      = rownames(tdm)[tdm$i],
      Segment = colnames(tdm)[tdm$j],
      Content = pkd.names.quotes[tdm$j],
      Postion = mapply(regexpr, rownames(tdm)[tdm$i], tolower(pkd.names.quotes[tdm$j]), fixed=TRUE)
    )
    

                   Name Segment          Content Postion
    roy             roy       3        Roy Batty       1
    sebastian sebastian       7   J.F. Sebastian       6
    harry         harry       8     Harry Bryant       1
    dave           dave      10     Holden, Dave       9
    leon           leon      11    Leon Kowalski       1
    tyrell       tyrell      12 Dr. Eldon Tyrell      11
    

    或者,使用 斯特林格 str_locate :

    它返回:

    str_定位 ,一个整数矩阵。第一列给出匹配的开始位置,第二列给出结束位置。

    str_locate(tolower(pkd.names.quotes[tdm$j]), fixed(rownames(tdm)[tdm$i]))[,1]
    

    请注意 fixed() 如果需要将字符串与固定(即非正则表达式模式)匹配,则使用。否则,请删除 fixed=TRUE