小言_互联网的博客

R语言自然语言处理(NLP):情感分析新闻文本数据

530人阅读  评论(0)

原文链接:http://tecdat.cn/?p=19095

 

本文对R中的文本内容进行情感分析。此实现利用了各种现有的字典,此外,还可以创建自定义词典。自定义词典使用LASSO正则化作为一种​​统计方法来选择相关词语。最后,评估比较所有方法。

介绍

情感分析是自然语言处理(NLP),计算语言学和文本挖掘的核心研究分支。它是指从文本文档中提取主观信息的方法。换句话说,它提取表达意见的积极负面极性。人们也可能将情感分析称为 观点挖掘 (Pang and Lee 2008)。

研究中的应用

最近,情感分析受到了广泛的关注(K. Ravi和Ravi 2015; Pang和Lee 2008),我们将在下面进行探讨。当前在金融和社会科学领域的研究利用情感分析来理解人类根据文本材料做出的决策。这立即揭示了对从业者以及金融研究和社会科学领域的从业者的多种含义:研究人员可以使用R提取与读者相关的文本成分,并在此基础上检验其假设。同样,从业人员可以衡量哪种措辞对他们的读者而言实际上很重要,并相应地提高他们的写作水平(Pröllochs,Feuerriegel和Neumann 2015)。在下面的两个案例研究中,我们从金融和社会科学中论证了增加的收益。

应用

几个应用程序演示了情感分析在组织和企业中的用途:

  • 金融: 金融市场的投资者在行使股票所有权之前,会以金融新闻披露的形式参考文本信息。有趣的是,它们不仅依赖数据,而且还依赖信息,例如语气和情感(Henry 2008; Loughran和McDonald 2011; Tetlock 2007),从而极大地影响了股价。通过利用情感分析,自动化交易者可以分析财务披露中传达的情感,以便进行投资决策。

  • 市场营销: 市场营销部门通常对跟踪品牌形象感兴趣。为此,他们从社交媒体上收集了大量用户意见,并评估个人对品牌,产品和服务的感受。

  • 评级和评论平台: 评级和评论平台通过收集用户对某些产品和服务的评级或偏好来实现有价值的功能。在这里,人们可以自动处理大量用户生成的内容(UGC)并利用由此获得的知识。例如,人们可以确定哪些提示传达了积极或者负面的意见,甚至可以自动验证其可信度。

情感分析方法

随着情感分析被应用于广泛的领域和文本来源,研究已经设计出各种测量情感的方法。最近的文献综述(Pang and Lee 2008)提供了一个全面的,与领域无关的调查。

一方面,当机器学习方法追求高预测性能时,它是首选。但是,机器学习通常充当黑匣子,从而使解释变得困难。另一方面,基于字典的方法会生成肯定和否定单词的列表。然后,将这些单词的相应出现组合为单个情感评分。因此,基本的决定变得可追溯,研究人员可以理解导致特定情感的因素。

另外, SentimentAnalysis 允许生成定制的字典。它们针对特定领域进行了定制,与纯字典相比,提高了预测性能,并具有完全的可解释性。可以在(Pröllochs,Feuerriegel和Neumann 2018)中找到此方法的详细信息。

在执行情感分析的过程中,必须将正在运行的文本转换为一种机器可读的格式。这是通过执行一系列预处理操作来实现的。首先,将文本标记为单个单词,然后执行常见的预处理步骤:停用词的删除,词干,标点符号的删除以及小写的转换。这些操作也默认在中进行 SentimentAnalysis,但可以根据个人需要进行调整。

 

简短示范


  
  1. # 分析单个字符极性(正/负)
  2. anaSen( "是的,这对德国队来说是一场很棒的足球比赛!")

  
  1. # # [1] positive
  2. # # Levels: negative positive

  
  1. # 创建字符串向量
  2. documents <- c( "哇,我真的很喜欢新的轻型军刀!"
  3. "那本书很棒。"
  4. "R是一种很棒的语言。"
  5. "这家餐厅的服务很糟糕。"
  6. "这既不是正面也不是负面。"
  7. "服务员忘了我的甜点-多么糟糕的服务!")
  8. # 分析情感
  9. anaSen(documents)
  10. # 根据QDAP词典提取基于词典的情感
  11. sentiment $SentimentQDAP
