当前位置: 首页 > news >正文

R语言文本挖掘-万字详细解析tm包

tm包(Text Mining Package)是R语言中用于文本挖掘的强大工具包,它提供了一系列的功能来处理和分析文本数据。偶然看到这个包,我们一起看看其中的基本功能:

  1. 数据载入:tm包支持从多种数据源载入文本数据,包括本地文件、数据库、网络资源等。

  2. 语料库处理:tm包的核心概念之一是语料库(Corpus),它代表了一系列文档的集合。用户可以通过Corpus()VCorpus()函数创建动态或静态语料库。

  3. 数据预处理:tm包提供了丰富的数据预处理功能,包括文本清洗、分词、去除停用词、词干提取、词形还原等。

  4. 元数据管理:tm包允许用户管理和访问文档的元数据,这些元数据可以用于进一步的分析和分类。

  5. 文档-词条矩阵:tm包支持创建文档-词条矩阵(Document-Term Matrix, DTM),这是一种常用的数据结构,用于表示文本数据中的文档和词条之间的关系。


目录

 1.文本挖掘

2.tm包安装

3. acq、crude数据集

4.content_transformer、tm_map函数模式筛选

5.语料库(Corpora)

6.DataframeSource函数创建语料库

7.DirSource函数创建目录源

8.Docs等函数处理词项矩阵

词项

9.findAssocs函数寻找词项关联

10. findFreqTerms函数寻找频繁出现的词项

11.findMostFreqTerms函数 寻找最频繁词项

12.读取稀释矩阵

13.分词器与预定义文本转换方法

 14.高性能计算-hpc

15. inspect函数检查

16.meta函数meta类操作

17.PCorpus创建永久语料库


 1.文本挖掘

文本挖掘,也称为文本数据挖掘,是指从大量文本数据中抽取事先未知的、可理解的、最终可用的知识的过程。它涉及将非结构化文本转换为结构化格式,以便发现有意义的模式和全新洞察。文本挖掘通常包括以下几个主要任务:

  1. 文本分类:将文本分配到预定义的类别中,这通常是一个有监督的学习过程。
  2. 文本聚类:将文本分组到不同的簇中,这是一个无监督的学习过程。
  3. 信息抽取:从文本中提取特定的信息片段,如命名实体识别、关系抽取等。
  4. 情感分析:确定文本的情感倾向,如正面、负面或中性。
  5. 文本摘要:生成文本的简短摘要,保留关键信息。

文本挖掘是一个多学科交叉的领域,它结合了数据挖掘技术、信息抽取、信息检索、机器学习、自然语言处理、计算语言学、统计数据分析等多种技术。

2.tm包安装

首先进行tm 包安装,由于是新包,镜像等比较慢,因此推荐手动安装,相关包安装问题可以看之前的博客文章:

一站式解决R包安装的各种方法及常见问题(Bioconductor、github、手动安装等)-CSDN博客

#普通安装
install.packages("tm")
#手动安装
download.file("https://cran.r-project.org/src/contrib/tm_0.7-14.tar.gz","tm_0.7-14.tar.gz")
install.packages("tm_0.7-14.tar.gz",repos = NULL)

3. acq、crude数据集

(1)acq

这个数据集包含50篇新闻文章及其附加的元信息,这些文章来源于著名的Reuters-21578数据集。所有文档都属于“acq”主题,即涉及公司收购的内容。它是一个包含50篇文本文档的语料库(AVCorpus)。其来源是Reuters-21578文本分类集合分发版1.0,采用XML格式。

(2)crude

crude 是一个包含20篇文本文档的VCorpus对象。
该数据集来源于Reuters-21578文本分类集合分发版1.0(XML格式)。

library(tm)
data("acq")
acq
data("crude")crude

4.content_transformer、tm_map函数模式筛选

以一个例子学习内容转换器函数

data("crude")
#查看第一篇文章
crude[[1]]
(f <- content_transformer(function(x,pattern) gsub(pattern,"",x)))
new <- tm_map(crude,f,"[[:digit:]]+")[[1]]
new
as.character(crude[[1]])
as.character(new)

函数内部定义了一个匿名函数,该函数接受两个参数:x(要处理的文本)和pattern(要匹配的模式)。使用gsub函数将文本中符合模式的部分替换为空字符串,即删除这些部分。这里的模式"[[:digit:]]+"是一个正则表达式,匹配一个或多个数字字符。

在使用crude[[1]]命令的时候,我们能发现控制台的返回小白看不懂,我们进行简单解释:

<<PlainTextDocument>> 是一个 R 语言中的 S3 对象,属于文本挖掘或自然语言处理领域的一个特定类。这种对象通常用来存储和处理纯文本数据,其中包含文本内容以及与之相关的元数据(Metadata)

crude[[1]] 就是访问该列表中的第一个 PlainTextDocument 对象。这个对象可能包含一段文本内容和它的元数据,元数据的长度为 15(15个不同的元),而内容部分包含 527 个字符

我们发现函数将原本内容中的数字内容都去除了。

我们再通过一个例子来加深理解:

documents <- c("Hello @name, how are you?", "I am @name, nice to meet you.")
# 创建一个Corpus对象
corpus <- Corpus(VectorSource(documents))
# 创建一个content_transformer,它将@name替换为实际的名称
replace_name <- content_transformer(function(x,Name){gsub("@name",Name,x)
})
processed <- tm_map(corpus,replace_name,"david")
# 打印处理后的文档
print(sapply(processed, as.character))

5.语料库(Corpora)

在自然语言处理和文本挖掘领域,语料库(Corpora)是一个重要的概念,它指的是包含(自然语言)文本的文档集合。在R语言的tm包中,语料库通过虚拟S3类Corpus来表示,而其他扩展包则提供继承自这个基础类的S3语料库类,例如tm包自身提供的VCorpus类。
语料库类必须提供访问器以提取子集([])、单个文档([[]])以及元数据(meta)。函数length用于返回文档的数量,as.list则构造一个持有文档的列表。
语料库可以有两种类型的元数据,均可通过meta访问:
(1)语料库元数据:包含特定于语料库的元数据,形式为标签-值对。
(2)文档级元数据:包含特定于文档的元数据,但在语料库中以数据框的形式存储。文档级元数据通常出于语义原因(例如,由于某些高级信息如可能值的范围,文档分类形成独立实体)或性能原因(单次访问而非提取每个文档的元数据)使用。
此外,tm包还提供了其他几种语料库类:
SimpleCorpus:一种简单的语料库类。
VCorpus:tm包提供的另一种语料库类。
PCorpus:tm包提供的另一种语料库类。
DCorpus:由tm.plugin.dc包提供的一种分布式语料库类。

