R语言非结构化文本挖掘入门指南

文本挖掘(Text Mining),也称为文本分析(Text Analytics),是从非结构化文本数据中提取有意义的见解。全球约80%的数据是非结构化的。本篇博客将探讨文本挖掘和网络爬取的关键概念及基于R的实用技术。

什么是文本挖掘?

文本挖掘利用计算技术从非结构化文本源(如书籍、报告、文章、博客和社交媒体帖子)中提取结构化信息。它能够自动化地从海量数据集中发现知识,实现文本摘要和分析。

关键点:

  • 非结构化文本:自由格式的数据(如电子邮件、社交媒体、文档)
  • 目标:提取高质量的结构化信息进行分析
  • 应用:情感分析、主题建模、信息检索

使用R的tm包提取文本

R语言中的tm(text mining)包是一个强大的文本挖掘工具,其核心数据结构是语料库(corpus)------文本文档的集合。语料库支持批量处理多个文档。

语料库类型:

  • VCorpus(易失性语料库):临时存储在内存中,R会话结束时删除
  • PCorpus(永久性语料库):存储在外部,跨会话持久化

预定义数据源:

  • DirSource:从目录读取文本
  • VectorSource:处理向量中的文本
  • DataframeSource:处理类似数据框的结构

示例:使用VectorSource创建语料库

以下代码从文本字符串向量创建易失性语料库并检查其内容。

R 复制代码
library(tm)
texts <- c("Hi!", "Welcome to My Blog!", "Blog1, 2, 3.....")
mytext <- VectorSource(texts)
mycorpus <- VCorpus(mytext)
inspect(mycorpus)
as.character(mycorpus[[1]])

说明:

  • inspect(mycorpus) 打印VCorpus对象的结构和元数据。此例中显示VCorpus包含3个文档,每个都是长度分别为3、19和16的PlainTextDocument
  • as.character(mycorpus[[2]]) 将语料库中的第二个文档转换为字符向量。此例中返回"Welcome to My Blog!"。[[]]用于访问R列表中的元素,由于语料库本质上是文档列表,因此这是访问单个文档的方式
R 复制代码
<<VCorpus>>
Metadata:  corpus specific: 0, document level (indexed): 0
Content:  documents: 3

[[1]]
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 3

[[2]]
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 19

[[3]]
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 16

网络爬取文本数据

网络爬取从网站检索数据,通常需要解析HTML以提取相关内容。readLines()httrXMLrvest等工具简化了这一过程。

挑战:

  • 网络数据通常嵌入在复杂的HTML结构中
  • 需要解析以隔离有用文本

技术与工具:

  • readLines():从URL读取原始文本
  • httr::GET():以编程方式获取网页内容
  • XML::htmlParse():解析HTML,使用XPath提取特定元素
  • rvest::read_html():读取和解析HTML,使用CSS选择器进行目标爬取

示例:使用rvest进行网页爬取

rvest是一个R包,专为网页爬取设计,可以轻松从HTML和XML网页中提取数据。它是tidyverse生态系统的一部分,对熟悉R的tidyverse语法的用户特别友好。

rvest中的关键函数:

  • read_html():从URL或字符串读取和解析HTML内容
  • html_nodes():使用CSS选择器提取HTML元素
    • 示例:titles <- html_nodes(page, "h1")
  • html_text():从HTML节点提取文本内容
    • 示例:text_content <- html_text(titles)
  • html_attr():从HTML元素提取属性(如href、src等)
    • 示例:links <- html_attr(links, "href")

以下代码使用HTML选择器从网页中抓取特定元素:

R 复制代码
library(rvest)
url <- "https://zlu.me/teach"
page <- read_html(url)
nodes <- html_nodes(page, "h2")
texts <- html_text(nodes)
print(texts)
R 复制代码
[1] ""          "Teach@zlu" "留学辅导" 

爬取结构化数据

以下是从教学网站提取课程分类的示例:

R 复制代码
library(rvest)
library(purrr)

# 从教学页面爬取课程分类
url <- "https://zlu.me/teach"
page <- read_html(url)

# 提取所有部分标题(h3元素)
headers <- html_nodes(page, 'h3') %>% 
  html_text() %>%
  keep(~nchar(.) > 0)  # 移除空字符串

# 打印标题
cat("页面上的部分:\n")
walk(headers, ~cat("- ", ., "\n"))

# 提取课程分类
categories <- html_nodes(page, 'h4') %>% 
  html_text() %>%
  keep(~nchar(.) > 0)  # 移除空字符串

# 打印课程分类
cat("\n课程分类:\n")
walk(categories, ~cat("- ", ., "\n"))

部分结果:

R 复制代码
页面上的部分:
-  Recent Posts 
-  About Me 
-  Popular Courses 
-  Student Success 
-  University Courses 
-  FAQs 
-  Book a Session 
-  Introduction 
-  About Me 
-  Popular Courses 
-  Course Categories 
-  Student Testimonials 
-  Frequently Asked Questions 
-  简介 
-  详细介绍 
-  Popular Courses 
-  课程分类 
-  学生评价或成功案例 
-  常见问题解答(FAQ)

课程分类:
-  Machine Learning 
-  Artificial Intelligence 
-  Data Analysis 
-  Databases 
-  Python Programming 
-  CS Core 
-  Advanced Topics 
-  Machine Learning 
-  Artificial Intelligence 
-  Data Analysis 
-  Databases 
-  Python Programming 
-  CS Core 
-  Advanced Topics 

结论

文本挖掘和网络爬虫技术能够从非结构化数据中提取有价值的洞察。R语言中的tm包简化了文本提取过程,而rvesthttr等工具则实现了高效的网络爬虫功能。通过结合这些技术,您可以有效地处理和分析海量的文本数据。

祝大家周末愉快!

相关推荐
不被定义的程序猿6 分钟前
Golang 在 Linux 平台上的并发控制
开发语言·后端·golang
陈旭金-小金子1 小时前
发现 Kotlin MultiPlatform 的一点小变化
android·开发语言·kotlin
Mikhail_G1 小时前
Python应用八股文
大数据·运维·开发语言·python·数据分析
景彡先生1 小时前
C++ 中文件 IO 操作详解
开发语言·c++
你怎么知道我是队长2 小时前
GO语言---defer关键字
开发语言·后端·golang
无影无踪的青蛙2 小时前
[C++] STL大家族之<map>(字典)容器(附洛谷)
开发语言·c++
a4576368762 小时前
Objective-c protocol 练习
开发语言·macos·objective-c
fajianchen2 小时前
Spring中观察者模式的应用
java·开发语言
追风赶月、2 小时前
【QT】控件一(QWidget、Button、Label)
开发语言·qt
MYH5163 小时前
无监督 vs 有监督的本质区别
开发语言