【问题标题】:Dutch sentiment analysis using R使用 R 进行荷兰语情绪分析
【发布时间】:2020-09-29 12:21:25
【问题描述】:

在 RStudio 中,我有一列包含 荷兰语 句子,我想通过情绪分析在 -1.0 和 +1.0 之间添加一个极性分数。我已经尝试使用来自 jwfijffels 的 pattern.nlp 包,但这对我不起作用。我在https://github.com/bnosac/pattern.nlp 上找到了一条说明,其中解释说 - 为了使 nlp 包工作,您应该下载特定版本的 Python 并执行一些额外的步骤。但是,这些步骤对我来说有点模糊。

有人可以更详细地向我解释这个安装过程吗?实际上,“安装”下的整个部分对我来说有点神秘。具体应该下载什么? 在哪里运行代码pip install pattern?如何正确设置 PATH?如果有人能一步一步指导我,将不胜感激。

或者:如果有人知道另一种对文本进行情感分析的方法,我当然会接受它,例如将荷兰语句子翻译成英语,然后进行情感分析。还是这样的翻译是个坏主意?

这里有 6 个荷兰语句子。

text = c("Slechte bediening, van begin tot eind",
         "Het eten was heerlijk en de bediening was fantastisch",
         "Geweldige service en beleefde bediening",
         "Verschrikkelijk. Ik had een vlieg in mijn soep", 
         "Het was oké. De bediening kon wat beter, maar het eten was wel lekker. Leuk sfeertje wel!",
         "Ondanks dat het druk was toch op tijd ons eten gekregen. Complimenten aan de kok voor het op smaak brengen van mijn biefstuk")
identifier <- c("3", "4", "6", "7", "1", "5")
df <- data.frame(identifier, text)

【问题讨论】:

    标签: r nlp


    【解决方案1】:

    情感分析(使用字典)基本上只是一个模式匹配任务。我认为当使用tidytext 包和reading the book about it 时这一点会变得很清楚。

    所以我不会在这里为如此复杂的设置而烦恼。相反,我会将他们使用的字典(来自here)转换为data.frame,然后使用tidytext。不幸的是,字典是以 XML 格式存储的,我对此不是很熟悉,所以代码看起来有点 hacky:

    library(tidyverse)
    library(xml2)
    library(tidytext)
    
    sentiment_nl <- read_xml(
      "https://raw.githubusercontent.com/clips/pattern/master/pattern/text/nl/nl-sentiment.xml"
    ) %>% 
      as_list() %>% 
      .[[1]] %>% 
      map_df(function(x) {
        tibble::enframe(attributes(x))
      }) %>% 
      mutate(id = cumsum(str_detect("form", name)))  %>% 
      unnest(value) %>% 
      pivot_wider(id_cols = id) %>% 
      mutate(form = tolower(form), # lowercase all words to ignore case during matching
             polarity = as.numeric(polarity),
             subjectivity = as.numeric(subjectivity),
             intensity = as.numeric(intensity),
             confidence = as.numeric(confidence))
    

    但是输出是正确的:

    head(sentiment_nl)
    #> # A tibble: 6 x 11
    #>      id form  cornetto_id cornetto_synset… wordnet_id pos   sense polarity
    #>   <int> <chr> <chr>       <chr>            <chr>      <chr> <chr>    <dbl>
    #> 1     1 amst… r_a-16677   ""               ""         JJ    van …      0  
    #> 2     2 ange… r_a-8929    ""               ""         JJ    Enge…      0.1
    #> 3     3 arab… r_a-16693   ""               ""         JJ    van …      0  
    #> 4     4 arde… r_a-17252   ""               ""         JJ    van …      0  
    #> 5     5 arnh… r_a-16698   ""               ""         JJ    van …      0  
    #> 6     6 asse… r_a-16700   ""               ""         JJ    van …      0  
    #> # … with 3 more variables: subjectivity <dbl>, intensity <dbl>,
    #> #   confidence <dbl>
    

    现在我们可以使用tidytext 和更广泛的tidyverse 中的函数在字典中查找单词并将分数附加到每个单词。 summarise() 用于为每个文本获取一个值(这也是您需要 text_id 的原因)。

    df <- data.frame(text = c("Het eten was heerlijk en de bediening was fantastisch", 
                              "Verschrikkelijk. Ik had een vlieg in mijn soep", 
                              "Het was oké. De bediening kon wat beter, maar het eten was wel lekker. Leuk sfeertje wel!",
                              "Ondanks dat het druk was toch op tijd ons eten gekregen. Complimenten aan de kok voor het op smaak brengen van mijn biefstuk"))
    
    df %>% 
      mutate(text_id = row_number()) %>% 
      unnest_tokens(output = word, input = text, drop = FALSE) %>% 
      inner_join(sentiment_nl, by = c("word" = "form")) %>%
      group_by(text_id) %>% 
      summarise(text = head(text, 1),
                polarity = mean(polarity),
                subjectivity = mean(subjectivity),
                .groups = "drop")
    #> # A tibble: 4 x 4
    #>   text_id text                                             polarity subjectivity
    #>     <int> <chr>                                               <dbl>        <dbl>
    #> 1       1 Het eten was heerlijk en de bediening was fanta…    0.56         0.72 
    #> 2       2 Verschrikkelijk. Ik had een vlieg in mijn soep     -0.5          0.9  
    #> 3       3 Het was oké. De bediening kon wat beter, maar h…    0.6          0.98 
    #> 4       4 Ondanks dat het druk was toch op tijd ons eten …   -0.233        0.767
    

    正如我所说,tidytextmining.com 解释了有关此(和 NLP)的更多信息,所以如果您现在看起来很复杂,请不要担心。

    【讨论】:

    • 根据Saurabh Bade in another post:“这是因为包中的冲突,即“dplyr”包和“plyr”包中也存在summarize/summarise(在这种情况下,调用了哪个函数从哪个包)。可以通过将mutate更改为dplyr::mutate,并将summarise更改为dplyr::summarise来修复它
    • 是的,完全!我多年来没有使用过plyr,因为dplyr 是继任者,旨在完全取代它。这就是为什么加载两个包时某些功能会出现问题的原因。当然,如果您喜欢某些功能,仍然可以使用plyr,但我建议您查找如何逐位替换您的plyr 代码并使用plyr:: 调用您仍想使用的功能。跨度>
    • 不确定你的意思。在mutate(text_id = row_number()) 行中,我添加了一个id 列,因为您没有id 列,并且它是调用summarise 所必需的。我选择列名text_id 的原因是字典已经包含列id,这会造成混乱,因为你不能有两个同名的列。
    • 如果您想保留您创建的id 列,只需重命名它或重命名字典中的那个。例如,rename(text_id = id).
    • 嘿,让您知道:不断改变问题的目标位置通常被认为是不礼貌的行为。如果您有后续问题,请将它们作为新问题发布。 3 和 6 消失的原因是它们不包含字典中的任何单词。对于第一个文本中的“Slechte”,这可能会令人惊讶。但是,字典中的等价物是“slecht”。您可以研究词形还原(或词干提取)、模糊匹配或更好的字典来解决这个问题。
    猜你喜欢
    • 2017-07-15
    • 2022-08-10
    • 2012-05-01
    • 1970-01-01
    • 2017-11-06
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多