0Pricing
R Academy · บทเรียน

การวิเคราะห์ความรู้สึกใน R

เชื่อมโทเคนกับพจนานุกรมความรู้สึกเพื่อวัดโทนเชิงบวกหรือเชิงลบ

การวิเคราะห์ความรู้สึกใน R เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมการวิเคราะห์ความรู้สึก

การวิเคราะห์ความรู้สึกกำหนดอารมณ์เชิงบวกหรือลบให้กับข้อความ แนวทางของ tidytext จะจับคู่คำแต่ละคำกับ พจนานุกรมความรู้สึก แล้วรวมคะแนนเข้าด้วยกัน มีพจนานุกรมในตัวสามชุด ได้แก่ AFINN (คะแนนตัวเลข), Bing (บวก/ลบ) และ NRC (หมวดหมู่อารมณ์)

library(tidytext)

# Available sentiment lexicons
# AFINN: -5 to +5 numeric score
# Bing:  binary positive/negative
# NRC:   emotion categories (joy, fear, anger, ...)

# Preview AFINN
afinn_sample <- get_sentiments('afinn')
cat('AFINN rows:', nrow(afinn_sample), '\n')
cat('Score range:', range(afinn_sample$value), '\n')
print(head(afinn_sample, 5))

get_sentiments('afinn')

พจนานุกรม AFINN กำหนดคะแนนจำนวนเต็มตั้งแต่ −5 (เชิงลบมาก) ถึง +5 (เชิงบวกมาก) ให้กับคำภาษาอังกฤษ 2,477 คำ พจนานุกรมนี้จัดทำโดย Finn Årup Nielsen และทำงานได้ดีสำหรับข้อความจากสื่อสังคมออนไลน์และบทวิจารณ์

library(tidytext)
library(dplyr)

afinn <- get_sentiments('afinn')

# Most positive and most negative words
cat('Most positive words:\n')
print(afinn |> slice_max(value, n = 5))

cat('\nMost negative words:\n')
print(afinn |> slice_min(value, n = 5))

# Score distribution
cat('\nScore distribution:\n')
print(table(afinn$value))

get_sentiments('bing')

พจนานุกรม Bing (โดย Bing Liu และคณะ) จำแนกคำ 6,786 คำเป็น เชิงบวก หรือ เชิงลบ พจนานุกรมนี้มีขนาดใหญ่กว่า AFINN และเหมาะกับบทวิจารณ์สินค้าและความคิดเห็นของลูกค้า ซึ่งการพิจารณาขั้วความรู้สึกแบบง่าย ๆ ก็เพียงพอ

library(tidytext)
library(dplyr)

bing <- get_sentiments('bing')

cat('Bing lexicon size:', nrow(bing), '\n')
cat('Positive words:', sum(bing$sentiment == 'positive'), '\n')
cat('Negative words:', sum(bing$sentiment == 'negative'), '\n')

# Sample positive and negative words
cat('\nSample positive:', head(bing$word[bing$sentiment == 'positive'], 8), '\n')
cat('Sample negative:', head(bing$word[bing$sentiment == 'negative'], 8), '\n')

inner_join: การให้คะแนนคำ

inner_join(tokens, afinn, by = 'word') จะเก็บเฉพาะโทเค็นที่ปรากฏในคลังคำศัพท์ AFINN และเพิ่มคะแนนของคำเหล่านั้น คำที่ไม่มีอยู่ในคลังคำศัพท์จะถูกตัดออกโดยไม่มีการแจ้งให้ทราบ ซึ่งเป็นทั้งจุดแข็ง (ช่วยเน้นคำที่ทราบว่ามีอารมณ์ความรู้สึก) และข้อจำกัด

library(tidytext)
library(dplyr)

reviews <- tibble::tibble(
  review_id = 1:3,
  text = c(
    'The product is excellent and outstanding quality',
    'Terrible experience, broken and disappointing',
    'Good value but slow delivery, acceptable overall'
  )
)

scored <- reviews |>
  unnest_tokens(word, text) |>
  inner_join(get_sentiments('afinn'), by = 'word')