## [1]  0.3333333  0.5000000  0.5000000 -0.3333333  0.0000000 -0.4000000

  
  1. #查看情感方向(即正面,中性和负面)
  2. ToDirection(sentiment$SentimentQDAP)

  
  1. # # [1] positive positive positive negative neutral negative
  2. # # Levels: negative neutral positive

  
  1. response <- c(+ 1, + 1, + 1, - 1, 0, - 1)
  2. comToRne(sentiment, response)

  
  1. ## WordCount SentimentGI NegativityGI
  2. ## cor -0 .18569534 0 .990011498 -9 .974890e-01
  3. ## cor .t .statistic -0 .37796447 14 .044046450 -2 .816913e+01
  4. ## cor .p .value 0 .72465864 0 .000149157 9 .449687e-06
  5. ## lm .t .value -0 .37796447 14 .044046450 -2 .816913e+01
  6. ## r .squared 0 .03448276 0 .980122766 9 .949843e-01
  7. ## RMSE 3 .82970843 0 .450102869 1 .186654e+00
  8. ## MAE 3 .33333333 0 .400000000 1 .100000e+00
  9. ## Accuracy 0 .66666667 1 .000000000 6 .666667e-01
  10. ## Precision NaN 1 .000000000 NaN
  11. ## Sensitivity 0 .00000000 1 .000000000 0 .000000e+00
  12. ## Specificity 1 .00000000 1 .000000000 1 .000000e+00
  13. ## F1 0 .00000000 0 .500000000 0 .000000e+00
  14. ## BalancedAccuracy 0 .50000000 1 .000000000 5 .000000e-01
  15. ## avg .sentiment .pos .response 3 .25000000 0 .333333333 8 .333333e-02
  16. ## avg .sentiment .neg .response 4 .00000000 -0 .633333333 6 .333333e-01
  17. ## PositivityGI SentimentHE NegativityHE
  18. ## cor 0 .942954167 0 .4152274 -0 .083045480
  19. ## cor .t .statistic 5 .664705543 0 .9128709 -0 .166666667
  20. ## cor .p .value 0 .004788521 0 .4129544 0 .875718144
  21. ## lm .t .value 5 .664705543 0 .9128709 -0 .166666667
  22. ## r .squared 0 .889162562 0 .1724138 0 .006896552
  23. ## RMSE 0 .713624032 0 .8416254 0 .922958207
  24. ## MAE 0 .666666667 0 .7500000 0 .888888889
  25. ## Accuracy 0 .666666667 0 .6666667 0 .666666667
  26. ## Precision NaN NaN NaN
  27. ## Sensitivity 0 .000000000 0 .0000000 0 .000000000
  28. ## Specificity 1 .000000000 1 .0000000 1 .000000000
  29. ## F1 0 .000000000 0 .0000000 0 .000000000
  30. ## BalancedAccuracy 0 .500000000 0 .5000000 0 .500000000
  31. ## avg .sentiment .pos .response 0 .416666667 0 .1250000 0 .083333333
  32. ## avg .sentiment .neg .response 0 .000000000 0 .0000000 0 .000000000
  33. ## PositivityHE SentimentLM NegativityLM
  34. ## cor 0 .3315938 0 .7370455 -0 .40804713
  35. ## cor .t .statistic 0 .7029595 2 .1811142 -0 .89389841
  36. ## cor .p .value 0 .5208394 0 .0946266 0 .42189973
  37. ## lm .t .value 0 .7029595 2 .1811142 -0 .89389841
  38. ## r .squared 0 .1099545 0 .5432361 0 .16650246
  39. ## RMSE 0 .8525561 0 .7234178 0 .96186547
  40. ## MAE 0 .8055556 0 .6333333 0 .92222222
  41. ## Accuracy 0 .6666667 0 .8333333 0 .66666667
  42. ## Precision NaN 1 .0000000 NaN
  43. ## Sensitivity 0 .0000000 0 .5000000 0 .00000000
  44. ## Specificity 1 .0000000 1 .0000000 1 .00000000
  45. ## F1 0 .0000000 0 .3333333 0 .00000000
  46. ## BalancedAccuracy 0 .5000000 0 .7500000 0 .50000000
  47. ## avg .sentiment .pos .response 0 .2083333 0 .2500000 0 .08333333
  48. ## avg .sentiment .neg .response 0 .0000000 -0 .1000000 0 .10000000
  49. ## PositivityLM RatioUncertaintyLM SentimentQDAP
  50. ## cor 0 .6305283 NA 0 .9865356369
  51. ## cor .t .statistic 1 .6247248 NA 12 .0642877257
  52. ## cor .p .value 0 .1795458 NA 0 .0002707131
  53. ## lm .t .value 1 .6247248 NA 12 .0642877257
  54. ## r .squared 0 .3975659 NA 0 .9732525629
  55. ## RMSE 0 .7757911 0 .9128709 0 .5398902495
  56. ## MAE 0 .7222222 0 .8333333 0 .4888888889
  57. ## Accuracy 0 .6666667 0 .6666667 1 .0000000000
  58. ## Precision NaN NaN 1 .0000000000
  59. ## Sensitivity 0 .0000000 0 .0000000 1 .0000000000
  60. ## Specificity 1 .0000000 1 .0000000 1 .0000000000
  61. ## F1 0 .0000000 0 .0000000 0 .5000000000
  62. ## BalancedAccuracy 0 .5000000 0 .5000000 1 .0000000000
  63. ## avg .sentiment .pos .response 0 .3333333 0 .0000000 0 .3333333333
  64. ## avg .sentiment .neg .response 0 .0000000 0 .0000000 -0 .3666666667
  65. ## NegativityQDAP PositivityQDAP
  66. ## cor -0 .944339551 0 .942954167
  67. ## cor .t .statistic -5 .741148345 5 .664705543
  68. ## cor .p .value 0 .004560908 0 .004788521
  69. ## lm .t .value -5 .741148345 5 .664705543
  70. ## r .squared 0 .891777188 0 .889162562
  71. ## RMSE 1 .068401367 0 .713624032
  72. ## MAE 1 .011111111 0 .666666667
  73. ## Accuracy 0 .666666667 0 .666666667
  74. ## Precision NaN NaN
  75. ## Sensitivity 0 .000000000 0 .000000000
  76. ## Specificity 1 .000000000 1 .000000000
  77. ## F1 0 .000000000 0 .000000000
  78. ## BalancedAccuracy 0 .500000000 0 .500000000
  79. ## avg .sentiment .pos .response 0 .083333333 0 .416666667
  80. ## avg .sentiment .neg .response 0 .366666667 0 .000000000

  
  1. ## WordCount SentimentGI NegativityGI PositivityGI
  2. ## Accuracy 0 .6666667 1 .0000000 0 .66666667 0 .6666667
  3. ## Precision NaN 1 .0000000 NaN NaN
  4. ## Sensitivity 0 .0000000 1 .0000000 0 .00000000 0 .0000000
  5. ## Specificity 1 .0000000 1 .0000000 1 .00000000 1 .0000000
  6. ## F1 0 .0000000 0 .5000000 0 .00000000 0 .0000000
  7. ## BalancedAccuracy 0 .5000000 1 .0000000 0 .50000000 0 .5000000
  8. ## avg .sentiment .pos .response 3 .2500000 0 .3333333 0 .08333333 0 .4166667
  9. ## avg .sentiment .neg .response 4 .0000000 -0 .6333333 0 .63333333 0 .0000000
  10. ## SentimentHE NegativityHE PositivityHE
  11. ## Accuracy 0 .6666667 0 .66666667 0 .6666667
  12. ## Precision NaN NaN NaN
  13. ## Sensitivity 0 .0000000 0 .00000000 0 .0000000
  14. ## Specificity 1 .0000000 1 .00000000 1 .0000000
  15. ## F1 0 .0000000 0 .00000000 0 .0000000
  16. ## BalancedAccuracy 0 .5000000 0 .50000000 0 .5000000
  17. ## avg .sentiment .pos .response 0 .1250000 0 .08333333 0 .2083333
  18. ## avg .sentiment .neg .response 0 .0000000 0 .00000000 0 .0000000
  19. ## SentimentLM NegativityLM PositivityLM
  20. ## Accuracy 0 .8333333 0 .66666667 0 .6666667
  21. ## Precision 1 .0000000 NaN NaN
  22. ## Sensitivity 0 .5000000 0 .00000000 0 .0000000
  23. ## Specificity 1 .0000000 1 .00000000 1 .0000000
  24. ## F1 0 .3333333 0 .00000000 0 .0000000
  25. ## BalancedAccuracy 0 .7500000 0 .50000000 0 .5000000
  26. ## avg .sentiment .pos .response 0 .2500000 0 .08333333 0 .3333333
  27. ## avg .sentiment .neg .response -0 .1000000 0 .10000000 0 .0000000
  28. ## RatioUncertaintyLM SentimentQDAP NegativityQDAP
  29. ## Accuracy 0 .6666667 1 .0000000 0 .66666667
  30. ## Precision NaN 1 .0000000 NaN
  31. ## Sensitivity 0 .0000000 1 .0000000 0 .00000000
  32. ## Specificity 1 .0000000 1 .0000000 1 .00000000
  33. ## F1 0 .0000000 0 .5000000 0 .00000000
  34. ## BalancedAccuracy 0 .5000000 1 .0000000 0 .50000000
  35. ## avg .sentiment .pos .response 0 .0000000 0 .3333333 0 .08333333
  36. ## avg .sentiment .neg .response 0 .0000000 -0 .3666667 0 .36666667
  37. ## PositivityQDAP
  38. ## Accuracy 0 .6666667
  39. ## Precision NaN
  40. ## Sensitivity 0 .0000000
  41. ## Specificity 1 .0000000
  42. ## F1 0 .0000000
  43. ## BalancedAccuracy 0 .5000000
  44. ## avg .sentiment .pos .response 0 .4166667
  45. ## avg .sentiment .neg .response 0 .0000000

