1. 机器为什么读不懂人话——NLP到底在解决什么问题
干这行久了,经常有刚转行的朋友问我:为什么AI有时候像懂人话,有时候又像个智障?答案其实都藏在NLP自然语言处理里。NLP就是让机器理解、生成人类语言的一整套技术,从早期垃圾邮件过滤,到今天AI大模型、AI Agent、AI编程助手,底层全是NLP在撑着。
先说个扎心的真相:机器从来不是"理解"语言,它只是把语言变成了数学。咱们人看一句话,看到的是字、词、语序、语气、隐含意思;机器看一句话,看到的是一堆数字索引、向量、概率分布。比如"苹果发布了新手机"和"苹果真好吃",对机器来说,它们共用"苹果"这个词,但如果只靠词频统计,机器根本分不清这里说的是水果还是公司。这种"一词多义"的问题,只是自然语言众多难点里的冰山一角。
自然语言处理难在几个根子上:
- 歧义无处不在。"他正在开拖拉机"里的"开"和"开公司"的"开",完全不是一个意思;还有"我在银行工作"和"我在河堤上散步",这里"银行"和"河堤"还容易区分,但"我去银行"和"我去河边",机器要结合上下文才能勉强猜出来。
- 语言是高度依赖上下文的。同样的"你真厉害",可以是真心夸奖,也可以是讽刺。字面一样,情感完全两样,这就是为什么情感分析项目里常常要处理反讽。
- 语言的表达方式千变万化。同一件事,"今天真热""这天气要命了""空调救我狗命"说的是同一个意思,但字面上没有一个字相同。这就是NLP里说的"语义鸿沟"。
所以NLP干的活儿,本质上就是解决"怎么把人类不确定、有歧义、有隐含义的语言,变成机器能计算的确定结构"。早期靠人写规则,比如"如果句子以'请'开头,就是请求意图",但随着语言场景变多,规则根本写不完。后来进入统计时代,用概率模型来判断"这个词出现在这个环境里最可能是什么意思"。再后来是深度学习,Word2Vec这类技术开始把词变成向量,让机器能算词和词的相似度。到今天是大模型时代,Transformer架构把整个句子的上下文都编码成向量,机器才能像现在这样"看起来懂人话"。
我经常跟团队里的小朋友说一句话:NLP就是一门"翻译学",把人的语言翻译成机器能算的数学。理解了这一点,后面的技术路线就都顺了。
2. NLP核心任务全景:从分词到AI大模型,NLP到底能做什么
NLP自然语言处理不是一个单一功能,它是一整个工具包。我习惯把它们分成三坨:基础任务、理解任务、生成任务。
基础任务是地基。最常见的是中文分词,因为中文词与词之间没有空格,你得先告诉机器"自然语言处理"是四个字还是两个词。其次是词性标注,标出每个词是名词、动词还是形容词,这个信息在语法分析里很有用。再就是依存句法分析,判断句子成分之间的关系,比如"我吃饭"里,"吃"和"饭"是动宾关系。早些年做NLP项目,分词和词性标注是绕不开的步骤,现在大模型时代很多任务端到端解决了,但分词在搜索引擎、知识图谱场景里依然好用。
理解任务就是让机器读懂文本的含义。文本分类给整段话打标签,比如新闻分类、垃圾邮件识别;情感分析判断一段话是正面还是负面,电商评论分析、舆情监控都靠它;命名实体识别从文本里抽取人名、地名、机构名、时间,知识图谱构建和金融信息抽取离不开它;信息抽取则是把非结构化文本变成结构化关系,比如从简历里抽姓名、电话、学历。
生成任务就是让机器吐人话。机器翻译是NLP最经典的应用;文本摘要把一篇长新闻压缩成三五句话;问答系统根据问题给出答案,搜索引擎、客服机器人都是这个路子;大模型时代的对话生成,本质上也是NLP生成任务的集大成者。
我特别喜欢用一个生活化类比来解释NLP的任务体系:把NLP当成一个阅读理解考试。
- 分词是"断句",先知道一句话里有哪几个词。
- 词性标注是"划重点",知道哪个词是主角、哪个词是动作。
- 命名实体识别是"圈人名地名"。
- 情感分析是"判断题主是高兴还是生气"。
- 文本分类是"给这篇阅读理解选中心思想"。
- 机器翻译是"把这篇中文阅读理解翻译成英文"。
- 文本生成是"根据题目要求,自己写一篇短文"。
考试科目清楚了,你就知道做项目的时候该用哪个工具了。而且这里有个重要认知:大模型虽然强大,但并不是所有任务都要上大模型。比如一个固定的垃圾短信分类任务,用朴素贝叶斯就能做到95%以上的准确率,推理快、成本低,完全没必要调一个几百亿参数的大模型。NLP工程化的核心能力之一,就是判断"这个任务该用什么量级的方案"。
3. NLP技术栈怎么选?别一上来就啃大模型
做NLP项目,工具选型直接决定你的开发效率。我见过不少人一上来就装Torch、拉BERT、调大模型,结果跑一个demo要半小时,最后发现项目根本不需要这么重的方案。技术选型的核心原则就一句话:根据数据量、任务复杂度、算力资源、上线限制倒着推。
先整理一下当前主流的Python NLP工具栈,分成三层看。
第一层是文本预处理基础库。正则表达式不算是NLP库,但它是最常用的文本清洗工具,去空格、去标签、去特殊符号都靠它。结巴分词(jieba)是中文处理入门首选,纯Python实现,安装简单,用起来也非常直接,它支持精确模式、全模式、搜索引擎模式,还允许你添加自定义词典。做中文NLP项目如果容忍度比较高,jieba完全够用。哈工大的LTP和语言云平台,以及HanLP,分词、词性标注、依存句法分析都做得更专业,如果项目对语言学特征要求高,比如要做句法分析,HanLP是个不错的选择。
第二层是传统机器学习与统计方案。Scikit-learn提供了完整的分类、聚类、特征工程接口,配合TF-IDF向量化做文本分类是经典组合,特点是稳定、可解释性强、调优空间清晰。gensim主要用于主题建模和词向量训练,LDA主题模型在舆情分析、文档聚类里仍有大量应用场景。
第三层是深度学习和预训练模型。Hugging Face Transformers是目前事实上的标准,BERT、RoBERTa、GPT系列、T5系列都能从这里加载,它同时支持PyTorch和TensorFlow,并有管道接口,很多任务可以用pipeline(line)几行代码完成。PaddleNLP是百度的中文NLP全家桶,中文预训练模型很全,在国产化环境里有优势。OpenAI、百度文心、通义千问等大模型的API,则适合做生成式任务和复杂语义理解。
那怎么选呢?我给了自己一套判断标准,每次做项目先过一遍。
- 数据量小于1万条标注数据,任务又比较固定,用jieba加TF-IDF加朴素贝叶斯或者支持向量机,快速出基线。
- 数据量1万到10万条,任务有一定语义复杂度,比如情感分析、意图识别,直接用BERT类预训练模型做微调,效果好且训练时间可控,一张消费级显卡就能跑。
- 数据量很大但业务逻辑清晰,可以考虑在预训练模型基础上加业务特征层,比如BERT编码文本,再拼接一些数值特征、标签特征做多模态输入。
- 任务涉及开放域对话、长文本生成、复杂推理,直接用大模型API或者部署开源大模型,配合提示词工程和检索增强生成(RAG)来做。
有一种情况特别常见:小团队接到一个看起来很"人工智能"的需求,比如"做一个智能客服",但其实业务方要的就是一个FAQ问答。这种场景根本不需要微调大模型,用ES或者向量数据库做知识库召回,加一个意图识别模块就足够了。工具选型不在于用得有多新、多猛,而在于能不能在投入产出上打平。
4. 手把手实操:用NLP做新闻文本智能分类与情感分析系统
前面的技术扫盲说得再多,不如亲手跑通一个完整项目。这里我拆一个很经典且实用的入门项目:新闻文本智能分类系统,并在此基础上加一层情感分析,正好覆盖了标题里"让AI理解文本"的核心场景。整个项目的代码我已经在真实数据上跑过,效果稳定,可复现性很强。
4.1 项目任务定义
我们要做的事分两步:第一步,输入一段新闻文本,自动判断它属于哪一类,比如体育、财经、科技、娱乐、健康;第二步,针对一段带主观色彩的用户评论或博主观点,判断情感极性,是正面、中性还是负面。
这个项目非常适合三类人:刚入门NLP的开发者,可以通过它把预训练模型的训练流程完整走一遍;想给公司做舆情系统的产品经理,可以通过它理解NLP能力的边界;准备做AI应用开发、AI Agent的工程师,可以通过它打好文本处理基本功。
4.2 数据准备与预处理的四个步骤
我建议用THUCNews的公开子集做分类任务,大约包含十几个类别,每个类别几千条文本。如果网络不方便,也可以用爬虫抓今日头条或新浪新闻自己标注,但注意版权问题,最好只用做学习。情感分析可以用电商评论数据,比如某电商平台公开的商品评论集,一般包含用户评论和对应的星级,把4星、5星当正面,1星、2星当负面,3星当中性,或者直接只用正负两类。
拿到原始文本后,预处理直接决定后面模型能学成什么样。
第一步是清洗文本。用Python的正则表达式把网页标签、乱码、多余空格、特殊符号清掉。新闻里经常有"(图)""记者XXX摄"这种非正文内容,要根据业务情况去掉。这一步不花时间,但漏了任何一个,后面都会在模型里放大成噪声。
第二步是分字或者分词。传统的TF-IDF方案需要分词,因为中文的词才是基本语义单元。而BERT类预训练模型一般用BERT自带的Tokenizer,它按字切分后转成词表ID,不需要我们提前分词。但这里有个细节:BERT的中文词表是按字的,所以"自然语言处理"会被切成一串独立的字,BERT通过注意力机制来学习字和字之间的关系。有些领域词很多,比如医学、法律、化学,预训练词表覆盖不全,可以用Hugging Face的BertTokenizerFast加自定义词表重新训练一个分词器,不过这个门槛较高,入门项目暂时不用管。
第三步是构建数据集。分类项目里,将数据按8:1:1划分成训练集、验证集、测试集。如果你用的是Transformers库的Trainer,在构造Dataset时直接做映射就行。注意一个问题:如果原始数据是按类别顺序排列的,一定要先shuffle再划分,不然出来的训练集可能只有前几个类别。这一步我踩过坑,曾经因为忘了shuffle,训练集和验证集类别分布完全错位,模型验证集准确率直接崩到随机水平。
第四步是处理类别不均衡。新闻分类数据集比较均衡,但情感分析数据集经常出现正面评论占80%、负面占5%的情况。这种时候可以做降采样、过采样,或者给损失函数加类别权重。最简单有效的是在训练时使用class_weight参数,给样本少的类别更大的损失权重,让模型更关注它们。
4.3 基线方案:分词加TF-IDF加朴素贝叶斯
做任何NLP项目,我都强烈建议先跑一个简单的基线,而不是直接上BERT。基线的主要作用有两个:一是验证数据处理流程有没有问题,二是给后面的复杂模型一个对比基准。
下面用一个非常精简的代码演示新闻分类的基线方案。
import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import Pipeline from sklearn.metrics import classification_report # 假设train_texts是清洗后的新闻文本列表,train_labels是对应的类别标签 # 文本切分词 def tokenize(text): return ' '.join(jieba.cut(text)) # 构建流水线:TF-IDF向量化 + 朴素贝叶斯分类 pipeline = Pipeline([ ('tfidf', TfidfVectorizer(tokenizer=tokenize, max_features=20000)), ('clf', MultinomialNB(alpha=0.1)) ]) # 训练 pipeline.fit(train_texts, train_labels) # 预测并输出报告 print(classification_report(test_labels, pipeline.predict(test_texts)))TF-IDF的核心思想很朴素:一个词在某一篇文档里频繁出现,但在整个语料库的其他文档里很少出现,说明这个词对这篇文档有很强的区分度。比如"进球"在体育新闻里频繁出现,但在财经新闻里几乎不出现,那"进球"就是一个强区分特征。max_features设置为20000,是只保留频率最高的两万个词,既能减少维度又保留核心特征。
基线跑出来的多分类F1值通常能在80%到85%之间,具体分布取决于数据质量。这个数字看着不高,但对于验证流程来说足够了。如果你的基线连70%都没到,先别急着上BERT,回头检查数据清洗和标签对齐。
4.4 基于BERT的微调实现
接下来用Hugging Face Transformers微调一个BERT中文模型做分类。我习惯用bert-base-chinese作为默认选择,参数量1.1亿左右,一张6GB以上显存的显卡就能跑。
from transformers import (BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments) from datasets import Dataset # 加载预训练模型和分词器 model_name = 'bert-base-chinese' tokenizer = BertTokenizer.from_pretrained(model_name) model = BertForSequenceClassification.from_pretrained(model_name, num_labels=len(labels)) # 处理数据:把文本转成模型需要的输入格式 def preprocess_function(examples): return tokenizer(examples['text'], truncation=True, padding='max_length', max_length=128) train_dataset = Dataset.from_dict({'text': train_texts, 'label': train_labels}).map(preprocess_function, batched=True) eval_dataset = Dataset.from_dict({'text': val_texts, 'label': val_labels}).map(preprocess_function, batched=True) # 定义训练参数 training_args = TrainingArguments( output_dir='./news_bert', learning_rate=2e-5, per_device_train_batch_size=16, per_device_eval_batch_size=16, num_train_epochs=3, weight_decay=0.01, evaluation_strategy='epoch', save_strategy='epoch', load_best_model_at_end=True, logging_dir='./logs', ) # 训练 trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, ) trainer.train()这里有几个关键细节,我在实际项目里反复被问到。
学习率为什么选2e-5而不是0.01?因为BERT已经预训练好了,我们只需要在它基础上做微调,学习率过大会把预训练学到的通用语义知识冲掉,这叫灾难性遗忘。通常BERT微调的学习率在1e-5到5e-5之间,这个范围是大量工程验证过的。
max_length为什么是128?新闻文本有的很长。取128个字会截断大部分超长文本,但分类任务里,决定类别的关键信息往往出现在开头,硬截断对效果影响不大。如果你做阅读理解或者长文档分类,建议用256或512,但训练时间和显存消耗会显著增加。
批大小16是常见的性价比选择。如果显存不够,调成8甚至4也行,但要注意验证集准确率稍作浮动;如果显存充裕,批量大小32通常能训练得更稳定。
训练完成后,用测试集评估。BERT微调后,新闻分类的准确率通常能到93%到97%。对比之前基线的80%多,提升非常明显,这就是预训练模型的语义理解能力带来的收益。
额外说一个提升技巧:如果类别数量很少,比如就是正负两类,可以直接用AutoModelForSequenceClassification,但输出维度会不同。如果任务更像排序问题,还可以用跨编码器(Cross-Encoder)方案,效果更好但推理更慢。
4.5 情感分析的快速实现
情感分析可以复用刚才的BERT微调流程,只需要改数据和标签数量。这里我再给一个更轻量的小技巧:如果你不想训练模型,想在demo里快速验证一下,可以直接用Hugging Face的pipeline接口调用现成的中文情感分析模型。
from transformers import pipeline classifier = pipeline('sentiment-analysis', model='uer/roberta-base-finetuned-jd-binary-chinese') result = classifier('这个手机电池太不耐用了,半天就没电') print(result) # [{'label': 'negative', 'score': 0.998...}]这种现成模型在标准电商评论上效果很好,但换到专业领域,比如医疗评论、法律文书、游戏评论,效果就会急剧下降。原因在于预训练模型的语料分布和你的目标域数据分布不一样。所以凡是正经上线的项目,我都建议用业务数据做微调。
情感分析有一类容易翻车的场景是反讽和转折句。"这产品质量真不错,用了三天就坏了",字面前半段是正面,但整体是负面。BERT能利用上下文捕捉一部分反讽,但准确率远没有普通句子高。如果业务对这类场景敏感,可以考虑用大规模语言模型加提示词来做,因为大模型的常识推理能力更强,能识别出日常语言里的潜台词。
5. NLP工程化实战:模型上线与性能调优的四个关键点
在真实的AI应用开发里,模型训练只是冰山一角。把NLP模型做成一个稳定、高效、能被业务方长期使用的服务,才是真正的挑战。这里分享四个关键点。
第一个是推理服务化。常见的做法是用FastAPI封装模型接口,模型本身加载一次到内存,后续请求都走同一个模型实例。建议把分词器、模型都缓存到全局变量,而不是每次请求都加载一遍模型,否则延迟高到无法接受。输入文本要做长度控制,超长的直接截断或返回提示,避免单请求拖垮服务。对于高并发场景,可以用消息队列异步处理,或者用vLLM、Triton这样的推理加速框架。
第二个是推理加速。BERT模型的推理速度问题,最直接的方案是知识蒸馏。用一个大的教师BERT模型训练一个小学生模型,比如从BERT-base蒸馏出TinyBERT,推理速度可以提升2到3倍,准确率只下降1到2个百分点。另外一个更简单的方案是ONNX导出,把PyTorch模型转成ONNX格式后用ONNX Runtime推理,在CPU环境下通常有1.5到2倍的加速。还有一些场景可以换成更轻量的模型,比如ALBERT,或者直接用TextCNN加词向量代替BERT,在效果够用的时候大幅降低成本。
第三个是数据漂移监控。模型上线后,业务数据分布一定会变。比如新闻分类模型,如果训练数据只有2023年的新闻,2024年出现了全新热点词,模型就很容易分错。我习惯在服务端记录每个请求的预测置信度,设置一个阈值,当低置信度请求的比例连续多天升高,就触发告警,通知算法团队重新标注数据、重新训练。这个机制虽然简单,但能帮你避免很多线上事故。
第四个是可解释性需求。在一些合规要求高的行业,比如金融、医疗,业务方不仅要知道"分成哪类",还想知道"为什么这么分"。传统方案如TF-IDF加逻辑回归,可以输出每个词对预测结果的影响权重;BERT类模型则可以用LIME、SHAP等可解释性工具来分析预测原因。这里有个容易被忽略的问题:如果项目强制要求可解释性,前期就别选太复杂的模型,否则后面解释起来特别痛苦。选型时一定把可解释性需求列进评估标准,不要只看准确率。
6. NLP和AI Agent、大模型的时代关系:NLP真的过时了吗
最近这两年被问到最多的一个问题是:大模型都这么强了,还需要专门学NLP吗?
我的真实感受是:NLP不仅没过时,反而成了大模型落地最关键的地基。AI Agent能自主规划任务、调用工具、和用户对话,底层全是NLP能力在支撑。
先拆解一下AI Agent里NLP在干什么。
第一块是意图识别和槽位填充。你要做一个助手Agent,用户说"帮我订一间明天晚上在市中心的双人房",Agent先要识别出"订房"这个意图,再抽出"明天晚上""市中心""双人房"这几个槽位。这种任务在对话式AI里非常成熟,可以用BERT微调方案快速落地,也可以直接用大模型加JSON模式的提示词来做。在大模型时代,这两条路径并存,前者适合对延迟和成本敏感的场景,后者适合对话复杂、槽位灵活的场景。
第二块是RAG,检索增强生成。RAG的核心流程是:先对文档库做切片和向量化,把切片存入向量数据库;用户提问时,把问题也向量化,在向量库里检索最相关的几个切片;然后把问题和检索结果一起拼成提示词,交给大模型生成答案。这里面涉及的关键技术,比如文本切片策略、向量召回排序、重排,本质都是NLP信息检索的老本行。我见过不少团队觉得RAG就是把PDF丢进向量库就完事了,结果检索一堆不相关的内容,回答效果极差。切片长度怎么选、标题和正文怎么关联、召回后怎么重排,这些细节才是RAG工程化的核心难点。
第三块是工具调用和结构化输出。现在的AI Agent要调用外部API、操作软件,模型需要把用户的话转成结构化的调用参数。比如用户说"帮我看看明天上海天气",模型需要输出{"city": "上海", "date": "明天"}这样的JSON。这其实是一种序列到序列的任务,只要数据舍得标注,小模型也能做,用大模型通过Function Calling做效果更好。这块属于NLP和AI编排交叉的领域,很多做AI应用开发的人低估了它的重要性。
另一方面,AI编程也是典型应用场景。GitHub Copilot这类工具本身就是NLP模型的产物:把代码当作一种特殊的"语言",用海量代码库预训练,再根据注释和上文生成代码。AI编程最核心的能力是理解程序员的意图,以及对代码上下文的语义建模,这跟NLP的文本生成没有本质区别。
再说一个更宏观的视角。搜索引擎、推荐系统、舆情监控、专利检索、法律文书分析、医疗病历结构化,这些传统NLP应用不仅没有消失,反而因为大模型的出现获得了新活力。比如专利相关场景,以前要人工阅读大量专利文档做分类和相似度比对,现在可以用NLP做实体抽取,再用大模型生成摘要,再用向量检索做相似专利推荐,整套流程的效率提升非常可观。
所以我的建议很明确:如果想做AI应用开发,不要只盯着大模型的API调用和提示词写法,一定要从头把NLP的基本功补上。文本清洗、数据标注、分类模型、信息抽取、向量检索、模型评估,这些能力在哪个时代都不过时。大模型像是一个能力很强的厨子,但你的食材处理不好、菜谱设计不合理,厨子再厉害也做不出好菜。
7. 一线踩坑实录:NLP项目里的7个高频问题及排查方法
最后把我这几年做NLP项目遇到的高频问题整理成一份速查表。这些问题在理论教程里基本不会写,但实战中几乎每个项目都会碰上。
| 问题 | 典型现象 | 排查思路 | 解决方案 |
|---|---|---|---|
| 中文分词效果差 | 领域专业词被切碎,如"自然语言处理"被切成"自然""语言""处理" | 检查分词器的词典是否覆盖业务领域 | 加自定义词典,或切换到领域专用分词模型 |
| 标签分布不均 | 某个类别准确率极高,另一个类别几乎全被分错 | 看训练集里各类别的样本量 | 类别加权、过采样、降采样;或者用Focal Loss |
| 验证集效果不错,线上效果崩 | 线下F1有95%,线上一塌糊涂 | 检查训练数据和线上数据的分布差异 | 定期采线上数据补充训练集;建立数据漂移监控 |
| 显存不足 | 训练时CUDA Out of Memory | 模型太大或单样本太长 | 减小批大小、缩短max_length、换小模型、用梯度累积 |
| 模型推理太慢 | 上线后单请求要300ms以上 | 模型参数量大、没用加速框架 | ONNX转换、量化、知识蒸馏、或换轻量模型 |
| 情感分析分不出反讽 | 明显吐槽被分成正面 | 模型对上下文理解有限 | 用更大模型或搭配提示词方案,增加反讽类训练数据 |
| 新词、热词导致分类错误 | 模型不认识最新网络热词 | 词表覆盖不全、训练数据陈旧 | 定期增量训练,或者在大模型方案里让模型结合检索结果推理 |
这七个问题里,最想单独拎出来说的是数据标注质量问题。很多入门项目失败,不是模型不行,而是标注数据里存在大量噪音。我接手过一个情感分析项目,两个标注员对同一条评论一个标正面一个标负面,团队直接用这个数据训练,效果自然很差。后来我们让标注员先对齐标准,做了标注一致性检验,用Kappa系数衡量一致程度,低于0.6就返工重标,数据质量上来之后模型效果直接提升了8个百分点。数据的质量和数量同样重要,甚至更重要。
另外还要提醒一点:训练集和验证集不要做数据清洗的时候用不同的流程。我见过有人训练集做了去重、去停用词、表情符号转文本,但验证集什么都没做,结果验证集准确率一直上不去。清洗流程一定要封装成同一个函数,训练集、验证集、测试集走同一套预处理逻辑,这是最容易忽略又最影响复现的细节。
最后再分享一个小技巧,特别是给做AI应用开发的朋友:当你用大模型API做文本任务时,记得把大模型的输出做成结构化的。让模型先输出JSON,再解析JSON做后续逻辑,别让模型输出大段大段的自由文本,不然解析起来会把你逼疯。给模型明确的输出模板,往往比在代码里做各种鲁棒性判断靠谱得多。
NLP自然语言处理这条路,说难也难,说容易也容易。难在它涉及的领域特别杂,分词、语义、语料、工程化、模型调优,每一项都要积累;容易在你只要掌握一套标准流程,并且多踩几次坑,很多问题就都有条件反射式的解法了。真心建议每个想进入AI领域的人都亲手跑通一个NLP小项目,不需要多复杂,就是从数据清洗到模型上线的完整闭环。只有完整走一遍,你才会真正明白"机器读不懂人话"这件事,说到底不是机器笨,而是我们还没有把人的语言变成机器能计算的数学。