戳戳猫的小窝
更新日志
关于
## 1 人工智能、机器学习与深度学习 **人工智能(AI)**:人工智能是计算机科学的一个分支,它试图创建能够执行通常需要人类智能的任务的计算机系统或机器。这些任务包括学习、推理、解决问题、感知环境、理解语言和做出决策等。人工智能的目标是创建能够模拟人类智能行为的机器,使它们能够在各种复杂环境中自主地执行任务和做出决策。 **机器学习(ML)**:机器学习是实现人工智能的一种方法,它使计算机系统能够从数据中自动学习和改进,而不需要显式地编程。机器学习算法通过分析数据中的模式和规律,来构建模型,从而对新的数据进行预测或决策。机器学习是人工智能的一个子领域,专注于通过数据驱动的方法来实现人工智能的目标。它提供了一种让机器从经验中学习的方式,从而提高其性能和适应性。机器学习在许多领域都有广泛的应用,如图像识别、语音识别、自然语言处理、推荐系统、预测分析等。它通过从数据中学习,使机器能够自动适应新的情况和任务。 **深度学习(DL)**:深度学习是机器学习的一个子集,它基于人工神经网络,特别是深度神经网络,来模拟人类大脑的工作方式。深度学习模型通过多层神经网络来自动提取数据中的特征和模式,从而实现更复杂的学习任务。深度学习是机器学习的一个分支,它使用更复杂的神经网络结构来处理和分析数据。深度学习模型能够自动从原始数据中学习特征表示,而不需要手动提取特征,这使得它在处理大规模和高维度数据时具有优势。深度学习在图像识别、语音识别、自然语言处理、机器翻译、推荐系统等领域取得了显著的成果。它通过多层神经网络的学习能力,能够处理更复杂的任务和数据类型,推动了人工智能技术的发展。  ## 2 神经网络的发展  ## 3 NLP的发展 自然语言处理(NLP)是人工智能领域的重要分支,其发展历程中形成了多种方法和技术。以下是基于规则、基于统计和基于神经网络的自然语言处理方法介绍: ### 3.1 基于规则的方法 - **定义**:基于规则的方法依赖于预定义的语言规则和语法结构,通过编写特定的规则来处理和生成文本。这些规则可以涵盖词汇、语法、语义等不同层面。 - **工作原理**:开发者或语言学家根据语言学知识和经验,手动制定一系列规则和模板,这些规则描述了语言的结构和语义关系。例如,在词性标注中,可以定义规则来识别名词、动词、形容词等词性。在句法分析中,可以使用语法规则和规则库来构建句子的结构树图。 - **优缺点**:基于规则的方法在特定任务上表现良好,能够提供准确的结果,尤其是在语言结构相对简单且规则明确的情况下。然而,这种方法灵活性较差,难以处理复杂的语言现象和语义变化,需要不断更新和调整规则以适应新的语言数据。 - **应用场景**:基于规则的方法常用于语音合成、机器翻译、问答系统等任务。例如,在中文分词中,可以使用基于字典和规则的方法,如正向最大匹配算法和逆向最大匹配算法,将连续的汉字序列切分成词语。  ### 3.2 基于统计的方法 - **定义**:基于统计的方法使用概率模型来分析和预测语言现象,依赖于大规模语料库的统计信息。通过统计语言中词、短语或句子的出现频率和共现情况,构建概率模型,从而实现对语言的理解和生成。 - **工作原理**:基于统计的方法首先对大规模语料库进行统计分析,计算词或词序列的频率、概率分布等统计特征。然后,根据这些统计特征,构建概率模型,如n-gram模型、隐马尔可夫模型(HMM)等。在处理自然语言任务时,使用这些概率模型来预测词或句子的概率,从而进行语言理解、生成或分类。 - **优缺点**:基于统计的方法能够自动从语料库中学习语言规律,具有较强的适应性和泛化能力。它能够处理大规模数据,并随着数据量的增加不断提高性能。然而,基于统计的方法依赖于数据的质量和数量,对数据的统计规律较为敏感。在数据不足或存在偏差的情况下,其性能可能受到影响。 - **应用场景**:基于统计的方法广泛应用于语言识别、文本分类、情感分析、机器翻译等领域。例如,在机器翻译中,可以使用统计机器翻译模型,通过分析平行语料库中源语言和目标语言的对应关系,实现自动翻译。 ``` 我喜欢吃苹果->我喜,喜欢,欢吃,吃苹,苹果 我喜欢吃香蕉->我喜,喜欢,欢吃,吃香,香蕉 她喜欢吃葡萄->她喜,喜欢,欢吃,吃葡,葡萄 他不喜欢吃香蕉->他不,不喜,喜欢,欢吃,吃香,香蕉 他喜欢吃苹果->他喜,喜欢,欢吃,吃苹,苹果 她喜欢吃草莓->她喜,喜欢,欢吃,吃草,草莓 ``` #### 构建实验语料库 ```python # 构建一个玩具数据集 corpus = [ "我喜欢吃苹果", "我喜欢吃香蕉", "她喜欢吃葡萄", "他不喜欢吃香蕉", "他喜欢吃苹果", "她喜欢吃草莓"] ``` #### 把句子分成N个分词 ```python # 定义一个分词函数,将文本转换为单个字符的列表 from step1 import corpus def tokenize(text): return [char for char in text] # 将文本拆分为字符列表 if __name__ == '__main__': print(tokenize(corpus)) ``` #### 计算每个分词在语料库中的词频 ```python # 定义计算N-Gram词频的函数 from collections import defaultdict, Counter # 导入所需库 from step1 import corpus from step2 import tokenize def count_ngrams(corpus, n): ngrams_count = defaultdict(Counter) # 创建一个字典,存储N-Gram计数 for text in corpus: # 遍历语料库中的每个文本 tokens = tokenize(text) # 对文本进行分词 for i in range(len(tokens) - n + 1): # 遍历分词结果,生成N-Gram ngram = tuple(tokens[i:i+n]) # 创建一个N-Gram元组 prefix = ngram[:-1] # 获取N-Gram的前缀 token = ngram[-1] # 获取N-Gram的目标单字 ngrams_count[prefix][token] += 1 # 更新N-Gram计数 return ngrams_count bigram_counts = count_ngrams(corpus, 2) # 计算Bigram词频 if __name__ == '__main__': print("Bigram词频:") # 打印Bigram词频 for prefix, counts in bigram_counts.items(): print("{}: {}".format("".join(prefix), dict(counts))) ``` #### 计算每个分词出现的概率 ```python # 定义计算N-Gram出现概率的函数 from collections import defaultdict, Counter from step3 import bigram_counts def ngram_probabilities(ngram_counts): ngram_probs = defaultdict(Counter) # 创建一个字典,存储N-Gram出现的概率 for prefix, tokens_count in ngram_counts.items(): # 遍历N-Gram前缀 total_count = sum(tokens_count.values()) # 计算当前前缀的N-Gram计数 for token, count in tokens_count.items(): # 遍历每个前缀的N-Gram ngram_probs[prefix][token] = count / total_count # 计算每个N-Gram出现的概率 return ngram_probs bigram_probs = ngram_probabilities(bigram_counts) # 计算Bigram出现的概率 if __name__ == '__main__': print("\nbigram出现的概率:") # 打印Bigram概率 for prefix, probs in bigram_probs.items(): print("{}: {}".format("".join(prefix), dict(probs))) ``` #### 根据分词出现的概率,定义生成下一个词的函数 ```python # 定义生成下一个词的函数 def generate_next_token(prefix, ngram_probs): if not prefix in ngram_probs: # 如果前缀不在N-Gram中,返回None return None next_token_probs = ngram_probs[prefix] # 获取当前前缀的下一个词的概率 next_token = max(next_token_probs, key=next_token_probs.get) # 选择概率最大的词作为下一个词 return next_token ``` #### 输入一个前缀,生成连续文本 ```python # 定义生成连续文本的函数 from step4 import bigram_probs from step5 import generate_next_token def generate_text(prefix, ngram_probs, n, length=6): tokens = list(prefix) # 将前缀转换为字符列表 for _ in range(length - len(prefix)): # 根据指定长度生成文本 # 获取当前前缀的下一个词 next_token = generate_next_token(tuple(tokens[-(n-1):]), ngram_probs) if not next_token: # 如果下一个词为None,跳出循环 break tokens.append(next_token) # 将下一个词添加到生成的文本中 return "".join(tokens) # 将字符列表连接成字符串 if __name__ == '__main__': # 输入一个前缀,生成文本 generated_text = generate_text("她", bigram_probs, 2) print("\n生成的文本:", generated_text) # 打印生成的文本 ``` ### 3.3 基于传统神经网络的方法 - **定义**:基于神经网络的方法利用神经网络模型来学习和表示语言数据中的复杂关系和模式。神经网络通过多层结构和大量参数,自动学习语言的特征表示和语义关系,从而实现自然语言处理任务。常见的神经网络方法包括循环神经网络(RNN)、长短时记忆网络(LSTM)。 - **工作原理**:基于神经网络的方法将语言数据表示为向量或张量形式,并通过多层神经网络进行训练。例如,在词嵌入(word embedding)中,使用神经网络将词汇映射到连续的向量空间,使得语义相似的词在向量空间中靠近。在循环神经网络(RNN)中,引入循环结构来捕捉序列数据中的时间依赖关系。 - **优缺点**:基于神经网络的方法具有强大的特征学习和表达能力,能够处理复杂的数据关系和语义变化。它可以自动从数据中学习特征,无需手动设计规则或特征提取器。此外,基于神经网络的方法在处理长文本和复杂的语义关系时表现出色,为自然语言处理任务提供了更高的准确性和鲁棒性。然而,基于神经网络的方法需要大量的训练数据和计算资源,模型的训练和推理过程可能较为耗时。同时,神经网络模型的可解释性较差,难以直接理解其内部的决策过程。 - **应用场景**:基于神经网络的方法在自然语言生成、机器翻译、文本分类、情感分析、问答系统等任务中得到了广泛应用。
2.NLP发展