从文本挖掘中执行了一组预处理操作。将标记每个文档,最后将输入转换为文档项矩阵。

 

输入

提供了具有其他几种输入格式的接口,其中包括

  • 字符串向量。

  • tm 软件包中实现的DocumentTermMatrix和 TermDocumentMatrix(Feinerer,Hornik和Meyer 2008)。

  • tm 软件包实现的语料库对象 (Feinerer,Hornik和Meyer 2008)。

我们在下面提供示例。

向量的字符串


  
  1. documents <- c( "这很好"
  2. "这不好"
  3. "这介于两者之间")
  4. convertToDirection( analyzeSentiment( documents)$SentimentQDAP)

  
  1. # # [1] positive negative neutral
  2. # # Levels: negative neutral positive

文档词语矩阵


  
  1. corpus <- VCorpus( VectorSource( documents))
  2. convertToDirection( analyzeSentiment( corpus)$SentimentQDAP)

  
  1. # # [1] positive negative neutral
  2. # # Levels: negative neutral positive

语料库对象


  
  1. # # [1] positive negative neutral
  2. # # Levels: negative neutral positive

可以直接与文档术语矩阵一起使用,因此一开始就可以使用自定义的预处理操作。之后,可以计算情感分数。例如,可以使用其他列表中的停用词替换停用词。