6.DataframeSource函数创建语料库

DataframeSource 函数允许用户创建一个数据源对象,该对象将数据框(data frame)中的每一行视为一个文档。这个功能特别适用于那些已经拥有或生成了包含文档内容和元数据的结构化数据集的场景。

使用说明

当你调用 DataframeSource(x) 时,你需要提供一个名为 x 的数据框作为参数。这个数据框必须满足以下条件:
第一列必须命名为 "doc_id",包含每个文档的唯一字符串标识符。
第二列必须命名为 "text",包含代表文档内容的 UTF-8 编码的字符串。
可以选择性地添加额外的列,这些列将被用作文档元数据。

返回值

DataframeSource 函数返回一个对象,该对象继承自 DataframeSource、SimpleSource 和 Source 类。这意味着返回的对象不仅包含了数据框源的特性,还具备了简单源和源对象的基本属性和方法,便于后续进行文本处理和分析。

相关函数

Source:提供关于 tm 包所使用的源基础设施的基本信息。
meta:用于处理不同类型的元数据。
readtext:用于读取多种格式的文本文件,使其适合被 DataframeSource 处理。

以下是一个简单的例子,展示了如何创建一个 DataframeSource 对象并用它来构建一个语料库(Corpus):

# 创建一个包含文档 ID、文本内容以及一些元数据的数据框
docs <- data.frame(doc_id = c("doc_1", "doc_2"),text = c("This is a text.", "This another one."),dmeta1 = 1:2,dmeta2 = letters[1:2],stringsAsFactors = FALSE
)# 使用 DataframeSource 创建数据源对象
ds <- DataframeSource(docs)# 利用数据源对象创建语料库
x <- Corpus(ds)# 检查语料库的内容
inspect(x)# 查看语料库的元数据
meta(x)

我们通过一个更复杂的例子进行理解:

#创建DF
docs <- data.frame(doc_id = c("doc_1", "doc_2", "doc_3"),title = c("R语言简介", "文本挖掘技术", "数据科学应用"),text = c("R语言是一种统计计算和图形的环境...的语言", "文本挖掘是从大量文本数据中提取有用信息的过程...","数据科学是一门多学科领域,它使用科学方法、过程、算法和系统..."),author = c("张三", "李四", "王五"),date = as.Date(c("2023-01-01", "2023-02-15", "2023-03-20")),stringsAsFactors = FALSE
)# 使用DataframeSource创建数据源对象
ds <- DataframeSource(docs)# 创建语料库
corpus <- Corpus(ds)# 查看语料库中的文档
inspect(corpus)# 对语料库中的文本进行预处理
# 例如,去除标点符号、数字、停用词等
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removeWords, stopwords("en"))# 创建文档-词项矩阵
dtm <- DocumentTermMatrix(corpus)# 查看文档-词项矩阵
inspect(dtm)

<<DocumentTermMatrix (documents: 3, terms: 3)>> 表示这个文档-词项矩阵(DTM)包含了3个文档和3个术语。接下来的一些描述性统计信息提供了矩阵的更多细节:
Non-/sparse entries: 3/6 指出矩阵中有3个非零元素和6个稀疏(即零)元素。
Sparsity : 67% 表明矩阵的稀疏度为67%,意味着大多数的词项-文档交叉点是空的,这在文本数据中是很常见的,因为一个特定的词项往往不会出现在所有文档中。
Maximal term length: 29 指的是矩阵中最长的术语长度为29个字符。
Weighting : term frequency (tf) 说明矩阵使用的是词频(term frequency, tf)权重,即每个单元格中的数值代表了相应术语在对应文档中出现的次数。

7.DirSource函数创建目录源

DirSource是一个函数,通常用于创建一个目录源(Directory Source)。它允许用户指定一个目录,并从该目录中读取文件作为文档进行处理。以下是DirSource函数的参数及其描述:
directory:一个字符向量,包含完整的路径名;默认值对应于工作目录(通过getwd()获得)。
encoding:一个字符串,描述当前的编码。这个参数被传递给iconv来将输入转换为UTF-8编码。
pattern:一个可选的正则表达式。只有匹配该正则表达式的文件名会被返回。
recursive:逻辑值。是否应该递归地列出子目录中的文件?
ignore.case:逻辑值。模式匹配是否应该是大小写不敏感的?
mode:一个字符串,指定文件应该如何被读取。可用的模式有:"":不读取。在这种情况下,getElem和pGetElem只返回URI。
"binary":以二进制原始模式读取文件(通过readBin)。
"text":以文本形式读取文件(通过readLines)。
使用DirSource时,它会获取通过dir命令获得的文件列表,并将每个文件解释为一个文档
返回值是一个对象,它继承自DirSource、SimpleSource和Source类

例如,以下代码会创建一个指向tm包中texts/txt目录的DirSource:

DirSource(system.file("texts", "txt", package = "tm"))

$encoding属性表示这些文本文件的编码方式

$length属性显示该目录中有5个文件

$position属性是用来追踪当前读取位置的,初始值为0。

$reader属性是一个函数,它定义了如何从源中读取文件并将其转换为PlainTextDocument对象。如果元素有URI,它会使用URI的基本名称作为文档ID。

$mode属性指示这个源是用于文本文件的。

$filelist属性列出了目录中的所有文件路径。

最后显示了DirSource对象的类属性,表明它是DirSource、SimpleSource和Source类的实例。


# 假设我们有一个包含多种类型文件的目录路径
my_directory <- "C:/Users/Huzhuocheng/Documents"directory_source = DirSource(directory=my_directory,  # 指定要读取的目录路径encoding="utf-8",                # 指定文件的编码格式pattern="*.txt",                 # 使用正则表达式匹配文件名mode="text"                      # 指定文件的处理模式
)
directory_source

