
本教程旨在解决使用r语言从网页文章中提取文本时遇到的“噪音”问题。我们将介绍如何利用`htm2txt`包进行初步文本抓取,并结合`quanteda`和`qdapdictionaries`包,通过字典过滤的方法,有效去除无关字符和非标准词汇,从而获得更纯净、有意义的文章内容。文章将详细阐述从网页抓取到文本清洗的完整流程,并提供r代码示例及注意事项。
在进行网络数据抓取时,尤其是在处理新闻文章或维基百科页面等富文本内容时,直接提取的文本往往包含大量非文章核心内容的“噪音”,例如导航链接、版权声明、广告词、页面标识符等。尽管htm2txt包的gettxt()函数能够高效地将HTML页面转换为纯文本,但它通常无法区分这些有用与无用的信息。为了获得更精确、更具分析价值的文本数据,我们需要进一步的清洗和过滤。
文本提取与初步观察
首先,我们使用htm2txt包来从指定URL提取文本。这个包能够将HTML内容转换为可读的纯文本格式。
# 安装并加载必要的包# install.packages("htm2txt")library(htm2txt)# 示例URLurl_example <- 'https://en.wikipedia.org/wiki/Alan_Turing'# 提取文本raw_text <- gettxt(url_example)# 打印部分结果以观察噪音# cat(substr(raw_text, 1, 1000))
通过gettxt()函数,我们可以快速获取网页的文本内容。然而,正如问题描述中指出的,这些文本中会混杂着如p. 40/03Bn• ^ a或identifiersn• Articles with GND identifiersn•这类与文章主题无关的字符或短语。
基于字典的文本清洗策略
为了解决上述问题,一种有效的方法是采用基于字典的过滤。其核心思想是:只保留那些在标准英语字典中存在的词汇,从而过滤掉大部分非语言性的噪音、乱码或非标准词汇。这需要结合文本处理和自然语言处理(NLP)相关的R包。
我们将使用以下包:
tidyverse:提供数据处理的便利工具集。quanteda:一个强大的NLP包,用于文本的语料库创建、分词和特征选择。qdapDictionaries:提供了一个包含大量英语词汇的字典。
1. 加载所需库与字典
首先,确保所有必要的库都已安装并加载。同时,加载qdapDictionaries包中的DICTIONARY数据集,它包含了标准的英语词汇列表。
# 安装并加载必要的包# install.packages(c("tidyverse", "quanteda", "qdapDictionaries"))library(tidyverse)library(htm2txt)library(quanteda)library(qdapDictionaries)# 加载字典数据data(DICTIONARY)
2. 文本转换为语料库并分词
接下来,我们将从网页提取的原始文本转换为quanteda的语料库(corpus)对象,然后进行分词(tokenization)。分词是将文本拆分成单个词语或符号的过程。在分词时,我们可以选择移除标点符号和数字,以进一步简化文本。
# 将原始文本转换为quanteda语料库text_corpus <- corpus(raw_text)# 分词,移除标点和数字tokens_raw <- tokens(text_corpus, remove_punct = TRUE, remove_numbers = TRUE)
3. 基于字典过滤词汇
这是文本清洗的关键步骤。我们使用tokens_select()函数,结合qdapDictionaries::DICTIONARY$word作为白名单,只保留那些出现在字典中的词汇。
# 使用字典过滤词汇# DICTIONARY$word 包含了标准的英语词汇列表tokens_filtered <- tokens_select(tokens_raw, DICTIONARY$word)
经过这一步,大部分非英文词汇、乱码以及一些非标准文本(如页面标识符中的字母组合)将被移除。
4. 统计词频(可选但常用)
为了更好地理解清洗后的文本内容,我们可以将过滤后的词汇转换为数据框,并统计每个词的出现频率。这有助于我们了解文章的核心主题和关键词。
# 将过滤后的tokens转换为数据框,并计算词频word_frequencies % unnest(text) %>% # 将列表中的tokens展开为行 rename(word = text) %>% mutate(word = tolower(word)) %>% # 转换为小写 group_by(word) %>% summarise(frequency = n()) %>% # 计算词频 arrange(desc(frequency)) # 按频率降序排列
完整代码示例:
将上述步骤整合到一起,形成一个完整的文本提取与清洗流程:
# 确保所有必要的包已安装并加载# install.packages(c("tidyverse", "htm2txt", "quanteda", "qdapDictionaries"))library(tidyverse)library(htm2txt)library(quanteda)library(qdapDictionaries)# 加载字典数据data(DICTIONARY)# 目标网页URLtarget_url <- 'https://en.wikipedia.org/wiki/Alan_Turing' # 示例URL# 1. 从网页提取原始文本raw_text_content <- gettxt(target_url)# 2. 将原始文本转换为quanteda语料库text_corpus <- corpus(raw_text_content)# 3. 分词,并移除标点符号和数字tokens_processed <- tokens(text_corpus, remove_punct = TRUE, remove_numbers = TRUE)# 4. 使用字典过滤词汇,只保留标准英语词汇# DICTIONARY$word 是qdapDictionaries包提供的标准英语词汇列表tokens_cleaned <- tokens_select(tokens_processed, DICTIONARY$word)# 5. 将清洗后的tokens转换为数据框,并计算词频# 注意:quanteda的tokens对象在转换为数据框时需要一些处理# 这里的处理方式是先转换为字符向量,再通过unnest展开cleaned_word_frequencies % unnest_tokens(word, text) %>% # 再次分词,将每个词作为一行 mutate(word = tolower(word)) %>% # 转换为小写 group_by(word) %>% summarise(frequency = n()) %>% # 计算词频 arrange(desc(frequency)) # 按频率降序排列# 打印清洗后的词频前几行head(cleaned_word_frequencies)# 也可以直接查看清洗后的tokens# print(tokens_cleaned)
注意事项与局限性
字典的完整性: qdapDictionaries::DICTIONARY是一个通用的英语字典,它可能不包含所有领域特定的术语、专有名词(如人名、地名)或新创造的词汇。因此,使用此方法可能会过滤掉一些在文章中确实有意义但不在字典中的词。同形异义词: 某些在导航链接中出现的词汇(例如“Jump to navigation”中的“Jump”和“navigation”)本身是标准英语词汇,因此不会被字典过滤掉。这表明字典过滤并非万无一失,仍可能残留少量与文章主题无关的词。语言依赖性: 此方法严格依赖于英语字典。如果需要处理其他语言的文本,则需要找到相应语言的字典。性能考量: 对于非常大的文本语料库,分词和字典过滤可能会消耗一定的计算资源。替代方案: 对于更复杂的噪音(例如需要识别文章主体内容与侧边栏、页脚等),可能需要结合更高级的技术,如HTML结构分析(XPath/CSS选择器)、机器学习模型(如内容分类器)或自定义正则表达式规则。
总结
通过结合htm2txt进行初步文本提取,并利用quanteda和qdapDictionaries进行字典过滤,我们能够有效地从网页文章中提取出相对纯净、有意义的文本内容。这种方法提供了一个实用且易于实现的文本清洗流程,对于需要进行文本分析、主题建模或信息提取的用户来说,是一个非常有价值的工具。尽管存在一定的局限性,但它为后续的文本数据处理奠定了坚实的基础。
以上就是使用R语言从网页文章中提取并清洗文本教程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1590905.html
微信扫一扫
支付宝扫一扫