字典

可区分三种不同类型的词典。它们所存储的数据各不相同,这些数据最终还控制着可以应用哪种情感分析方法。字典如下:

  • SentimentDictionaryWordlist 包含属于一个类别的单词列表。

  • SentimentDictionaryBinary 存储两个单词列表,一个用于肯定条目,一个用于否定条目。

  • SentimentDictionaryWeighted 允许单词的情感评分。

情感词典词表


  
  1. # 替代
  2. d <- Dictionary(c(“不确定”,“可能”,“有可能”))
  3. summary(d)

  
  1. # # Dictionary type: word list (single set)
  2. # # Total entries: 3

情感词典


  
  1. d <- DictionaryBin( c(“增加”,“上升”,“更多”),
  2. c(“下降”))
  3. summary( d)

  
  1. # # Dictionary type: binary (positive / negative)
  2. # # Total entries: 5
  3. # # Positive entries: 3 (60%)
  4. # # Negative entries: 2 (40%)

情感词典加权


  
  1. d <- SentimentDictionaryWeighted( c(“增加”,“减少”,“退出”),
  2. c( +1, -1, -10),
  3. rep( NA, 3))
  4. summary( d)

  
  1. # # Dictionary type: weighted (words with individual scores)
  2. # # Total entries: 3
  3. # # Positive entries: 1 (33.33%)
  4. # # Negative entries: 2 (66.67%)
  5. # # Neutral entries: 0 (0%)
  6. # #
  7. # # Details
  8. # # Average score: -3.333333
  9. # # Median: -1
  10. # # Min: -10
  11. # # Max: 1
  12. # # Standard deviation: 5.859465
  13. # # Skewness: -0.6155602

  
  1. d <- SentimentDictionary( c(“增加”,“减少”,“退出”),
  2. c( +1, -1, -10),
  3. rep( NA, 3))
  4. summary( d)

  
  1. # # Dictionary type: weighted (words with individual scores)
  2. # # Total entries: 3
  3. # # Positive entries: 1 (33.33%)
  4. # # Negative entries: 2 (66.67%)
  5. # # Neutral entries: 0 (0%)
  6. # #
  7. # # Details
  8. # # Average score: -3.333333
  9. # # Median: -1
  10. # # Min: -10
  11. # # Max: 1
  12. # # Standard deviation: 5.859465
  13. # # Skewness: -0.6155602