cat('Scored words:\n')
print(scored[, c('review_id', 'word', 'value')])

อารมณ์ความรู้สึกสุทธิต่อเอกสาร

รวมคะแนน AFINN ของแต่ละเอกสารด้วย group_by(document) |> summarise(sentiment = sum(value)) เพื่อหาคะแนนอารมณ์ความรู้สึกสุทธิ ผลรวมที่เป็นบวกแสดงถึงอารมณ์ความรู้สึกโดยรวมในเชิงบวก ส่วนผลรวมที่เป็นลบแสดงถึงอารมณ์ความรู้สึกในเชิงลบ

library(tidytext)
library(dplyr)

reviews <- tibble::tibble(
  review_id = 1:5,
  text = c(
    'excellent outstanding perfect love best amazing',
    'terrible broken horrible awful waste money',
    'good acceptable okay decent average',
    'brilliant fantastic outstanding love recommend',
    'poor bad disappointing slow useless'
  )
)

net_sentiment <- reviews |>
  unnest_tokens(word, text) |>
  inner_join(get_sentiments('afinn'), by = 'word') |>
  group_by(review_id) |>
  summarise(
    sentiment  = sum(value),
    word_count = n()
  ) |>
  mutate(polarity = ifelse(sentiment > 0, 'positive', 'negative'))

print(net_sentiment)

อารมณ์ความรู้สึกแบบ Bing: จำนวนคำบวกเทียบกับคำลบ

เมื่อใช้คลังคำศัพท์ Bing ให้เปรียบเทียบจำนวนคำบวกและคำลบในแต่ละเอกสาร คำนวณ sentiment = positive_n - negative_n เพื่อหาคะแนนขั้วอารมณ์สุทธิ หรือแสดงจำนวนทั้งสองเป็นแท่งแบบจัดกลุ่มเพื่อดูองค์ประกอบ

library(tidytext)
library(dplyr)

corpus <- tibble::tibble(
  chapter = 1:4,
  text = c(
    'the hero was brave courageous strong and victorious in battle',
    'disaster struck terrible losses failure defeat mourning grief',
    'love joy happiness beautiful peaceful wonderful morning',
    'evil darkness corrupt wicked terrible pain suffering fear'
  )
)

bing_sentiment <- corpus |>
  unnest_tokens(word, text) |>
  inner_join(get_sentiments('bing'), by = 'word') |>
  count(chapter, sentiment) |>
  tidyr::pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) |>
  mutate(net = positive - negative)

print(bing_sentiment)

อารมณ์ความรู้สึกตามบทหรือส่วน

หากต้องการติดตามอารมณ์ความรู้สึกตลอดเส้นเรื่อง ให้คำนวณอารมณ์ความรู้สึกสุทธิในแต่ละบทหรือในหน้าต่างเลื่อน วิธีนี้จะแสดงโครงสร้างทางอารมณ์ ได้แก่ การพัฒนาเรื่อง จุดไคลแมกซ์ และบทสรุป ใช้ ggplot2 ร่วมกับ geom_line() หรือ geom_bar() เพื่อแสดงภาพเส้นเรื่อง

library(tidytext)
library(dplyr)
library(ggplot2)

# Simulate a 10-chapter story arc
set.seed(42)
chapters <- tibble::tibble(
  chapter = 1:10,
  text    = c(
    'peaceful beautiful joy love happy wonderful',
    'good friends happy carefree enjoyable fun',
    'worried anxious trouble fear uncertain dark',
    'danger terrible threat awful pain suffering',
    'fear horror disaster terrible devastation loss',
    'fight battle struggle hard difficult challenge',
    'hope courage determination brave strong resist',
    'triumph victory success celebrate joy love',
    'relief peace gratitude wonderful blessed happy',
    'love joy peace beautiful grateful wonderful'
  )
)

arc <- chapters |>
  unnest_tokens(word, text) |>
  inner_join(get_sentiments('afinn'), by = 'word') |>
  group_by(chapter) |>
  summarise(net_sentiment = sum(value))