8.Docs等函数处理词项矩阵

Docs(x): 这个函数用于获取文档-词项矩阵或词项-文档矩阵中的文档ID。参数x是矩阵对象,返回值是一个包含文档ID的字符向量。
nDocs(x): 这个函数用于获取矩阵中文档的数量。参数x同样是矩阵对象,返回值是一个整数,表示文档的数量
nTerms(x): 这个函数用于获取矩阵中词项的数量。参数x是矩阵对象,返回值是一个整数,表示词项的数量
Terms(x): 这个函数用于获取词项-文档矩阵或文档-词项矩阵中的词项。参数x是矩阵对象,返回值是一个包含词项的字符向量
示例代码展示了如何创建一个词项-文档矩阵的子集,并使用上述函数获取相关信息:

data("crude")  # 加载示例数据
tdm <- TermDocumentMatrix(crude)[1:10,1:20]  # 创建词项-文档矩阵的子集# 获取文档ID
Docs(tdm)# 获取文档数量
nDocs(tdm)# 获取词项数量
nTerms(tdm)# 获取词项
Terms(tdm)

词项

词项(Term)在信息检索、文本挖掘和自然语言处理等领域中,通常指的是构成文本的基本单位,它可以是单词、短语或其他有意义的词汇片段。词项是构建索引、执行搜索和分析文本内容的基础元素。

在构建词项-文档矩阵(Term-Document Matrix)或文档-词项矩阵(Document-Term Matrix)时,词项作为矩阵的一维,代表文档集合中出现的所有不同的词汇。每个词项与文档之间的关联通过矩阵中的数值来表示,如词频(Term Frequency)或逆文档频率(Inverse Document Frequency)等统计量,从而揭示词项在文档集合中的分布情况和重要性。

例如,在处理一组文档时,首先会对文档进行分词处理,将连续的文本流切分成一个个独立的词项。随后,这些词项会被用来构建矩阵,其中每一行对应一个词项,每一列对应一个文档,矩阵中的每个元素则表示该词项在对应文档中出现的次数或权重。

让我们通过一个简单的例子来更好地理解词项(Term)的概念。

假设我们有一组关于动物的小型文档集合,包含以下三个文档:

文档1(D1): "猫喜欢追逐老鼠。"
文档2(D2): "狗经常吠叫。"
文档3(D3): "猫和狗都是宠物。"

首先,我们对这组文档进行分词处理,将每个文档分解成单独的词项:

文档1的词项: ["猫", "喜欢", "追逐", "老鼠"]
文档2的词项: ["狗", "经常", "吠叫"]
文档3的词项: ["猫", "和", "狗", "都", "是", "宠物"]

接下来,我们可以构建一个词项-文档矩阵,如下所示:

9.findAssocs函数寻找词项关联

findAssocs 是一个用于在文档-词项或词项-文档矩阵中寻找关联的函数,它属于文本挖掘领域中的常用工具。该函数主要用于分析词项之间的相关性,并能够根据指定的相关性阈值来筛选出强相关的词项对。 
描述
findAssocs 函数通过计算词项之间的相关性,帮助用户发现文档集合中词项之间的潜在联系。这对于理解文档的主题、进行关键词提取或者构建词项间的关联网络等任务非常有用。
用法
findAssocs 函数有两种S3方法,分别适用于 DocumentTermMatrix 和 TermDocumentMatrix 类对象:

## S3 method for class 'DocumentTermMatrix'
findAssocs(x, terms, corlimit)## S3 method for class 'TermDocumentMatrix'
findAssocs(x, terms, corlimit)

参数
x: 一个 DocumentTermMatrix 或 TermDocumentMatrix 对象,包含了文档集合的词项频率信息。
terms: 一个字符向量,包含了用户希望查找其关联词项的目标词项。
corlimit: 一个数值向量,指定了每个目标词项的相关性下限(包含),范围从0到1。如果 corlimit 的长度与 terms 不同,则会被循环使用。
返回值
findAssocs 返回一个命名列表,其中每个列表组件以 terms 中的一个词项命名,并包含一个命名的数值向量。这个向量持有来自 x 的匹配词项及其满足 corlimit 下限的相关性值(经过四舍五入)。
示例
以下是一个使用 findAssocs 函数的例子

data("crude")  # 加载示例数据集
tdm <- TermDocumentMatrix(crude)  # 创建词项-文档矩阵
# 查找与"oil", "opec", "xyz"这些词项相关且相关性至少为0.7, 0.75, 0.1的词项
findAssocs(tdm, c("oil", "opec", "xyz"), c(0.7, 0.75, 0.1))

10. findFreqTerms函数寻找频繁出现的词项

该函数的目的是从给定的矩阵中找出频繁出现的词项,即那些出现频率在指定范围内的词项。

使用方法:

findFreqTerms(x, lowfreq = 0, highfreq = Inf)

x:一个DocumentTermMatrix或TermDocumentMatrix对象,包含了文档和词项之间的关联信息。
lowfreq:一个数值参数,表示词项出现的最低频率界限。默认值为0,意味着不考虑频率的下限。
highfreq:一个数值参数,表示词项出现的最高频率界限。默认值为无穷大(Inf),意味着不考虑频率的上限。

此方法适用于所有数值权重,但对于标准的词频(term frequency,简称tf)权重来说可能最有意义。词频权重是指某个词项在文档中出现的次数,它是文本挖掘中常用的一个度量标准。

data("crude")  # 加载示例数据集
tdm <- TermDocumentMatrix(crude)  # 创建词项-文档矩阵
# 查找与"oil", "opec", "xyz"这些词项相关且相关性至少为0.7, 0.75, 0.1的词项
findAssocs(tdm, c("oil", "opec", "xyz"), c(0.7, 0.75, 0.1))

11.findMostFreqTerms函数 寻找最频繁词项

findMostFreqTerms 函数用于在一个文档-词项或词项-文档矩阵中,或者一个词频向量中找到最频繁出现的词项。这个函数可以根据不同的输入类型(如DocumentTermMatrix、TermDocumentMatrix或词频向量)采用不同的方法来执行。