字典生成

用向量的形式表示因变量。此外,变量给出了单词在文档中出现的次数。然后,该方法估计具有截距和系数的线性模型。估计基于LASSO正则化,它执行变量选择。这样,它将某些系数设置为正好为零。然后可以根据剩余单词的系数按极性对它们进行排序。


  
  1. # 创建字符串向量
  2. documents <- c(“这是一件好事!”,
  3. “这是一件非常好的事!”,
  4. “没关系。”
  5. “这是一件坏事。”,
  6. “这是一件非常不好的事情。”
  7. )
  8. response <- c(1, 0.5 , 0 , -0.5 , -1 )
  9. # 使用LASSO正则化生成字典
  10. dict

  
  1. # # Type: weighted (words with individual scores)
  2. # # Intercept: 5.55333e-05
  3. # # -0.51 bad
  4. # # 0.51 good
summary(dict)

  
  1. # # Dictionary type: weighted (words with individual scores)
  2. # # Total entries: 2
  3. # # Positive entries: 1 (50%)
  4. # # Negative entries: 1 (50%)
  5. # # Neutral entries: 0 (0%)
  6. # #
  7. # # Details
  8. # # Average score: -5.251165e-05
  9. # # Median: -5.251165e-05
  10. # # Min: -0.5119851
  11. # # Max: 0.5118801
  12. # # Standard deviation: 0.7239821
  13. # # Skewness: 0

有几种微调选项。只需更改参数,就可以用弹性网络模型替换LASSO  。

最后,可以使用read() 和 保存和重新加载字典 write()

评估

最终,例程允许人们进一步挖掘生成的字典。一方面,可以通过summary() 例程显示简单的概述 。另一方面,核密度估计也可以可视化正词和负词的分布。


  
  1. # # Comparing: wordlist vs weighted
  2. # #
  3. # # Total unique words: 4213
  4. # # Matching entries: 2 (0.0004747211%)
  5. # # Entries with same classification: 0 (0%)
  6. # # Entries with different classification: 2 (0.0004747211%)
  7. # # Correlation between scores of matching entries: 1

  
  1. # # $totalUniqueWords
  2. # # [1] 4213
  3. # #
  4. # # $totalSameWords
  5. # # [1] 2
  6. # #
  7. # # $ratioSameWords
  8. # # [1] 0.0004747211
  9. # #
  10. # # $numWordsEqualClass
  11. # # [1] 0
  12. # #
  13. # # $numWordsDifferentClass
  14. # # [1] 2
  15. # #
  16. # # $ratioWordsEqualClass
  17. # # [1] 0
  18. # #
  19. # # $ratioWordsDifferentClass
  20. # # [1] 0.0004747211
  21. # #
  22. # # $correlation
  23. # # [1] 1

  
  1. # # Dictionary
  2. # # cor 0.94868330
  3. # # cor.t.statistic 5.19615237
  4. # # cor.p.value 0.01384683
  5. # # lm.t.value 5.19615237
  6. # # r.squared 0.90000000
  7. # # RMSE 0.23301039
  8. # # MAE 0.20001111
  9. # # Accuracy 1.00000000
  10. # # Precision 1.00000000
  11. # # Sensitivity 1.00000000
  12. # # Specificity 1.00000000
  13. # # F1 0.57142857
  14. # # BalancedAccuracy 1.00000000
  15. # # avg.sentiment.pos.response 0.45116801
  16. # # avg.sentiment.neg.response -0.67675202