ggplot(arc, aes(chapter, net_sentiment)) +
  geom_line(color = 'steelblue', linewidth = 1.2) +
  geom_hline(yintercept = 0, linetype = 'dashed') +
  labs(x = 'Chapter', y = 'Net Sentiment', title = 'Story Sentiment Arc') +
  theme_minimal()

คลังคำศัพท์ NRC: หมวดหมู่อารมณ์

คลังคำศัพท์ NRC (โดย Saif Mohammad และ Peter Turney) จัดหมวดหมู่คำ 13,901 คำเป็นอารมณ์ 8 ประเภท (ความโกรธ ความคาดหวัง ความรังเกียจ ความกลัว ความยินดี ความเศร้า ความประหลาดใจ และความไว้วางใจ) รวมทั้งประเภทบวกและลบ กรองตามอารมณ์ด้วย filter(sentiment == 'joy')

library(tidytext)
library(dplyr)

nrc <- get_sentiments('nrc')
cat('NRC size:', nrow(nrc), '\n')
cat('Emotions:', paste(unique(nrc$sentiment), collapse = ', '), '\n')

# Words associated with 'joy'
joy_words <- nrc |> filter(sentiment == 'joy')
cat('\nJoy words:', nrow(joy_words), '\n')
cat('Sample:', head(joy_words$word, 10), '\n')

# Count words per emotion
nrc |>
  count(sentiment, sort = TRUE) |>
  print()

การใช้ NRC กับคลังข้อความ

เชื่อมข้อความที่แบ่งเป็นโทเค็นแล้วเข้ากับ NRC เพื่อให้คะแนนแต่ละอารมณ์แยกกัน รวมผลตามเอกสารและอารมณ์ด้วย count(doc_id, sentiment) เพื่อดูว่าอารมณ์ใดมีสัดส่วนเด่นในแต่ละเอกสาร

library(tidytext)
library(dplyr)

docs <- tibble::tibble(
  doc_id = c(1, 1, 2, 2, 3, 3),
  text   = c(
    'wonderful joyful happy love peace',
    'excited surprise anticipation trust',
    'fear anger terrible hate disgust',
    'dark horrible awful suffering pain',
    'curious wonder discovery learning',
    'hope trust anticipation future growth'
  )
)

nrc_scores <- docs |>
  unnest_tokens(word, text) |>
  inner_join(get_sentiments('nrc'), by = 'word') |>
  filter(!sentiment %in% c('positive', 'negative')) |>  # keep only emotions
  count(doc_id, sentiment, sort = TRUE)

cat('Emotion counts per document:\n')
print(nrc_scores)

แนวคิดของกลุ่มเมฆคำ

กลุ่มเมฆคำแสดงความถี่ของคำ โดยปรับขนาดข้อความให้แปรผันตามจำนวนครั้งที่ปรากฏ แพ็กเกจ wordcloud หรือ wordcloud2 สามารถสร้างกลุ่มเมฆคำจากกรอบข้อมูลคำและความถี่ได้ กำหนดสีคำตามอารมณ์ความรู้สึกโดยใช้คลังคำศัพท์ Bing เพื่อสร้างกลุ่มเมฆคำที่มีสีสื่ออารมณ์

library(tidytext)
library(dplyr)

# Prepare word frequencies coloured by Bing sentiment
corpus_text <- tibble::tibble(
  text = c(
    'excellent performance amazing results love beautiful',
    'terrible failure poor broken horrible waste',
    'brilliant outstanding success happy wonderful joy',
    'awful disappointing bad slow useless frustrating'
  )
)

word_freq <- corpus_text |>
  unnest_tokens(word, text) |>
  count(word, sort = TRUE) |>
  left_join(get_sentiments('bing'), by = 'word') |>
  mutate(
    sentiment = replace(sentiment, is.na(sentiment), 'neutral'),
    colour    = case_when(
      sentiment == 'positive' ~ '#2196F3',
      sentiment == 'negative' ~ '#F44336',
      TRUE                    ~ '#9E9E9E'
    )
  )

print(word_freq)
# In practice: wordcloud2(word_freq[, c('word','n')], color = word_freq$colour)