使用方法:

findMostFreqTerms(x, n = 6L, INDEX = NULL, ...)

x:可以是DocumentTermMatrix、TermDocumentMatrix对象,或者是通过termFreq()获得的词频向量。
n:一个整数,指定返回的最频繁词项的最大数量,默认为6。
INDEX:一个指定文档分组的对象,用于汇总;如果为NULL(默认),则每个文档被单独考虑。
...:传递给方法的额外参数。

只有具有正频率的词项会被包括在结果中。

data("crude")## 词频:
tf <- termFreq(crude[[14L]])
findMostFreqTerms(tf)## 文档-词项矩阵:
dtm <- DocumentTermMatrix(crude)## 每个文档中最频繁的词项:
findMostFreqTerms(dtm)## 前10个和后10个文档中最频繁的词项:
findMostFreqTerms(dtm, INDEX = rep(1 : 2, each = 10L))

12.读取稀释矩阵

read_dtm_Blei_et_al 和 read_dtm_MC 是两个用于读取存储在特殊文件格式中的文档-词项矩阵的函数。这些函数通常用于处理由特定软件包生成的稀疏矩阵数据。
(1)read_dtm_Blei_et_al
用途:读取由Blei等人开发的潜在狄利克雷分配(LDA)和相关主题模型C代码使用的(列表中的列表类型稀疏矩阵)格式。
参数:file:要读取的文件名。
vocab:词汇表文件名,每行给出一个术语,或者为NULL。
详情:该函数读取由Blei等人开发的LDA和CTM模型使用的特定格式的稀疏矩阵。
(2)read_dtm_MC
用途:读取由MC工具包创建的稀疏矩阵信息,该工具包用于从文本文档创建向量模型。
参数:file:提供基础文件名的路径。
scalingtype:指定使用的缩放类型的字符串,或者为NULL(默认),在这种情况下,缩放将从具有非零条目的文件的名称推断出来。
详情:MC工具包使用压缩列存储(CCS)稀疏矩阵格式的变体,将数据写入具有适当名称的多个文件中。非零条目存储在文件中,其名称表明了使用的缩放类型。例如,_tfx_nz 表示按词频('t')、逆文档频率('f')和无归一化('x')进行缩放。有关更多信息,请参阅MC源代码中的README。
返回值
这两个函数都返回一个文档-词项矩阵。

13.分词器与预定义文本转换方法

(1)getTokenizers() 函数是 R 语言中 tm 包提供的一个函数,用于获取该包提供的预定义分词器(tokenizers)列表。

getTokenizers()

当你运行上述代码时,它将列出 tm 包中可用的所有分词器。分词器是在文本挖掘过程中用于将文本分割成单词或短语的工具,这对于后续的文本分析至关重要。
参见
Boost_tokenizer:基于 Boost 库的分词器。
MC_tokenizer:基于 MC 工具包的分词器。
scan_tokenizer:基于 R 语言内置 scan 函数的分词器。

 (2)getTransformations() 函数用于获取该包提供的预定义文本转换方法列表。这些方法通常用于文本预处理,以便于后续的文本分析或挖掘工作。
这些转换方法可以用于 tm_map 函数,以对文本数据进行各种转换处理。
例如,removeNumbers 用于删除文本中的数字,removePunctuation 用于删除标点符号,removeWords 可以删除指定的单词,stemDocument 用于将单词还原为其词干形式,而 stripWhitespace 则用于去除多余的空白字符。
此外,如果你需要创建自定义的转换方法,可以使用 content_transformer 函数。

# 获取预定义的转换方法列表
available_transformations <- getTransformations()
print(available_transformations)

  1. removeNumbers:
    这个方法的作用是从文本中移除所有的数字字符。在处理自然语言文本时,数字往往不携带与主题直接相关的信息,因此去除它们可以减少噪声,并可能帮助改善后续文本分析任务的效果,如情感分析、主题建模等。

  2. removePunctuation:
    此方法旨在从文本中删除所有的标点符号。标点符号虽然对于书面语言的语法结构至关重要,但在许多文本分析任务中,它们并不包含对理解文本内容有实质性帮助的信息。去除标点符号有助于统一词汇的格式,简化分析过程。

  3. removeWords:
    这是一种更灵活的方法,允许用户指定要从文本中删除的单词或短语。这可以用于去除停用词(stop words),即那些在文本中频繁出现但通常不承载重要意义的词汇,如“the”、“is”、“in”等。通过移除这些词汇,可以减少数据的维度,同时聚焦于更有意义的词汇。

  4. stemDocument:
    这个方法将文本中的词汇还原到它们的词干形式。词干提取是一种常见的文本规范化技术,目的是将词汇的不同形态(如动词的各种时态、名词的单复数等)统一为一个基本形式。这样做可以减少词汇的多样性,从而简化模型并提高某些文本分析任务的性能。

  5. stripWhitespace:
    该方法的功能是去除文本中的多余空白字符,包括空格、制表符、换行符等。清理空白字符有助于标准化文本数据,确保在进行诸如词频统计、文本向量化等操作时的准确性。

 14.高性能计算-hpc

hpc 是一个用于高性能计算的R包,它提供了一系列函数来支持并行计算,从而加速数据处理和分析任务。其中,tm_parLapply  tm_parLapply_engine 是两个关键的函数,它们允许用户根据注册的并行化引擎对列表或向量应用函数。
功能描述
tm_parLapply 函数旨在并行化地应用一个函数到一个列表或向量的每个元素上。这种并行化可以显著提高执行效率,尤其是在处理大量数据时。
使用方法
tm_parLapply(X, FUN, ...): 这个函数接受三个主要参数:
X:一个原子向量、列表或其他适合当前并行化引擎的对象。
FUN:将要应用到X的每个元素上的函数。
...:传递给FUN的可选参数。
tm_parLapply_engine(new): 这个函数用于获取(无参数)或设置(带new参数)使用的并行化引擎。
new:可以是makeCluster()创建的类cluster对象,或者是带有形式参数X、FUN和...的函数,或者是NULL,后者表示不使用并行化引擎。
细节说明
在tm包中,一些易于并行的计算可以通过使用tm_parLapply和tm_parLapply_engine来自定义并行化,以充分利用可用资源。
如果设置了继承自类cluster的对象作为引擎,tm_parLapply将调用parLapply()函数,并将该集群和给定的参数传递给它。如果设置为函数,则tm_parLapply将用给定的参数调用该函数。否则,它将简单地调用lapply()。
示例
为了通过parLapply()实现并行化,可以使用以下方式注册默认集群:

tm_parLapply_engine(function(X, FUN, ...)
parallel::parLapply(NULL, X, FUN, ...))

或者重新注册集群,例如名为cl的集群:

tm_parLapply_engine(cl)

 要实现负载平衡的并行化,可以使用parLapplyLB()与注册的默认集群或给定集群:

tm_parLapply_engine(function(X, FUN, ...)
parallel::parLapplyLB(NULL, X, FUN, ...))

  或者

tm_parLapply_engine(function(X, FUN, ...)
parallel::parLapplyLB(cl, X, FUN, ...))

 要在Unix类平台上通过fork实现并行化,可以使用makeForkCluster()创建的集群,或者使用mclapply()

tm_parLapply_engine(parallel::mclapply)

或者:

tm_parLapply_engine(function(X, FUN, ...)
parallel::mclapply(X, FUN, ..., mc.cores = n))

我们通过一个例子来看一下:

documents <- list(doc1 = "This is the first document.",doc2 = "This document is the second document.",doc3 = "And this is the third one."# ... 假设有更多的文档
)
library(tm)
stem_text <- function(x) {stemDocument(x, language = "english")
}
#现在,我们可以使用tm_parLapply来并行地对每篇文档应用stem_text函数:
# 假设我们已经有了一个名为cl的并行计算集群
# cl <- makeCluster(detectCores() - 1) # 创建一个使用除主核外所有核心的集群# 设置并行引擎为我们的集群
# tm_parLapply_engine(cl)# 并行处理文档
stemmed_documents <- tm_parLapply(documents, stem_text)# 关闭集群
# stopCluster(cl)

15. inspect函数检查

inspect 是一个在文本分析中常用的函数,主要用于显示语料库(corpus)、词条-文档矩阵(term-document matrix)或文本文档(text document)的详细信息。这个函数的目的是帮助用户更好地理解和检查他们的文本数据结构。
使用方法
inspect 函数根据不同的类有不同的方法,具体包括:
对于 PCorpus 类的对象,使用 inspect(x) 来查看其细节。
对于 VCorpus 类的对象,同样使用 inspect(x)。
对于 TermDocumentMatrix 类的对象,也是通过 inspect(x) 来展示信息。
对于 TextDocument 类的对象,使用 inspect(x) 来查看单个文档的细节。

data("crude")  # 加载示例数据集
inspect(crude[1:3])  # 检查语料库中的前三个文档
inspect(crude[[1]])  # 检查语料库中的第一个文档
tdm <- TermDocumentMatrix(crude)[1:10, 1:10]  # 创建一个词条-文档矩阵
inspect(tdm)  # 检查词条-文档矩阵

 

16.meta函数meta类操作

meta 是一个用于访问和修改文本文档和语料库元数据的函数。它有多种不同的方法,适用于不同类型的对象,如 PCorpus, SimpleCorpus, VCorpus, PlainTextDocument, 和 XMLTextDocument。这些方法允许用户获取或设置特定的元数据标签(tag),或者获取所有可用的元数据。

DublinCore 是一个方便的包装器,用于使用简单的都柏林核心模式(支持来自都柏林核心元数据元素集的15个元数据元素)来访问和修改文本文档的元数据。
元数据可以分为三种类型:
corpus:包含特定于语料库的元数据,以标签-值对的形式存储。
indexed:包含特定于文档的元数据,但以数据框的形式存储在语料库中。这种元数据通常用于语义原因(例如,文档分类形成一个独立的实体,因为有一些高级信息,如可能值的范围)或性能原因(单次访问而不是提取每个文档的元数据)。这可以看作是一种索引形式,因此得名“indexed”。
local:直接存储在各个文档中的标签-值对形式的文档元数据。

data("crude")# 获取 crude 语料库中第一个文档的所有元数据。
meta(crude[[1]])# 获取 crude 语料库中第一个文档的都柏林核心元数据。
DublinCore(crude[[1]])# 获取 crude 语料库中第一个文档的 "topics" 元数据。
meta(crude[[1]], tag = "topics")# 设置 crude 语料库中第一个文档的 "comment" 元数据为 "A short comment."。
meta(crude[[1]], tag = "comment") <- "A short comment."# 删除 crude 语料库中第一个文档的 "topics" 元数据。
meta(crude[[1]], tag = "topics") <- NULL# 设置 crude 语料库中第一个文档的 "creator" 元数据为 "Ano Nymous"。
DublinCore(crude[[1]], tag = "creator") <- "Ano Nymous"# 设置 crude 语料库中第一个文档的 "format" 元数据为 "XML"。
DublinCore(crude[[1]], tag = "format") <- "XML"# 获取 crude 语料库中第一个文档的都柏林核心元数据,以查看所做的更改。
DublinCore(crude[[1]])# 获取 crude 语料库中第一个文档的所有元数据,以查看所做的更改。
meta(crude[[1]])# 获取整个 crude 语料库的所有元数据。
meta(crude)# 获取整个 crude 语料库的语料库级别元数据。
meta(crude, type = "corpus")# 设置整个 crude 语料库的 "labels" 元数据为从 21 到 40 的序列。
meta(crude, "labels") <- 21:40# 获取整个 crude 语料库的所有元数据,以查看所做的更改。
meta(crude)

17.PCorpus创建永久语料库

参数
x: 一个 ASource 对象,代表要读取的文本数据源。

readerControl: 一个命名列表,包含从 x 读取内容的控制参数。

reader: 一个函数,能够读取并处理 x 提供的格式。

language: 一个字符,表示文档的语言(最好使用 IETF 语言标签,例如 "en" 表示英语)。默认语言假设为英语。