下面的示例演示如何将计算出的字典用于预测样本外数据的情感。然后通过将其与内置词典进行比较来评估预测性能。


  
  1. test_documents <- c(“这既不是好事也不是坏事”,
  2. “真是好主意!”,
  3. “不错”
  4. )
  5. pred <- predict( dict, test_documents)

  
  1. # # Dictionary
  2. # # cor 5.922189e-05
  3. # # cor.t.statistic 5.922189e-05
  4. # # cor.p.value 9.999623e-01
  5. # # lm.t.value 5.922189e-05
  6. # # r.squared 3.507232e-09
  7. # # RMSE 8.523018e-01
  8. # # MAE 6.666521e-01
  9. # # Accuracy 3.333333e-01
  10. # # Precision 0.000000e+00
  11. # # Sensitivity NaN
  12. # # Specificity 3.333333e-01
  13. # # F1 0.000000e+00
  14. # # BalancedAccuracy NaN
  15. # # avg.sentiment.pos.response 1.457684e-05
  16. # # avg.sentiment.neg.response NaN


  
  1. ## WordCount SentimentGI NegativityGI
  2. ## cor -0 .8660254 -0 .18898224 0 .18898224
  3. ## cor .t .statistic -1 .7320508 -0 .19245009 0 .19245009
  4. ## cor .p .value 0 .3333333 0 .87896228 0 .87896228
  5. ## lm .t .value -1 .7320508 -0 .19245009 0 .19245009
  6. ## r .squared 0 .7500000 0 .03571429 0 .03571429
  7. ## RMSE 1 .8257419 1 .19023807 0 .60858062
  8. ## MAE 1 .3333333 0 .83333333 0 .44444444
  9. ## Accuracy 1 .0000000 0 .66666667 1 .00000000
  10. ## Precision NaN 0 .00000000 NaN
  11. ## Sensitivity NaN NaN NaN
  12. ## Specificity 1 .0000000 0 .66666667 1 .00000000
  13. ## F1 0 .0000000 0 .00000000 0 .00000000
  14. ## BalancedAccuracy NaN NaN NaN
  15. ## avg .sentiment .pos .response 2 .0000000 -0 .16666667 0 .44444444
  16. ## avg .sentiment .neg .response NaN NaN NaN
  17. ## PositivityGI SentimentHE NegativityHE
  18. ## cor -0 .18898224 -0 .18898224 NA
  19. ## cor .t .statistic -0 .19245009 -0 .19245009 NA
  20. ## cor .p .value 0 .87896228 0 .87896228 NA
  21. ## lm .t .value -0 .19245009 -0 .19245009 NA
  22. ## r .squared 0 .03571429 0 .03571429 NA
  23. ## RMSE 0 .67357531 0 .67357531 0 .8164966
  24. ## MAE 0 .61111111 0 .61111111 0 .6666667
  25. ## Accuracy 1 .00000000 1 .00000000 1 .0000000
  26. ## Precision NaN NaN NaN
  27. ## Sensitivity NaN NaN NaN
  28. ## Specificity 1 .00000000 1 .00000000 1 .0000000
  29. ## F1 0 .00000000 0 .00000000 0 .0000000
  30. ## BalancedAccuracy NaN NaN NaN
  31. ## avg .sentiment .pos .response 0 .27777778 0 .27777778 0 .0000000
  32. ## avg .sentiment .neg .response NaN NaN NaN
  33. ## PositivityHE SentimentLM NegativityLM
  34. ## cor -0 .18898224 -0 .18898224 0 .18898224
  35. ## cor .t .statistic -0 .19245009 -0 .19245009 0 .19245009
  36. ## cor .p .value 0 .87896228 0 .87896228 0 .87896228
  37. ## lm .t .value -0 .19245009 -0 .19245009 0 .19245009
  38. ## r .squared 0 .03571429 0 .03571429 0 .03571429
  39. ## RMSE 0 .67357531 1 .19023807 0 .60858062
  40. ## MAE 0 .61111111 0 .83333333 0 .44444444
  41. ## Accuracy 1 .00000000 0 .66666667 1 .00000000
  42. ## Precision NaN 0 .00000000 NaN
  43. ## Sensitivity NaN NaN NaN
  44. ## Specificity 1 .00000000 0 .66666667 1 .00000000
  45. ## F1 0 .00000000 0 .00000000 0 .00000000
  46. ## BalancedAccuracy NaN NaN NaN
  47. ## avg .sentiment .pos .response 0 .27777778 -0 .16666667 0 .44444444
  48. ## avg .sentiment .neg .response NaN NaN NaN
  49. ## PositivityLM RatioUncertaintyLM SentimentQDAP
  50. ## cor -0 .18898224 NA -0 .18898224
  51. ## cor .t .statistic -0 .19245009 NA -0 .19245009
  52. ## cor .p .value 0 .87896228 NA 0 .87896228
  53. ## lm .t .value -0 .19245009 NA -0 .19245009
  54. ## r .squared 0 .03571429 NA 0 .03571429
  55. ## RMSE 0 .67357531 0 .8164966 1 .19023807
  56. ## MAE 0 .61111111 0 .6666667 0 .83333333
  57. ## Accuracy 1 .00000000 1 .0000000 0 .66666667
  58. ## Precision NaN NaN 0 .00000000
  59. ## Sensitivity NaN NaN NaN
  60. ## Specificity 1 .00000000 1 .0000000 0 .66666667
  61. ## F1 0 .00000000 0 .0000000 0 .00000000
  62. ## BalancedAccuracy NaN NaN NaN
  63. ## avg .sentiment .pos .response 0 .27777778 0 .0000000 -0 .16666667
  64. ## avg .sentiment .neg .response NaN NaN NaN
  65. ## NegativityQDAP PositivityQDAP
  66. ## cor 0 .18898224 -0 .18898224
  67. ## cor .t .statistic 0 .19245009 -0 .19245009
  68. ## cor .p .value 0 .87896228 0 .87896228
  69. ## lm .t .value 0 .19245009 -0 .19245009
  70. ## r .squared 0 .03571429 0 .03571429
  71. ## RMSE 0 .60858062 0 .67357531
  72. ## MAE 0 .44444444 0 .61111111
  73. ## Accuracy 1 .00000000 1 .00000000
  74. ## Precision NaN NaN
  75. ## Sensitivity NaN NaN
  76. ## Specificity 1 .00000000 1 .00000000
  77. ## F1 0 .00000000 0 .00000000
  78. ## BalancedAccuracy NaN NaN
  79. ## avg .sentiment .pos .response 0 .44444444 0 .27777778
  80. ## avg .sentiment .neg .response NaN NaN