ข้อจำกัดของการวิเคราะห์อารมณ์ด้วยคลังคำศัพท์

การวิเคราะห์อารมณ์ด้วยคลังคำศัพท์มีกรณีที่ทำงานผิดพลาดซึ่งทราบกันดี ได้แก่ การปฏิเสธ ("not good" ถูกให้คะแนนเป็นบวก) การเสียดสี ("โอ้ เยี่ยม มีข้อบกพร่องอีกแล้ว") ความไม่ตรงกันของขอบเขตการใช้งาน ("sick" มีความหมายเชิงบวกในภาษาสแลง) และคำที่ไม่มีอยู่ในคลังคำศัพท์ โปรดคำนึงถึงข้อจำกัดเหล่านี้เมื่อตีความผลลัพธ์

library(tidytext)
library(dplyr)

# Negation problem
neg_examples <- tibble::tibble(
  text = c(
    'not good at all',   # negative, but 'good' scores +3
    'not bad',           # positive, but 'bad' scores -3
    'sick beats bro'     # slang positive, 'sick' is negative in AFINN
  )
)

scored <- neg_examples |>
  unnest_tokens(word, text) |>
  inner_join(get_sentiments('afinn'), by = 'word')

cat('Lexicon scores (naive - ignores negation):\n')
print(scored[, c('word', 'value')])
cat('\nNote: "not" is a stop word - the negation is lost!\n')

ตรวจสอบความเข้าใจอย่างรวดเร็ว

คุณใช้ inner_join(tokens, afinn, by = 'word') เพื่อให้คะแนนอารมณ์ความรู้สึก จะเกิดอะไรขึ้นกับคำในโทเค็นของคุณที่ไม่อยู่ในคลังคำศัพท์ AFINN?

ทบทวน: การวิเคราะห์อารมณ์ความรู้สึก

ประเด็นสำคัญ:

  • คลังคำศัพท์หลักสามประเภท: AFINN (คะแนน −5 ถึง +5), Bing (บวก/ลบ) และ NRC (อารมณ์ 8 ประเภท)
  • get_sentiments('afinn') / 'bing' / 'nrc' เรียกคืนคลังคำศัพท์ในรูปทิบเบิล
  • inner_join(tokens, lexicon, by = 'word') ให้คะแนนเฉพาะคำที่จับคู่ได้ (คำที่จับคู่ไม่ได้จะถูกตัดออก)
  • อารมณ์ความรู้สึกสุทธิ = group_by(doc) |> summarise(sentiment = sum(value))
  • Bing: เปรียบเทียบจำนวนคำ positive - negative ในแต่ละเอกสารหรือส่วน
  • NRC: กรองตามชื่ออารมณ์เพื่อแยกความกลัว ความยินดี ความโกรธ และอื่น ๆ
  • ข้อจำกัดสำคัญ: วิธีที่ใช้คลังคำศัพท์ไม่รองรับการปฏิเสธ การเสียดสี หรือภาษาสแลงเฉพาะสาขาได้ดี
library(tidytext)
library(dplyr)

tibble::tibble(text = 'excellent amazing love joy beautiful happy') |>
  unnest_tokens(word, text) |>
  inner_join(get_sentiments('afinn'), by = 'word') |>
  summarise(net_sentiment = sum(value)) |>
  print()

คำถามที่พบบ่อย

บทเรียน “การวิเคราะห์ความรู้สึกใน R” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การวิเคราะห์ความรู้สึกใน R” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การวิเคราะห์ความรู้สึกใน R”

เชื่อมโทเคนกับพจนานุกรมความรู้สึกเพื่อวัดโทนเชิงบวกหรือเชิงลบ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การวิเคราะห์ความรู้สึกใน R” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตัดคำเป็นโทเคนและการลบคำหยุด
  2. TF-IDF และการวิเคราะห์ความถี่ของคำ
  3. การวิเคราะห์ความรู้สึกใน R
  4. การสร้างโมเดลหัวข้อด้วย LDA
← กลับไปที่ R Academy