dbControl: 一个命名列表,包含底层数据库存储的控制参数。dbName: 一个字符,指定数据库文件的名称。

dbType: 一个字符,指定数据库的格式(可能的格式参见 filehashOption)。

PCorpus 创建的永久性语料库将文档存储在 R 外的数据库中。这意味着可以在内存中同时存在多个指向同一底层数据库的 PCorpus R 对象,对一个对象所做的更改会传播到所有相应的对象,这与 R 的默认语义不同。
返回值
该函数返回一个继承自 PCorpus 和 Corpus 的对象。

txt <- system.file("texts", "txt", package = "tm")
PCorpus(DirSource(txt),dbControl = list(dbName = "pcorpus.db", dbType = "DB1"))

在这个例子中,DirSource(txt) 创建了一个指向特定目录下文本文件的数据源对象,然后 PCorpus 使用这个数据源和指定的 dbControl 参数创建了一个永久性语料库。
通过这种方式,PCorpus 提供了一种灵活且持久的方式来管理和分析大量的文本数据。

 


文本挖掘的tm包内容实在太多,更多的函数功能可以见英语原版文档:

        tm.pdf (r-project.org)

实在肝不动了 。

相关文章:

R语言文本挖掘-万字详细解析tm包

tm包&#xff08;Text Mining Package&#xff09;是R语言中用于文本挖掘的强大工具包&#xff0c;它提供了一系列的功能来处理和分析文本数据。偶然看到这个包&#xff0c;我们一起看看其中的基本功能&#xff1a; 数据载入&#xff1a;tm包支持从多种数据源载入文本数据&…...

JWT中的Token

1.JWT是什么&#xff1f; jwt&#xff08;json web token的缩写&#xff09;是一个开放标准&#xff08;rfc7519&#xff09;&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于在各方之间以json对象安全地传输信息&#xff0c;此信息可以验证和信任&#xff0c;因…...

苹果在iOS 18.1中向第三方开发者开放iPhone的NFC芯片

苹果公司今天宣布&#xff0c;开发者很快就能首次在自己的应用程序中提供 NFC 交易功能&#xff0c;而目前这主要是Apple Pay独有的功能。从今年晚些时候的 iOS 18.1 开始&#xff0c;开发者将可以使用新的 API 提供独立于 Apple Pay 和 Apple Wallet 的应用内非接触式交易。 这…...

系统开发之禁止卸载应用名单

本文目的主要是记录自己系统&#xff08;Android7.1系统&#xff09;开发实现代码&#xff0c;以便后期通用的功能可以直接使用&#xff0c;不需要再去通过搜索然后筛选再验证的繁琐流程&#xff0c;大大减小自己的开发时间。 我实现思路是在系统内新增自己的数据库用来记录禁止…...

wait 和 notify

目录 wait() 方法 notify() 方法 notifyAll() 方法 nofity 和 notifyAll wait 和 notify wait 和 sleep 的区别 wait 和 join 的区别 由于线程之间是抢占式执行的&#xff0c;因此&#xff0c;线程之间执行的先后顺序难以预知&#xff0c;但是&#xff0c;在实际开发中&…...

docker 启动 mongo,redis,nacos.

docker run --name mymongodb -e MONGO_INITDB_ROOT_USERNAMEadmin -e MONGO_INITDB_ROOT_PASSWORDXiaoyusadsad -p 27017:27017 -v /path/to/mongo-data:/data/db -d mongodb/mongodb-community-server:4.4.18-ubuntu2004-v 的目录必须是绝对目录 目录必须 chmod 777 /path/…...

Docker Swarm 搭建

Docker Swarm 搭建 1. 环境介绍 操作系统Centos 7Centos 7Centos 7内核版本Linux 3.10.0-957.el7.x86_64Linux 3.10.0-957.el7.x86_64Linux 3.10.0-957.el7.x86_64主机名称swarm-managerswarm-worker1swarm-worker2IP192.168.1.100192.168.1.200192.168.1.250Docker Domain20…...

浅述TSINGSEE青犀EasyCVR视频汇聚平台与海康安防平台的区别对比

在我们的很多项目中都遇到过用户的咨询&#xff1a;TSINGSEE青犀EasyCVR视频汇聚平台与海康平台的区别在哪里&#xff1f;确实&#xff0c;在安防视频监控领域&#xff0c;EasyCVR视频汇聚平台与海康威视平台是两个备受关注的选择。它们各自具有独特的功能和优势&#xff0c;适…...

设计模式系列:策略模式的设计与实践

一、背景 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。 二、结构 策略模式主要包含三个角色&…...

数据挖掘之数据预处理

数据预处理是数据挖掘中的一个关键步骤&#xff0c;它的主要目的是对原始数据进行清洗、转换和格式化&#xff0c;以确保其质量和一致性&#xff0c;从而为后续的数据挖掘任务&#xff08;如分类、回归、聚类等&#xff09;提供可靠的数据基础。数据预处理一般包括以下几个主要…...

RocketMQ核心知识点整理,值得收藏!

1. 基本概念 Topic: 消息类别的集合&#xff0c;如订单消息发送到order_topic。标签&#xff08;Tag&#xff09;: 同一Topic下区分不同消息的标志&#xff0c;实现精细化消息管理。ConsumeGroup: 消息消费组&#xff0c;可订阅多个Topic&#xff0c;一个Topic可被多个消费组订…...

微信小程序骨架屏

骨架屏是常用的一种优化方案&#xff0c;针对于页面还未加载完时给用户的一种反馈方式。如果自己要写骨架屏有点复杂因为页面的元素过多且不稳定&#xff0c;这边直接使用微信开发工具生成骨架屏。也不只有微信开发工具有像常用的抖音开发工具&#xff0c;字节开发工具都有对应…...

Window下node安装以及配置

在 Windows 下安装 Node.js 非常简单&#xff0c;你可以通过官方提供的安装程序或者使用多版本管理工具&#xff08;如 NVM-Win&#xff09;来进行安装。下面是两种方法的具体步骤&#xff1a; 1. 安装 Node.js程序 步骤如下&#xff1a; 访问官方网站&#xff1a; 访问 Node…...

校园疫情防控系统--论文pf