预处理

如果需要,可以实施适合特定需求的预处理阶段。如函数 ngram_tokenize() ,用于从语料库中提取n-gram。


  
  1. tdm <- TermDocumentMatrix( corpus,
  2. control=list( wordLengths=c( 1,Inf),
  3. tokenize=function( x) ngram_tokenize( x, char=FALSE,
  4. ngmin=1, ngmax=2)))

  
  1. # # Dictionary type: weighted (words with individual scores)
  2. # # Total entries: 7
  3. # # Positive entries: 4 (57.14%)
  4. # # Negative entries: 3 (42.86%)
  5. # # Neutral entries: 0 (0%)
  6. # #
  7. # # Details
  8. # # Average score: 5.814314e-06
  9. # # Median: 1.602469e-16
  10. # # Min: -0.4372794
  11. # # Max: 0.4381048
  12. # # Standard deviation: 0.301723
  13. # # Skewness: 0.00276835
dict

  
  1. # # Type: weighted (words with individual scores)
  2. # # Intercept: -5.102483e-05
  3. # # -0.44 不好
  4. # # -0.29 非常糟糕
  5. # # 0.29 好

性能优化

 


  
  1. # # SentimentLM
  2. # # 1 0.5
  3. # # 2 0.5
  4. # # 3 0.0
  5. # # 4 -0.5
  6. # # 5 -0.5

