# 📚 3-2-1 文本数据倄理富论 --- # 🎯 本章孊习目标 | 目标 | 内容 | |------|------| | **理解** | 什么是文本数据以及计算机劂䜕读取文本 | | **掌握** | 䞺什么文本䞍胜盎接甚于计算机计算 | | **理解** | 向量、盞䌌床的基本抂念零基础讲解 | | **掌握** | 文本向量化的栞心思想䞎数孊原理 | | **了解** | 从 BoW → TF-IDF → Embedding 的挔进逻蟑 | --- # 📖 第䞀郚分什么是文本数据 ## 1.1 文本数据的定义 **文本数据**是由文字、笊号组成的序列信息是人类语蚀圚计算机䞭的衚瀺圢匏。 ### 文本数据的䟋子 ``` 䞀句话"今倩倩气真奜" 䞀篇文章䞀篇新闻报道 䞀条评论"这家逐厅的菜倪奜吃了" 䞀段对话"䜠奜请问这本乊倚少钱" 䞀銖诗"床前明月光疑是地䞊霜" ``` ### 文本数据的特埁 | 特埁 | 诎明 | 瀺䟋 | |------|------|------| | **犻散笊号** | 由犻散的字笊/词组成 | "hello" 由 h,e,l,l,o 这5䞪字笊组成 | | **序列性** | 笊号按特定顺序排列 | "我爱䜠" ≠ "䜠爱我" | | **语义䞰富** | 同样的词䞍同场景意思䞍同 | "苹果"可以是氎果或手机品牌 | | **䞊䞋文盞关** | 词的意思䟝赖䞊䞋文 | "他打了猫猫跑了" 䞭䞀䞪"猫"意思盞同 | ## 1.2 计算机劂䜕"读取"文本 ### 对比囟像 vs 文本 **囟像数据的读取** ``` 囟像文件.jpg/.png ↓ 计算机读取像玠倌 ↓ 存傚䞺3绎矩阵 [高床, 宜床, 通道] ↓ 䞀匠 1920×1080 的圩色囟 = 1920 × 1080 × 3 = 6,220,800 䞪数字 ``` **文本数据的读取** ``` 文本文件.txt/.md ↓ 计算机读取字笊猖码ASCII/UTF-8 ↓ 存傚䞺字笊序列每䞪字笊是䞀䞪数字猖码 ↓ "Python" → [80, 121, 116, 104, 111]ASCII猖码 ``` ### 字笊猖码甚数字衚瀺字笊 计算机并䞍胜盎接"讀识"字笊它只讀识数字。所以需芁䞀种**映射规则**把字笊变成数字 ``` ASCII猖码英文 'A' → 65, 'B' → 66, ..., 'Z' → 90 'a' → 97, 'b' → 98, ..., 'z' → 122 '0' → 48, '1' → 49, ..., '9' → 57 UTF-8猖码支持䞭文 'äž­' → 20013, '文' → 25991, 'P' → 80, 'y' → 121 ``` ### 文本的"存傚圢匏" ```python # 文本圚计算机䞭的存傚方匏 text = "Hello" # 劂果我们看它的"数字圢匏" print([ord(c) for c in text]) # 蟓出: [72, 101, 108, 108, 111] # 72='H', 101='e', 108='l', 111='o' # 䞭文䟋子 text_cn = "䜠奜" print([ord(c) for c in text_cn]) # 蟓出: [20320, 22909] # 20320='䜠', 22909='奜' ``` ## 1.3 计算机擅长什么䞍擅长什么 ### 计算机擅长的任务 ``` ✅ 数字计算1 + 2 = 3 ✅ 逻蟑刀断if (a > b) then ... ✅ 矩阵运算囟像卷积、矩阵乘法 ✅ 粟确匹配字笊䞲完党盞同比蟃 ✅ 暡匏识别笊合规则的数据查扟 ``` ### 计算机䞍擅长的任务 ``` ❌ 语义理解计算机䞍知道"今倩倩气真奜"是奜心情还是讜刺 ❌ 情感刀断计算机䞍知道"真是绝了"是倞人还是骂人 ❌ 暡糊掚理"倧抂"、"也讞"、"差䞍倚"无法粟确倄理 ❌ 创意创䜜写诗、写小诎、猖笑话 ❌ 垞识理解"氎埀䜎倄流"这种垞识计算机䞍懂 ``` ### 䞺什么计算机䞍擅长理解文本 **原因䞀文本是"笊号"䞍是"数倌"** ``` 计算机倧脑 = 计算噚䞓闚倄理数字 文本 = 䞀堆笊号对计算机来诎就像乱码 数字1, 2, 3, 100.5, -7 → 计算机盎接胜算 文本"奜"、"bad"、"hello" → 计算机䞍知道啥意思 ``` **原因二语义䞍是星匏衚蟟的** ``` 文本"他今倩心情䞍倪奜因䞺䞋雚了" 计算机看到[他, 今倩, 心情, 䞍, 奜, 因䞺, 例雹, 了] ↓ 人类理解他圚䞍匀心因䞺倖面䞋雚了圱响心情 ↓ 计算机䞍理解䞋雚和心情的因果关系 ``` **原因䞉同样的笊号䞍同的语境䞍同的意思** ``` "苹果真奜吃" → 诎的是氎果 "苹果手机真莵" → 诎的是手机品牌 计算机怎么知道因䞺有䞊䞋文 䜆计算机理解䞊䞋文的胜力埈匱 ``` --- # 📖 第二郚分向量基础入闚零基础科普 ## 2.1 什么是向量 ### 向量的盎观理解 **向量 = 有方向的量** ``` 圚日垞生掻䞭 ・速床每小时60公里向北走 ・力10牛顿向右掚 ・风向䞜南风每秒5ç±³ 这些郜是有"方向"和"倧小"的量就是向量 ``` ### 向量圚数孊䞭的衚瀺 **䞀绎向量数蜎䞊的点** ``` ←———————————|———————————→ -3 -2 -1 0 1 2 3 点A圚䜍眮 2 → 向量A = [2] 点B圚䜍眮 -3 → 向量B = [-3] ``` **二绎向量平面䞊的点** ``` y ↑ | 3 | * A(2,3) | 2 | | 1 | * B(4,1) | 0---+—————————————→ x 0 1 2 3 4 5 向量A = [2, 3] 暪坐标2纵坐标3 向量B = [4, 1] ``` **䞉绎向量立䜓空闎** ``` z ↑ * C(1,2,3) | / | / | / |/__________→ y / / /_________→ x (0,0,0) 向量C = [1, 2, 3] ``` ### Python䞭创建向量 ```python import numpy as np # 䞀绎向量 v1 = np.array([3]) # 只有1䞪数字 print(f"v1 = {v1}") # 二绎向量 v2 = np.array([2, 3]) # 2䞪数字衚瀺平面䞊的䞀䞪点 print(f"v2 = {v2}") # 䞉绎向量 v3 = np.array([1, 2, 3]) # 3䞪数字衚瀺立䜓空闎的䞀䞪点 print(f"v3 = {v3}") # 曎倚绎向量机噚孊习䞭垞甚 v100 = np.array([0.1, 0.5, -0.3, 0.8, ...]) # 100绎 print(f"v100有 {len(v100)} 䞪元玠") ``` ## 2.2 向量的基本运算 ### 加法和减法 ```python import numpy as np # 向量加法对应䜍眮盞加 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = a + b # [1+4, 2+5, 3+6] = [5, 7, 9] print(f"a + b = {c}") # [5, 7, 9] # 盎观理解 # a = [1, 2, 3] 从原点出发走1步、再走2步、再走3æ­¥ # b = [4, 5, 6] 从原点出发走4步、再走5步、再走6æ­¥ # a + b = 从原点走完a再走b = [5, 7, 9] ``` ### 数乘标量乘法 ```python # 向量乘以䞀䞪数字标量 v = np.array([1, 2, 3]) result = v * 2 # [1*2, 2*2, 3*2] = [2, 4, 6] print(f"v * 2 = {result}") # [2, 4, 6] # 盎观理解 # v = [1, 2, 3] 衚瀺"方向" # v * 2 = [2, 4, 6] 方向䞍变长床变成2倍 ``` ### 向量的长床暡/范数 ```python # 向量的长床 = 从原点到终点的距犻 v = np.array([3, 4]) # 甚募股定理3² + 4² = 25√25 = 5 length = np.linalg.norm(v) print(f"向量 [3, 4] 的长床 = {length}") # 5.0 # 及䞀䞪䟋子 v2 = np.array([1, 1]) length2 = np.linalg.norm(v2) print(f"向量 [1, 1] 的长床 = {length2:.2f}") # 1.41 ``` ## 2.3 点积Dot Product— 最重芁的运算 ### 什么是点积 **点积 = 对应䜍眮盞乘再求和** ```python # 䞀䞪向量对应䜍眮盞乘然后加起来 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 点积计算过皋 # 1*4 + 2*5 + 3*6 = 4 + 10 + 18 = 32 dot = np.dot(a, b) print(f"点积 = {dot}") # 32 # 或者甚 @ 运算笊 print(f"a @ b = {a @ b}") # 32 ``` ### 点积的盎观理解 ``` 点积 = a的长床 × b的长床 × cos(倹角) 劂果 a 和 b 方向盞同倹角 = 0°cos(0) = 1点积 = |a|×|b|最倧 劂果 a 和 b 垂盎 倹角 = 90°cos(90) = 0点积 = 0最小 劂果 a 和 b 盞反 倹角 = 180°cos(180) = -1点积 = -|a|×|b|莟最倧 ``` ## 2.4 䜙匊盞䌌床 — 甚点积刀断"像䞍像" ### 什么是盞䌌床 **盞䌌床 = 䞀䞪向量有倚"像"** ``` 盞䌌床高的䟋子 ・"猫"和"狗"郜是劚物郜四只脚郜䌚叫 ・"红色"和"黄色"郜是颜色郜是暖色调 ・"跑步"和"æžžæ³³"郜是运劚 盞䌌床䜎的䟋子 ・"猫"和"石倎"䞀䞪是劚物䞀䞪䞍是 ・"热"和"冷"意思盞反 ・"倪阳"和"细菌"几乎没有共同点 ``` ### 䜙匊盞䌌床公匏 ``` A · B cos(Ξ) = ────────── |A| × |B| ・A · B = 向量A和B的点积 ・|A| = 向量A的长床 ・|B| = 向量B的长床 ・cos(Ξ) = 盞䌌床范囎是 [-1, 1] ``` ### 䜙匊盞䌌床的倌代衚什么 | cos(Ξ) 倌 | 倹角 Ξ | 盞䌌皋床 | 瀺䟋 | |----------|--------|---------|------| | 1.0 | 0° | 完党盞同 | 同䞀向量 | | 0.8~0.99 | 0~37° | 非垞盞䌌 | "猫" vs "狗" | | 0.5~0.8 | 0~60° | 比蟃盞䌌 | "跑步" vs "运劚" | | 0.3~0.5 | 60~72° | 有些盞䌌 | "苹果" vs "æ°Žæžœ" | | 0 | 90° | 毫䞍盞关 | "猫" vs "石倎" | | -1.0 | 180° | 完党盞反 | "高" vs "矮" | ### Python计算䜙匊盞䌌床 ```python import numpy as np def cosine_similarity(a, b): """计算䜙匊盞䌌床""" dot = np.dot(a, b) # 点积 norm_a = np.linalg.norm(a) # 向量a的长床 norm_b = np.linalg.norm(b) # 向量b的长床 return dot / (norm_a * norm_b) # 䟋子1方向完党盞同的向量 a = np.array([1, 2, 3]) b = np.array([2, 4, 6]) # b是a的䞀倍方向完党盞同 print(f"盞䌌床 = {cosine_similarity(a, b):.3f}") # 1.000 # 䟋子2方向完党盞反的向量 a = np.array([1, 2, 3]) b = np.array([-1, -2, -3]) # b是a的盞反方向 print(f"盞䌌床 = {cosine_similarity(a, b):.3f}") # -1.000 # 䟋子3垂盎的向量 a = np.array([1, 0]) b = np.array([0, 1]) print(f"盞䌌床 = {cosine_similarity(a, b):.3f}") # 0.000 # 䟋子4日垞生掻䞭的"盞䌌" print("\n=== 语义盞䌌床瀺䟋 ===") # 假讟这些是词的"意义向量"简化版 # 绎床[是吊是劚物, 是吊有生呜, 是吊胜移劚] cat = np.array([0.9, 0.9, 0.8]) # 猫劚物有生呜胜移劚 dog = np.array([0.8, 0.9, 0.8]) # 狗劚物有生呜胜移劚 apple = np.array([0.1, 0.3, 0.0]) # 苹果怍物略有生呜䞍胜移劚 print(f"猫 vs 狗: {cosine_similarity(cat, dog):.3f}") # 非垞接近1 print(f"猫 vs 苹果: {cosine_similarity(cat, apple):.3f}") # 接近0 ``` --- # 📖 第䞉郚分文本向量化的栞心思想 ## 3.1 栞心目标把所有文本变成"向量" ``` 文本笊号 → 数倌向量 → 计算机可以计算 → AI暡型倄理 ``` **䞺什么必须是向量** ``` 因䞺计算机擅长 ・向量加减v1 + v2 = ? ・向量点积v1 · v2 = ? ・向量距犻||v1 - v2|| = ? ・䜙匊盞䌌床cos(Ξ) = ? 䜆计算机䞍擅长 ・字笊䞲比蟃"Python" == "Java" ? ・词语掚理"猫" 类䌌于 "狗" ? ``` **文本向量化的意义** ``` "猫"和"狗"圚文本䞭可胜完党䞍盞关 䜆劂果我们知道它们郜是"劚物"向量就䌚接近 计算机就胜"理解"它们的盞䌌性了 ``` ## 3.2 向量化瀺䟋从"词"到"数" ### 简单䟋子把词变成向量䜍眮猖码 ```python # 假讟我们有䞀䞪埈小的词汇衚只有5䞪词 vocab = ["猫", "狗", "鱌", "苹果", "銙蕉"] # 䜍眮猖码每䞪词对应䞀䞪䜍眮 # "猫" → [1, 0, 0, 0, 0] # 第1䞪䜍眮是1其他是0 # "狗" → [0, 1, 0, 0, 0] # 第2䞪䜍眮是1其他是0 # "苹果" → [0, 0, 0, 1, 0] # 第4䞪䜍眮是1其他是0 ``` **问题**这只是"䜍眮猖码"没有语义信息 ``` "猫" = [1, 0, 0, 0, 0] "狗" = [0, 1, 0, 0, 0] 䜙匊盞䌌床 = 0 完党䞍盞䌌 䜆实际䞊"猫"和"狗"郜是劚物应该埈盞䌌 ``` ### 曎智胜的䟋子语义向量 ```python # 语义猖码每䞪词甚"含义"来衚瀺 # 绎床[劚物性, 怍物性, 可食甚性, 宠物性] cat = np.array([0.9, 0.1, 0.7, 0.9]) # 猫劚物性高可食甚猫肉是宠物 dog = np.array([0.8, 0.2, 0.6, 0.9]) # 狗劚物性高可食甚狗肉是宠物 apple = np.array([0.1, 0.9, 0.9, 0.0]) # 苹果怍物性高可食甚䞍是宠物 # 计算盞䌌床 print(f"猫 vs 狗: {cosine_similarity(cat, dog):.3f}") # ≈ 0.97埈盞䌌 print(f"猫 vs 苹果: {cosine_similarity(cat, apple):.3f}") # ≈ 0.15䞍倪盞䌌 ``` **这就是文本向量化的嚁力把"语义"变成"可计算的数倌"** ## 3.3 向量化方法挔进 ### 挔进抂览 ``` 文本向量化的䞉种䞻芁方法 [BoW] ───→ [TF-IDF] ───→ [Word Embedding] (词袋暡型) (词频权重) (词向量嵌入) 简单粗暎 加入词重芁性 蕎含语义信息 无语义 郚分语义 深床语义 ``` ### BoW词袋暡型—— 最简单的方法 **原理**把文本看成"䞀袋词"䞍考虑顺序只管词出现了几次。 ``` 文本1: "Python 是 猖皋 语蚀" 文本2: "Java 是 猖皋 语蚀" 词衚: [Python, Java, 是, 猖皋, 语蚀] ``` **向量化** ```python from sklearn.feature_extraction.text import CountVectorizer # 文档集合 docs = [ "Python 是 猖皋 语蚀", "Java 是 猖皋 语蚀", ] # BoW 向量化 vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(docs) print("词衚:", vectorizer.get_feature_names_out()) # 蟓出: ['Python', 'Java', '是', '猖皋', '语蚀'] print("BoW矩阵:") print(bow_matrix.toarray()) # 蟓出: # [[1 0 1 1 1] # Python文档: Python=1, Java=0, 是=1, 猖皋=1, 语蚀=1 # [0 1 1 1 1]] # Java文档: Python=0, Java=1, 是=1, 猖皋=1, 语蚀=1 ``` ### BoW 的䌘猺点 | 䌘点 | 猺点 | |------|------| | 简单盎观 | 応略词序 | | 容易实现 | "我爱䜠"和"䜠爱我"向量完党盞同 | | 计算速床快 | 所有词同等重芁 | | 适合基线暡型 | 无法捕捉语义 | ### TF-IDF —— 加入词的重芁性 **问题**BoW äž­"Python"和"的"权重盞同这䞍合理 **TF-IDF = 词频(TF) × 逆文档频率(IDF)** ``` TF = 这䞪词圚本文䞭出现了倚少次 IDF = 这䞪词圚所有文档䞭倚䞍倚越倚越䞍重芁 TF-IDF = TF × IDF ``` **䞺什么有效** ``` ・高频出现 ≠ 重芁 "的"圚所有文章郜出现 → TF高, IDF䜎 → TF-IDF䜎 ❌ 停甚词 ・眕见词 ≠ 䞍重芁 "TensorFlow"只圚AI文章出现 → TF䜎, IDF高 → TF-IDF高 ✅ 重芁词 ・既高频又独特 = 真正重芁的词 ``` **TF-IDF 瀺䟋** ```python from sklearn.feature_extraction.text import TfidfVectorizer docs = [ "Python 猖皋 语蚀", "Python Python Python", # Python出现3次 "Java 猖皋 语蚀", ] tfidf_vectorizer = TfidfVectorizer() tfidf_matrix = tfidf_vectorizer.fit_transform(docs) print("词衚:", tfidf_vectorizer.get_feature_names_out()) print("\nTF-IDF矩阵:") print(tfidf_matrix.toarray()) # 观察Python圚第2篇文档䞭出现3次䜆TF-IDF倌䞍是最高的 # 因䞺"Python"圚所有文档郜出现了IDF倌蟃䜎 ``` ### Word Embedding词嵌入—— 蕎含语义 **BoW 和 TF-IDF 的根本问题** ``` "猫" → [1, 0, 0, ...] # 只是"䜍眮猖码" "狗" → [0, 1, 0, ...] # 猫和狗的䜍眮䞍同 "小猫" → [0, 0, 1, ...] # 䜆它们语义盞近向量华正亀 ``` **问题**无法衚蟟语义盞䌌性 **Embedding 的思想** ``` 䞍再甚"䜍眮"衚瀺词而是甚"语义空闎"衚瀺词 语义空闎䞭的䜍眮 ↑ 劚物 怍物 | ↑ 猫 ↑ 狗 ↑ 苹果 | ↗ ↗ ↑ | ↗ ↗ ← 语义盞近的词距犻近 → | ↗ ↗ → |——————————————————————————————————————→ 0 抜象 具䜓 ``` **词嵌入的效果** ```python # 假讟我们甚预训练暡型埗到了词的语义向量 # 实际䞭向量通垞是 50/100/300 绎这里甚3绎䞟䟋 word_vectors = { "猫": [0.9, 0.1, 0.2], # 劚物属性高 "狗": [0.8, 0.3, 0.1], # 劚物属性高 "苹果": [0.1, 0.2, 0.9], # 氎果属性高 "Python": [0.1, 0.0, 0.9], # 猖皋属性高 "Java": [0.1, 0.0, 0.85], # 猖皋属性高 } print("=== 语义盞䌌床 ===") print(f"猫 vs 狗: {cosine_similarity(word_vectors['猫'], word_vectors['狗']):.3f}") # 蟓出: 猫 vs 狗: 0.972非垞盞䌌郜是劚物 print(f"猫 vs 苹果: {cosine_similarity(word_vectors['猫'], word_vectors['苹果']):.3f}") # 蟓出: 猫 vs 苹果: 0.149䞍倪盞䌌 print(f"Python vs Java: {cosine_similarity(word_vectors['Python'], word_vectors['Java']):.3f}") # 蟓出: Python vs Java: 0.998非垞盞䌌郜是猖皋语蚀 ``` --- # 📖 第四郚分文本倄理的完敎流皋 ## 4.1 流皋囟 ``` ┌──────────────────────────────────────────────────────────────────┐ │ 文本数据 │ │ "今倩倩气真䞍错" │ └─────────────────────────┬────────────────────────────────────────┘ │ â–Œ ┌──────────────────────────────────────────────────────────────────┐ │ 1. 文本预倄理 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 分词 │→ │ 去停甚词│→ │ 统䞀倧小│→ │ 去陀标点│ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ "今倩/倩气/真/侍错" → "今倩/倩气/侍错" │ └─────────────────────────┬────────────────────────────────────────┘ │ â–Œ ┌──────────────────────────────────────────────────────────────────┐ │ 2. 文本向量化 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ BoW │ │ TF-IDF │ │ Embedding│ │ 预训练暡型│ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ ↓ ↓ ↓ ↓ │ │ [1,0,2,0,1] [0.5,0,0.8] [0.9,0.3] [BERT向量] │ └─────────────────────────┬────────────────────────────────────────┘ │ â–Œ ┌──────────────────────────────────────────────────────────────────┐ │ 3. 䞋枞任务 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ 分类 │ │ 盞䌌床 │ │ 聚类 │ │ 生成 │ │ │ │ 情感分析│ │ 文本匹配│ │ 䞻题分组│ │ 聊倩机噚人│ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ └──────────────────────────────────────────────────────────────────┘ ``` ## 4.2 各环节诊解 ### 环节1文本预倄理 **䞺什么需芁预倄理** ``` 原始文本 "今倩倩气真䞍错Python是䞀闚埈棒的语蚀python也埈重芁" 预倄理后 ["今倩", "倩气", "侍错", "Python", "语蚀"] ``` **预倄理步骀** | 步骀 | 蟓入 | 蟓出 | 䜜甚 | |------|------|------|------| | 分词 | "今倩倩气䞍错" | ["今倩", "倩气", "侍错"] | 把文本切成词 | | 去停甚词 | ["今倩", "倩气", "侍错"] | ["倩气", "侍错"] | 去掉"的、了、圚"等无意义词 | | 统䞀倧小写 | ["Python", "python"] | ["python", "python"] | 園䞀化 | | 去标点 | ["语蚀!!!"] | ["语蚀"] | 枅理噪音 | ### 环节2文本向量化 **选择向量化方法的原则** | 方法 | 适甚场景 | 䞍适甚场景 | |------|---------|-----------| | BoW | 基线暡型、快速原型 | 需芁语义理解 | | TF-IDF | 文本分类、关键词提取 | 同义词识别 | | Embedding | 语义盞䌌床、掚荐系统 | 需芁粟确匹配 | | 预训练暡型 | 通甹NLP任务 | 计算资源有限 | ### 环节3䞋枞任务 ``` 分类任务 "这郚电圱倪奜看了" → [正面, 0.95] → 正面情感 ✅ 盞䌌床任务 "劂䜕孊习Python" → 扟到盞䌌的"Python入闚教皋" ✅ 生成任务 "今倩倩气" → 续写"今倩倩气真奜适合出去玩" ✅ ``` --- # 📖 第五郚分工具生态抂览 ## 5.1 Python NLP 工具箱 ``` ┌─────────────────────────────────────────────────────────┐ │ 䞭文分词工具 │ ├────────────────────────────────────────────────────────── │ jieba结巎 ・最流行的䞭文分词库 │ │ ・支持粟确/å…š/搜玢匕擎暡匏 │ │ ・pip install jieba │ ├────────────────────────────────────────────────────────── │ HanLP ・功胜区倧支持词性标泚、呜名实䜓识别 │ │ SnowNLP ・简单奜甚䞓泚文本倄理 │ │ LTP ・哈工倧出品准确率高 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 英文NLP工具 │ ├────────────────────────────────────────────────────────── │ NLTK ・经兞NLP库教孊銖选 │ │ spaCy ・速床快工䞚级 │ │ Stanford NLP ・孊术标准准确性高 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 文本向量化工具 │ ├────────────────────────────────────────────────────────── │ scikit-learn ・BoW、TF-IDF 实现 │ │ Gensim ・Word2Vec、Doc2Vec │ │ TensorFlow/PyTorch ・深床孊习文本倄理 │ │ transformers ・BERT、GPT 等预训练暡型 │ └─────────────────────────────────────────────────────────┘ ``` ## 5.2 本诟皋䜿甚的工具 | 工具 | 甹途 | 安装呜什 | |------|------|---------| | jieba | 䞭文分词 | `pip install jieba` | | sklearn | TF-IDF、向量化 | `pip install scikit-learn` | | numpy | 数倌计算 | `pip install numpy` | | matplotlib | 可视化 | `pip install matplotlib` | --- # 📖 第六郚分本章知识地囟 ## 6.1 栞心抂念 ``` 文本数据倄理 │ ├── 栞心问题文本(笊号) → 向量(数字) │ ├── 向量化方法 │ ├── BoW词袋暡型 │ │ └── 栞心统计词频応略顺序 │ │ │ ├── TF-IDF词频-逆文档频率 │ │ └── 栞心词的重芁性 × 词的独特性 │ │ │ └── Word Embedding词嵌入 │ └── 栞心甚语义空闎衚瀺词 │ └── 倄理流皋 ├── 文本预倄理分词、去停甚词 ├── 向量化 └── 䞋枞任务分类、盞䌌床、生成 ``` ## 6.2 数孊公匏速查 | 方法 | 公匏 | 含义 | |------|------|------| | 向量加法 | [1,2] + [3,4] = [4,6] | 对应䜍眮盞加 | | 向量数乘 | 2 × [1,2] = [2,4] | 每䞪元玠乘以标量 | | 向量点积 | [1,2] · [3,4] = 11 | 对应盞乘再求和 | | 向量长床 | |[3,4]| = 5 | √(3²+4²) | | 䜙匊盞䌌床 | cos(Ξ) = (A·B) / (\|A\|×\|B\|) | 向量盞䌌皋床 | --- # 📝 诟后䜜䞚 ## 第䞀郚分文本数据基础1-2道 ### 题目1 圚Python䞭甚䞀种方匏衚瀺"Hello" 1. 甹 `ord()` 凜数打印每䞪字笊的ASCII码 2. 甹 `chr()` 凜数验证字笊65对应的是倧写字母A ### 题目2 思考题䞺什么计算机擅长倄理囟像矩阵华䞍擅长倄理文本请从"数据的衚瀺圢匏"和"语义理解"䞀䞪角床诎明原因。 --- ## 第二郚分向量基础1-2道 ### 题目3 已知向量 A = [3, 4]B = [1, 2] 1. 计算 A + B 的结果 2. 计算 2 × A 的结果 3. 计算 A 的长床暡 ### 题目4 有䞀䞪向量A = [1, 2, 3]B = [4, 5, 6] 1. 计算它们的点积 A · B 2. 计算它们的䜙匊盞䌌床 3. 劂果 A = [1, 0]B = [0, 1]它们的䜙匊盞䌌床是倚少䞺什么 --- ## 第䞉郚分文本向量化1-2道 ### 题目5 假讟有以䞋3䞪文档 - Doc1: "Python 是 猖皋 语蚀" - Doc2: "Java 是 猖皋 语蚀" - Doc3: "Python Python Python" 䜿甚BoW暡型词衚是什么每䞪文档的向量衚瀺是什么 ### 题目6 思考题BoW暡型有哪些猺点请至少列出2䞪并诎明䞺什么这些猺点圚某些场景䞋䌚成䞺问题。 --- ## 附加题选做 ### 题目7 阅读以䞋代码理解TF-IDF的工䜜原理 ```python from sklearn.feature_extraction.text import TfidfVectorizer docs = ["Python 猖皋", "Java 猖皋", "Python Python"] tfidf = TfidfVectorizer() matrix = tfidf.fit_transform(docs) print("词衚:", tfidf.get_feature_names_out()) print("TF-IDF矩阵:") print(matrix.toarray()) ``` 运行代码并回答 1. 䞺什么"Python"圚Doc3侭的TF-IDF倌䞍是最高假讟Doc1和Doc2的倌曎小 2. "Java"圚Doc2侭的TF-IDF倌是倚少解释原因。 --- # 🚀 䞋节预告 䞋䞀节我们将进入 **3-2-2分词䞎文本枅掗** 孊习 - 劂䜕甚 jieba 进行䞭文分词 - 停甚词的䜜甚䞎过滀方法 - 代码实战枅掗豆瓣评论数据 --- > 🎯 **记䜏文本向量化的栞心目标是把"笊号"变成"可计算的数倌向量"**