TOC springboot432校园疫情防控系统--论文pf 课题的来源 2019年在我国武汉爆发了一场规模非常庞大、传播速度十分迅速、对人体危害及其严重的新冠肺炎疫情。引发此次急性感染性新冠肺炎疫情的冠状病毒传播性较强&#xff0c;其传播主要是通过呼吸道飞沫和密切接触这两个途径…...

在Debian 9上使用Apt安装Java的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 Java 和 JVM&#xff08;Java 虚拟机&#xff09;是许多软件的必备组件&#xff0c;包括 Tomcat、Jetty、Glassfish、Cassandra 和…...

人工智能在网络安全中的三大支柱

人工智能 (AI) 席卷了网络安全行业&#xff0c;各种供应商都在努力将 AI 融入其解决方案中。但 AI 与安全之间的关系不仅仅在于实现 AI 功能&#xff0c;还在于攻击者和防御者如何利用该技术改变现代威胁形势。它还涉及如何开发、更新和保护这些 AI 模型。如今&#xff0c;网络…...

rk3568mpp终端学习笔记

RK3568Terminal封装MppGraph 通过脚本取和设置音量/zigsun/bin/linux/bin.debug.Linux.rk3568/get_record_voice_value.sh /zigsun/bin/linux/bin.debug.Linux.rk3568/set_record_voice_value.sh class RK3568Terminal : public IAVLinkManager, p…...

【C++继承】赋值兼容转换作用域派生类的默认成员函数

1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类(或子类)。继承呈现了面向对象程序设计的层次结构&#xf…...

HTML5+JavaScript绘制彩虹和云朵

HTML5JavaScript绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…...

MySQL——单表查询(二)按条件查询(2)带 IN 关键字的查询

IN 关键字用于判断某个字段的值是否在指定集合中&#xff0c;如果字段的值在集合中&#xff0c;则满足条件&#xff0c;该字段所在的记录将被查询出来。其语法格式如下所示&#xff1a; SELECT *|字段名 1,字段名 2,… FROM 表名 WHERE 字段名 [NOT〕IN(元素 1,元素 2,…) 在上…...

【mysql】mysql 用户管理---创建、权限管理等等

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

本地服务器物理机中redis设置、取消密码

1.服务器物理机上redis的操作【服务器中操作】 &#xff08;1&#xff09;首先先看一下当前运行中的redis实例&#xff1a; [rootiZuf67k70ucx14s6zcv54dZ var]# ps aux | grep redis-server因为我这里有两个实例在运行&#xff0c;即物理机上的redis和docker中的redis&…...

关于xilinx的FFTIP的使用和仿真

工具&#xff1a;vivado2018.3&#xff0c;modelsim10.6d 场景&#xff1a;在进行数据进行频谱分析的时候&#xff0c;使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生&#xff0c;通过IP产生的波形数据…...

ant design pro 如何去保存颜色

上图 就是实现这样的效果 后端是这样的&#xff0c;这个颜色肯定是存到字符串里的 这是第一步 import mongoose, { Schema, Document } from mongoose;interface IDiscountCard extends Document {title: string;subtitle: string;image: string;shopUrl: string;bgColor: s…...

【Hadoop】建立圈内组件的宏观认识

01存储02计算03调度04其他05回忆 众多组件们构建了大规模分布式计算和存储平台。本文介绍Hadoop生态圈中各个组件的主要功能和作用&#xff0c;辅助学者理解每个组件的定位和用途&#xff0c;从而建立对圈内组件的宏观认识。梳理清楚HDFS、MapReduce、YARN、Hive、HBase、Spark…...

C++:命名空间与输入输出

目录 前言 一、命名空间 1.1 namespace的价值 1.2 namespace的定义 1.3 命名空间的使用 二、C输入&输出 前言 C是一种面向对象的计算机程序设计语言&#xff0c;‌它扩展了C语言的功能&#xff0c;‌并引入了面向对象编程的概念&#xff0c;‌如类、‌继承和多态等&a…...

Azure DevOps Server 数据库日志已满,TF30042: The database is full

Contents 1. 问题描述2. 处理方式 2.1 系统备份2.2 收缩日志2.3 恢复模式2.4 日志增长无法控制 1. 问题描述 Azure DevOps Server 作为微软的软件开发管理平台产品&#xff0c;理所当然地使用了微软的数据库软件SQL Server。 在一个大型的开发团队中&#xff0c;Azure DevOps S…...

