【问题标题】:Why does the ngrams() function give distinct bigrams?为什么 ngrams() 函数给出不同的二元组?
【发布时间】:2015-09-29 17:25:04
【问题描述】:

我正在编写一个R 脚本并且正在使用库(ngram)。

假设我有一个字符串,

“质量好的狗粮买了一些重要的罐头狗粮产品发现质量好的产品看起来像炖肉过程肉味道更好拉布拉多finicki appreci产品更好”

并且想找到二元组。

ngram 库给我的 bi-gram 如下:

“欣赏产品”“加工肉类”“食品”“购买的食品”“质量狗”“找到的产品”“产品外观”“看起来像”“像炖肉”“质量好”“拉布拉多犬”“购买的服务器” ” “优质产品” “更好的拉布拉多” “狗粮”“味道更好”“重要罐头”“肉味”“发现好”“切断重要”“炖制过程”“狗粮”“finicki appreci”“产品更好”

由于句子包含两次“狗粮”,所以我要两次这个双元词。但我得到它一次!

thengram 库或任何其他库中是否有一个选项可以在 R 中提供我句子的所有二元组?

【问题讨论】:

    标签: r nlp n-gram


    【解决方案1】:

    ngram的开发版有一个get.phrasetable方法:

    devtools::install_github("wrathematics/ngram")
    library(ngram)
    
    text <- "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better"
    
    ng <- ngram(text)
    head(get.phrasetable(ng))
    #            ngrams freq       prop
    # 1    good qualiti    2 0.07692308
    # 2        dog food    2 0.07692308
    # 3 appreci product    1 0.03846154
    # 4    process meat    1 0.03846154
    # 5    food product    1 0.03846154
    # 6     food bought    1 0.03846154
    

    此外,您可以使用print() 方法并指定output == "full"。那就是:

    print(ng, output = "full")
    
    # NOTE: more output not shown...
    better labrador | 1 
    finicki {1} | 
    
    dog food | 2 
    product {1} | bought {1} 
    # NOTE: more output not shown...
    

    【讨论】:

      【解决方案2】:

      您可以使用stylo 包。给出重复:

      library(stylo)
      a = "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better"
      b = txt.to.words(a)
      c = make.ngrams(b, ngram.size = 2)
      print(c)
      

      结果:

       [1] "good qualiti"     "qualiti dog"      "dog food"         "food bought"      "bought sever"     "sever vital"      "vital can"        "can dog"          "dog food"        
      [10] "food product"     "product found"    "found good"       "good qualiti"     "qualiti product"  "product look"     "look like"        "like stew"        "stew process"    
      [19] "process meat"     "meat smell"       "smell better"     "better labrador"  "labrador finicki" "finicki appreci"  "appreci product"  "product better"  
      >
      

      【讨论】:

        【解决方案3】:

        您可以使用 RWeka。结果你可以看到“dog food”和“good qualiti”出现了两次

        txt <- "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better"
        
        
        library(RWeka)
        RWEKABigramTokenizer <- function(x) {
              NGramTokenizer(x, Weka_control(min = 2, max = 2)) 
        }
        
        RWEKABigramTokenizer(txt)
        
         [1] "good qualiti"     "qualiti dog"      "dog food"         "food bought"      "bought sever"     "sever vital"      "vital can"       
         [8] "can dog"          "dog food"         "food product"     "product found"    "found good"       "good qualiti"     "qualiti product" 
        [15] "product look"     "look like"        "like stew"        "stew process"     "process meat"     "meat smell"       "smell better"    
        [22] "better labrador"  "labrador finicki" "finicki appreci"  "appreci product"  "product better"  
        

        或者将 tm 包与 RWeka 结合使用

        library(tm)
        library(RWeka)
        my_corp <- Corpus(VectorSource(txt))
        tdm_RWEKA <- TermDocumentMatrix(my_corp, control=list(tokenize = RWEKABigramTokenizer))
        
        #show the 2 bigrams
        findFreqTerms(tdm_RWEKA, lowfreq = 2)
        
        [1] "dog food"     "good qualiti"
        
        #turn into matrix with frequency counts
        tdm_matrix <- as.matrix(tdm_RWEKA)
        

        【讨论】:

          【解决方案4】:

          为了生成这样的二元语法,您不需要任何特殊的包。基本上,将文本拆分并再次粘贴在一起。

          t <- "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better"
          ug <- strsplit(t, " ")[[1]]
          bg <- paste(ug, ug[2:length(ug)])
          

          结果bg 将是:

          [1] "good qualiti"     "qualiti dog"      "dog food"
          [4] "food bought"      "bought sever"     "sever vital"
          [7] "vital can"        "can dog"          "dog food"
          [10] "food product"     "product found"    "found good"
          [13] "good qualiti"     "qualiti product"  "product look"
          [16] "look like"        "like stew"        "stew process"
          [19] "process meat"     "meat smell"       "smell better"
          [22] "better labrador"  "labrador finicki" "finicki appreci"
          [25] "appreci product"  "product better"   "better qualiti" 
          

          【讨论】:

            【解决方案5】:

            试试 quanteda 包:

            > quanteda::tokenize(txt, ngrams = 2, concatenator = " ")
            [[1]]
             [1] "good qualiti"     "qualiti dog"      "dog food"         "food bought"      "bought sever"     "sever vital"     
             [7] "vital can"        "can dog"          "dog food"         "food product"     "product found"    "found good"      
            [13] "good qualiti"     "qualiti product"  "product look"     "look like"        "like stew"        "stew process"    
            [19] "process meat"     "meat smell"       "smell better"     "better labrador"  "labrador finicki" "finicki appreci" 
            [25] "appreci product"  "product better"  
            

            ngrams 提供大量其他参数,包括获取不同的 n 大小组合或跳过语法。

            【讨论】:

              猜你喜欢
              • 2014-01-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-13
              • 2021-08-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多