about 预处理

博客主要围绕C语言展开,着重介绍了预处理器。预处理器在C语言编程中有着重要作用,了解它有助于更好地进行C语言的开发与测试。

首先说明什么是预处理器

1,
首先说明什么是预处理器:
预处理器指示符用"#"号标识,这个符号将放在程序中该行的最起始的一列上,处理这些指示符的程序称
做预处理器(preprocessor)(通常捆绑在编译器中)
#ifndef BOOK_STORE_H
#define BOOK_STORE_H
...
#endif
一个头文件可能会多次包含在一个源文件中,条件指示符可以防止这种头文件的重复处理;
条件指示符#ifndef检查BOOK_STORE_H在前面是否已经被定义。这里BOOK_STORE_H是一个预编译器常量
(习惯上,预编译器常量往往被写成大写字母)。如果BOOK_STROE_H在前面没有被定义,则条件指示符的
值为真,于是从#ifndef 到 #endif之间的所有语句都被包含进来进行处理,相反,如果#ifndef的值为假
,则它与#endif指示符之间的部分将被忽略。
为了保证头文件只被处理以一次,把如下#define指示符:
#define BOOK_STORE_H
放在#ifndef后面,这样在头文件的内容第一次被处理时,BOOK_STORE_H将被定义,从而防止了在程序文
本文件中以后#ifndef指示符的值为真。
2,#ifdef 指示符常被用来判断一个预处理器常量是否已经被定义,以便有条件的包含程序代码;
#ifdef DEBUG
dosomething();
#endif
3,编译C++程序的时候,编译器自动定义了一个预处理器名字__cplusplus(注意前面有两个下划线)。
因此,我们可以根据它来判断该程序是否时C++程序,以便有条件地包含一些代码;例如
#ifdef __cplusplus
   extern "C"
#endif
int min(int,int)
在编译C程序地时候,编译器将自动定义名字__STDC__。当然__cplusplus和__STDC__不会被同时定义;

4,另外两个比较有用地预定义名字是:__LINE__和 __FILE__。前者记录文件已经被编译的行数,后者
包含正在被编译的文件的名字。可以这样使用他们:
if(element_count==0)
cerr<<"Error:"<<__FILE__
    <<": Line"<<__LINE__
    <<"element _count must be non-zero./n";
若当前处理的行或文件发生变化,则__LINE__ 和__FILE__的值将被分别变化,其他四个预定义名字在
编译期间保持不变。他们的值也不能被修改;
5,另外两个预定义名字分别包含当前被编译文件的编译时间(__TIME__)和日期( __DATA__)。时间
格式是hh:mm:ss.

6,assert()是C语言标准库中提供的一个通用预处理器宏。在代码中常利用assert()来判断一个必须的
前提条件,以便程序能够正确执行。比如我们要打开一个文件,那么首先文件名应该已经提供给我们了,
为了使用 assert(),必须包含与之相关的头文件: #include下面是一个简单的例子:
assert(filename!=0)
assert()将测试filename不等于0的条件是否满足,这表示,为了后面的程序能够正确执行,我们必须
断言一个必须的前提条件,如果这个条件为假的话,断言失败,则程序将输出诊断信息,然后中止;使用
assert() ,C++的头文件必须这样写:
#include
using namespace std;
在自然语言处理(NLP)中,文本预处理是确保后续模型训练和推理效果的关键步骤。预处理的目标是将原始文本数据转换为适合机器学习或深度学习模型处理的格式,同时减少噪声和冗余信息的影响。以下是常见的自然语言处理预处理步骤和技术方法: ### 3.1 文本清洗与标准化 在正式处理文本之前,首先需要对原始文本进行清洗,以去除不相关或干扰性的内容。常见的清洗操作包括: - 去除 HTML 标签、URL、电子邮件地址、特殊符号等噪声内容。 - 统一大小写(例如将所有字母转换为小写)。 - 去除标点符号和多余的空格。 - 处理数字(如保留、替换为占位符或删除)。 这些操作有助于减少模型对无关字符的敏感性,并提升文本表示的一致性[^2]。 ### 3.2 分词(Tokenization) 分词是将连续的文本分割为有意义的词汇单元(token)的过程。对于英文文本,分词通常基于空格进行简单分割,但对于中文等语言则需要更复杂的算法(如基于统计的分词工具)。此外,现代 NLP 中广泛采用子词(Subword)分词技术,如 BPE(Byte-Pair Encoding)和 WordPiece,尤其在大模型(如 BERT、GPT)中表现优异[^5]。 ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') tokens = tokenizer.tokenize("Natural language processing is fascinating.") # 输出: ['natural', 'language', 'processing', 'is', 'fascinating', '.'] ``` ### 3.3 停用词过滤(Stopword Removal) 停用词是指在文本中频繁出现但对语义贡献较小的词汇,如“the”、“is”、“and”等。去除这些词可以减少模型复杂度并提升处理效率。需要注意的是,是否去除停用词取决于具体任务,某些任务(如文本生成)可能仍需保留这些词[^1]。 ### 3.4 词干提取(Stemming)与词形还原(Lemmatization) 词干提取和词形还原用于将单词的不同形式归一化为统一的基本形式。 - **词干提取**(Stemming)是基于规则的方法,例如 Porter Stemmer 将 "running" 转换为 "run","happily" 转换为 "happi"[^3]。 - **词形还原**(Lemmatization)则基于词典和语义,例如将 "running" 转换为 "run",同时保留词性信息。 ```python from nltk.stem import PorterStemmer, WordNetLemmatizer stemmer = PorterStemmer() lemmatizer = WordNetLemmatizer() word = "running" print(stemmer.stem(word)) # 输出: runn print(lemmatizer.lemmatize(word, pos="v")) # 输出: run ``` ### 3.5 词频统计与 TF-IDF 计算 词频统计是衡量文本中词汇重要性的基础,而 TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的加权统计方法,用于评估一个词在文档中的相对重要性。TF-IDF 值越高,表示该词在当前文档中越重要,同时在整个语料库中越少见[^1]。 ```python from sklearn.feature_extraction.text import TfidfVectorizer corpus = [ "Natural language processing is fascinating.", "I love learning about artificial intelligence and NLP." ] vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(corpus) print(X.toarray()) ``` ### 3.6 子词切分(Subword Tokenization) 如前所述,BPE(Byte-Pair Encoding)是一种流行的子词分词技术,尤其适用于多语言和处理未登录词(OOV)问题。它通过统计语料库中的字符对组合,逐步合并高频对,从而构建一个高效的词汇表。这种方法在现代大模型中被广泛采用[^5]。 ```python from tokenizers import ByteLevelBPETokenizer tokenizer = ByteLevelBPETokenizer() tokenizer.train(files=["corpus.txt"], vocab_size=30000) encoded = tokenizer.encode("Natural language processing is fascinating.") print(encoded.tokens) # 输出类似 ['natural', 'language', 'process', 'ing', 'is', 'fascin', 'ating', '.'] ``` ### 3.7 命名实体识别(NER) 命名实体识别是识别文本中具有特定意义的实体(如人名、地名、组织机构名等)的过程。NER 是信息提取、问答系统、摘要生成等任务的重要预处理步骤[^1]。 ```python from spacy import load nlp = load("en_core_web_sm") doc = nlp("Apple is looking at buying U.K. startup for $1 billion") for ent in doc.ents: print(ent.text, ent.label_) # 输出: Apple ORG, U.K. GPE, $1 billion MONEY ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值