[C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换

//转为 bitmap方法一&#xff1a; Bitmap map OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat); process_pictureBox.Image map; //转为 bitmap方法二&#xff1a; Bitmap map new Bitmap(mat.ToMemoryStream()); process_pictureBox.Image map; //Image img 转为…...

【区块链+金融服务】基于区块链的供应链金融系统 | FISCO BCOS应用案例

传统供应链金融存在着信息不对称、信任问题和繁琐流程等弊端。为了解决这些问题&#xff0c;京北方搭建了基于区块链 的供应链金融系统&#xff0c;提供了更高效、透明、安全和可信的交易环境。 系 统 采 用 FISCO BCOS 为 底 层 链&#xff0c; 技 术 栈 使 用 Java 语 言 进…...

AI语言大模型商业价值深度解析

点击蓝字 关注我 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;特别是深度学习算法的进步&#xff0c;AI语言大模型在自然语言处理领域的表现日益突出。国内外多种语言大模型如&#xff1a;OpenAi 的 ChatGpt&#xff0c;阿里通义千问&#xff0c;百度文心…...

理解DDD领域驱动设计思想

一、引言 在软件开发的广袤领域中&#xff0c;领域驱动设计&#xff08;Domain-Driven Design&#xff0c;简称 DDD&#xff09;犹如一颗璀璨的明星&#xff0c;备受瞩目。对于期望运用 DDD 开展项目的研发人员而言&#xff0c;明晰 DDD 的本质是实现其有效应用的基石。需注意…...

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作&#xff0c;那么恭喜你&#xff0c;你已经踏上了一段充满魔法与惊喜的旅程&#xff01;不过&#xff0c;别忘了&#xff0c;视频的灵魂不仅仅在于画面&#xff0c;更在于那直击心灵的音效。 想象一下&#xff0c;一个精心剪辑的片段&#xff0c;…...

12.2 使用prometheus-sdk向pushgateway打点

本节重点介绍 : 使用golang sdk打prometheus4种指标&#xff0c;推送到pushgateway gauge、counter、histogram、summary的初始化4种类似的设置值的方法推送到pushgateway的方法 prometheus配置采集pushgateway&#xff0c;grafana上配大盘 golang-sdk 项目地址 https://git…...

HTTPS 详解

HTTPS 是以安全为目标的 HTTP 通道&#xff0c;它在 HTTP 中加入 SSL 层以提高数据传输的安全性。HTTP 被用于在 Web 浏览器和网站服务器之间传递信息&#xff0c;但以明文形式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了 Web 浏览器和网站服务…...

Microsoft Edge 使用方法与秘诀概览

目录 ​编辑引言 Microsoft Edge 功能与技巧概览 掌握这些设置技巧&#xff0c;让 Edge 浏览器的体验更干净 1. 使用阅读视图 2. 开启广告过滤 3. 管理扩展 4. 个性化新标签页 5. 使用网页截图 6. 清理浏览器缓存 7. 管理启动设置 8. 自定义地址栏建议 9. 使用内置笔…...

【视频】onvif、RTP、RTCP、SDP、RTSP、gb21818区别

ONVIF (Open Network Video Interface Forum): ONVIF是一个全球性的开放网络视频接口论坛&#xff0c;致力于发展基于IP网络的物联网设备的标准化。它提供了一个通用的标准接口&#xff0c;使不同厂商生产的网络视频产品能够互相兼容。 RTP (Real-time Transport Protocol): R…...

8-4 循环神经网络

对于 (8.4.2)中的函数 f f f&#xff0c;隐变量模型不是近似值。 毕竟 h t h_{t} ht​是可以仅仅存储到目前为止观察到的所有数据&#xff0c; 然而这样的操作可能会使计算和存储的代价都变得昂贵。 回想一下&#xff0c;我们在前面讨论过的具有隐藏单元的隐藏层。 值得注意的…...

Linux系统编程 --- 多线程

线程&#xff1a;是进程内的一个执行分支&#xff0c;线程的执行粒度&#xff0c;要比进程要细。 一、线程的概念 1、Linux中线程该如何理解 地址空间就是进程的资源窗口。 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1…...

Grafana中的rate与irate以及histogram

用法 rate rate函数用于计算一个时间序列在给定时间范围内的平均速率。它对每个数据点进行线性插值来计算速率&#xff0c;因此对于平滑和稳定的数据来说&#xff0c;rate是一个不错的选择。语法如下&#xff1a; rate(metric_name[time_range])metric_name: 指标名称。time…...

什么是网络安全态势感知

态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力&#xff0c;是以安全大数据为基础&#xff0c;从全局视角提升对安全威胁的发现识别、理解分析、响应处置能力的一种方式、最终是为了决策与行动&#xff0c;是安全能力的落地 态势感知的重要性 随着网络与信息技术的…...

php 在app中唤起微信app进行支付,并处理回调通知

<?phpnamespace app\api\controller;use think\facade\Db; use think\facade\Log;class Wxzf {...

高效同步与处理:ADTF流服务在自动驾驶数采中的应用

目录 一、ADTF 流服务 1、流服务源&#xff08;Streaming Source&#xff09; 2、流服务汇&#xff08;Streaming Sink&#xff09; 二、数据链路 1、数据管道&#xff08;Data Pipe&#xff09; 2、子流&#xff08;Substreams&#xff09; 3、触发管道&#xff08;Tri…...

【Arduino】ATmega328PB 连接 LSM6DS3 姿态传感器,并读数据(不确定 ESP 系列是否可行,但大概率是可行的)

总览 1.初始化 ATmega328PB&#xff0c;默认大家已经完成了 328 的配置准备工作&#xff0c;已经直接能够向里面写入程序 2.接线&#xff0c;然后验证 mega328 的 I2C 设备接口能否扫描到 LSM6DS3 3.编写代码&#xff0c;上传&#xff0c;查看串口数据。完成。 一、初始化 AT…...

live2d + edge-tts 优雅的实现数字人讲话 ~

震惊&#xff01;live2d数字人竟开口说话 ~ 之前有想做数字人相关项目&#xff0c;查了一些方案。看了一些三方大厂的商用方案&#xff0c;口型有点尴尬&#xff0c;而且很多是采用视频流的方案&#xff0c;对流量的消耗很大。后来了解了live2d 技术&#xff0c;常在博客网页上…...

二进制安装php

下载php二进制包&#xff1a; 官网地址&#xff1a;https://www.php.net/releases/ PHP: Releaseshttps://www.php.net/releases/在里边可以选择自己要下载的包进行下载&#xff1b; 下载完成后进行解压&#xff1a; tar xvzf php-7.3.12.tar.gz 解压后 进入目录进行预编…...

旧版Pycharm支持的python版本记录

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;旧版Pycharm支持的python版本记录-CSDN博客 前言&#xff1a;近期由于打算研究GitHub上一个开源量化交易平台开发框架&#xff0c;但是该框架是基于python3.10的版本开发&#xff0c;所…...

java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录 1、七牛云内容审核介绍 2、查看内容审核官方文档 2.1、文本内容审核 2.1.1、文本内容审核的请求示例 2.1.2、文本内容审核的返回示例 2.2、图片内容审核 2.2.1、请求参数 2.2.2、返回参数 2.3、视频内容审核 3、代码实现 3.1、前期代码准备 3.2、文本内容审核…...

C++面试基础系列-struct

系列文章目录 文章目录 系列文章目录C面试基础系列-struct1.C中struct2.C中struct2.1.同名函数2.2.typedef定义结构体别名2.3.继承 3.总结3.1.C和C中的Struct区别 4.struct字节对齐5.struct与const 关于作者 C面试基础系列-struct 1.C中struct struct里面只能放数据类型&#…...

代码随想录算法训练营 | 动态规划 part05

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 例子&#xff1a; 背包可容纳重…...

英特尔XPU大模型应用创新

...