语言支持和可扩展性

 可以适应其他语言使用。为此,需要在两点上进行更改:

  • 预处理:使用参数 language="" 来执行所有预处理操作。

  • 字典: 可以使用附带的字典生成方法 。然后,这可以自动生成可应用于给定语言的正负词词典。

下面的示例使用德语示例。最后,我们进行情感分析。


  
  1. documents <- c( "Das ist ein gutes Resultat",
  2. "Das Ergebnis war schlecht")
  3. sentiment <- ana(documents,
  4. language= "german",
  5. sentiment

  
  1. # # GermanSentiment
  2. # # 1 0.0
  3. # # 2 -0.5

  
  1. # # [1] positive negative
  2. # # Levels: negative positive

同样,可以使用自定义情感分数来实现字典。


  
  1. woorden <- c( "goed", "slecht")
  2. scores <- c( 0. 8,- 0. 5)

  
  1. # # DutchSentiment
  2. # # 1 -0.5

 

实例

我们利用了tm 包中的路透社石油新闻 。


  
  1. # 分析情感
  2. sentiment <- ana(crude)
  3. # 计算正面和负面新闻发布数量
  4. table(coToB(sentiment $SentimentLM))

  
  1. # #
  2. # # negative positive
  3. # # 16 4

  
  1. # 情感最高和最低的新闻
## [1] "HOUSTON OIL <HO> RESERVES STUDY COMPLETED"
crude[[which.min(sentiment$SentimentLM)]]$meta$heading
## [1] "DIAMOND SHAMROCK (DIA) CUTS CRUDE PRICES"

  
  1. # 查看情感变量的摘要统计
  2. summary(sentiment$SentimentLM)

  
  1. ## Min. 1 st Qu. Median Mean 3 rd Qu. Max.
  2. ## -0 .08772 -0 .04366 -0 .02341 -0 .02953 -0 .01375 0 .00000

  
  1. # 可视化标准化情感变量的分布
  2. hist(scale(sentiment$SentimentLM))

# 计算相关

  
  1. ## SentimentLM SentimentHE SentimentQDAP
  2. ## SentimentLM 1 .0000000 0 .2769878 0 .4769730
  3. ## SentimentHE 0 .2769878 1 .0000000 0 .6141075
  4. ## SentimentQDAP 0 .4769730 0 .6141075 1 .0000000

  
  1. # 1987-02-26 1987-03-02之间的原油新闻
  2. plot(senti$Sentime)

plot(SenLM, x=date, cumsum=TRUE)

单词计算

对单词进行计数 。

#词(无停用词)

  
  1. # # WordCount
  2. # # 1 3
# 计算所有单词(包括停用词)

  
  1. # # WordCount
  2. # # 1 4

 

参考文献

Feinerer,Ingo,Kurt Hornik和David Meyer。2008年。“ R中的文本挖掘基础结构”。 统计软件杂志 25(5):1–54。

Tetlock,Paul C.,2007年。“将内容传递给投资者的情感:媒体在股票市场中的作用。” 金融杂志 62(3):1139–68。


最受欢迎的见解

1.探析大数据期刊文章研究热点

2.618网购数据盘点-剁手族在关注什么

3.r语言文本挖掘tf-idf主题建模,情感分析n-gram建模研究

4.python主题建模可视化lda和t-sne交互式可视化

5.疫情下的新闻数据观察

6.python主题lda建模和t-sne可视化

7.r语言中对文本数据进行主题模型topic-modeling分析

8.主题模型:数据聆听人民网留言板的那些“网事”

9.python爬虫进行web抓取lda主题语义数据分析

 


转载:https://blog.csdn.net/qq_19600291/article/details/105871129
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场