词表示学习全解析

立即解锁
发布时间: 2025-09-04 00:51:27 阅读量: 5 订阅数: 12 AIGC
PDF

自然语言处理的表示学习

### 词表示学习全解析 #### 1. 符号化词表示 ##### 1.1 独热词表示 独热词表示将每个词映射到词汇表的一个索引上。对于一个词,其独热向量只有一个维度的值为 1,其余维度都为 0。形式上,对于词 $w^{(i)}$,其第 $j$ 维的表示为: \[ w_j^{(i)} = \begin{cases} 1, & \text{if } j = i \\ 0, & \text{otherwise} \end{cases} \] 独热词表示只能区分不同的词,不包含任何句法或语义信息。任意两个词的独热向量相互正交,例如“cat”和“dog”的余弦相似度与“cat”和“sun”的余弦相似度都为 0。不过,它是词袋模型进行文档表示的基础,在信息检索和文本分类中广泛应用。 ##### 1.2 基于语言知识库的词表示 研究人员通过反思词与词之间的关系,构建复杂的词 - 词网络。例如在著名的语言知识库 WordNet 中,人类语言学家会手动标注每个词的同义词和上位词。 可以使用类似独热表示的向量形式来表示一个词: \[ w_j^{(i)} = \begin{cases} 1, & \text{if } (w^{(i)}, \text{has\_hypernym}, w^{(j)}) \\ -1, & \text{if } (w^{(i)}, \text{has\_hyponym}, w^{(j)}) \\ 0, & \text{otherwise} \end{cases} \] 这种表示的表达能力有限,对于没有共同上位词和下位词的两个词,相似度为 0。直接采用原始的图形式更好,在图上可以使用度量方法来推导两个词之间的相似度。对于同义词网络,可以计算网络上两个词之间的距离作为它们的语义相似度(即两个词之间的最短路径长度)。对于上位词 - 下位词网络,可以利用层次信息更好地度量相似度,例如信息内容(IC)方法: \[ s(w_1, w_2) = \max_{w \in C(w_1, w_2)}[-\log P(w)] \] 其中 $C(w_1, w_2)$ 是 $w_1$ 和 $w_2$ 的共同上位词集合,$P(w)$ 是词 $w$ 在语料库中出现的概率。 ##### 1.3 基于语料库的词表示 构建语言知识库的过程很耗时,而收集语料库相对容易。基于语料库自动推导词表示的正确性依赖于背后的语言假设,首先介绍词袋假设。 词袋假设认为可以忽略文档中词的顺序,将文档视为词的多重集,词的频率可以反映文档的内容。这样,文档可以用一个行向量表示,向量中的每个元素表示一个词在文档中的出现情况或频率。 当把每个文档的行向量堆叠形成一个文档(行) - 词(列)矩阵时,将注意力从行转移到列,每列代表一个词在一组文档中的出现情况。如果“rat”和“cat”倾向于出现在相同的文档中,它们在列中的统计信息会相似。 还可以更灵活地定义词的上下文来获得其他类型的表示。例如,定义一个以词为中心的固定大小窗口,使用窗口内的词作为该词的上下文,这对应于著名的分布假设:一个词的含义由其上下文描述。然后统计出现在一个词邻域内的词,使用字典作为词表示,每个键是一个上下文词,值是该上下文词在一定距离内的出现频率。 为了进一步扩展词的上下文,一些工作提出包含依赖链接或由参数位置诱导的链接。 在符号化表示中,每个表示项都有清晰且可解释的含义,对应于特定的词、同义词集或术语,因此称为“符号化表示”。 #### 2. 分布式词表示 符号化表示虽然简单且可解释,但不适合计算。例如,其稀疏性使得计算词与词之间的相似度很困难,像信息内容方法等不能自然地推广到其他符号化表示。分布式表示解决了这个问题。 分布式表示将一个对象(这里是一个词)表示为一个固定长度的实值向量,向量的每个维度没有明确的含义。具体来说,语义分散在表示的所有(,或大部分)维度中,一个维度对所有(或大部分)词的语义都有贡献。需要强调的是,“分布式表示”与“分布性表示”(由“分布假设”诱导)完全不同且相互正交。分布式表示描述表示的形式,而分布假设(表示)描述语义的来源。 ##### 2.1 初步:解释表示 虽然分布式表示的每个维度不可解释,但仍需要近似解释表示所传达的含义。介绍两种基本的计算方法:相似度和降维。 - **相似度** - **欧几里得距离**:是向量 $\mathbf{u}$ 和 $\mathbf{v}$ 差向量的 L2 范数。 \[ d_{Euclidean}(\mathbf{u}, \mathbf{v}) = \|\mathbf{u} - \mathbf{v}\|_2 = \sqrt{\sum_{i = 1}^{d}|u_i - v_i|^2} \] - **欧几里得相似度**:定义为距离的倒数。 \[ s_{Euclidean}(\mathbf{u}, \mathbf{v}) = \frac{1}{\sqrt{\sum_{i = 1}^{d}|u_i - v_i|^2}} \] - **余弦相似度**:通过两个向量之间的夹角来度量相似度。 \[ s_{cosine}(\mathbf{u}, \mathbf{v}) = \frac{\mathbf{u} \cdot \mathbf{v}}{\|\mathbf{u}\|_2\|\mathbf{v}\|_2} \] - **降维** 分布式表示虽然比符号化表示的维度低,但仍存在于高于三维的流形中。为了可视化,需要将向量的维度降低到 2 或 3。这里简要介绍主成分分析(PCA)。 PCA 使用正交线性变换将向量转换为一组新的坐标。在新的坐标系中,一个轴指向解释数据最大方差的方向,并且与所有其他轴正交。后面构建的轴解释的方差较小,对拟合数据的重要性较低。因此可以只使用前两到三个轴作为主成分,忽略后面的轴。 形式上,用一组单位行向量 $\{\mathbf{d}_j | j = 1, \ldots, k\}$ 表示新轴,样本 $\mathbf{u}$ 的原始向量可以在新坐标中表示为: \[ \mathbf{u} = \sum_{j = 1}^{k}a_j\mathbf{d}_j \approx \sum_{j = 1}^{r}a_j\mathbf{d}_j \] 其中 $a_j$ 是向量 $\mathbf{d}_j$ 表示 $\mathbf{u}$ 的权重,$\mathbf{a} = [a_1, \ldots, a_r]$ 形成 $\mathbf{u}$ 的新向量表示。在实践中,为了可视化通常设置 $r = 2$ 或 3。 新坐标集 $\{\mathbf{d}_j | j = 1, \ldots, k\}$ 可以通过协方差矩阵的特征分解或奇异值分解(SVD)计算。在 SVD 中,一个实值矩阵可以分解为: \[ \mathbf{U} = \mathbf{W}\Sigma\mathbf{D} \] 其中 $\Sigma$ 是正实数的对角矩阵,即奇异值,$\mathbf{W}$ 和 $\mathbf{D}$ 是由正交向量形成的奇异矩阵。对于数据样本(例如 $\mathbf{U}$ 的第 $i$ 行): \[ \mathbf{U}_{i,:} = \sum_{j = 1}^{k}\sigma_j\mathbf{W}_{i,j}\mathbf{D}_{j,:} \] 因此在上述公式中,$a_j = \sigma_j\mathbf{W}_{i,j}$ 且 $\mathbf{d}_j = \mathbf{D}_{j,:}$。 虽然 PCA 在高维数据可视化中广泛应用,但无法可视化形成非线性流形的表示。其他降维方法,如 t - SNE 可以解决这个问题。 ##### 2.2 基于矩阵分解的词表示 分布式表示可以通过矩阵分解或神经网络从符号化表示转换而来。这里介绍基于矩阵分解的方法,包括潜在语义分析(LSA)、其概率版本 PLSA 和潜在狄利克雷分配(LDA)。 - **潜在语义分析(LSA)** LSA 利用奇异值分解(SVD)将符号化表示矩阵进行转换。假设有一个词 - 文档矩阵 $\mathbf{M} \in \mathbb{R}^{n \times d}$,其中 $n$ 是词的数量,$d$ 是文档的数量。通过线性代数,它可以唯一地分解为三个矩阵的乘积:$\mathbf{M} = \mathbf{W}\Sigma\mathbf{D}^{\top}$,其中 $\Sigma$ 是正实数的对角矩阵,$\mathbf{W}$ 和 $\mathbf{D}$ 的列分别是左奇异向量和右奇异向量。 矩阵 $\mathbf{M}$ 的第 $i$ 行表示第 $i$ 个词的符号化表示,分解为: \[ \mathbf{M}_{i,:} = \mathbf{W}_{i,:}\Sigma\mathbf{D}^{\top} \] 从这个公式可以看出,只有 $\mathbf{W}$ 的第 $i$ 行对第 $i$ 个词的符号化表示有贡献。更重要的是,由于 $\mathbf{D}$ 是正交矩阵,词 $w_i$ 和 $w_j$ 之间的相似度为: \[ \mathbf{M}_{i,:}\mathbf{M}_{j,:}^{\top} = \mathbf{W}_{i,:}\Sigma^2\mathbf{W}_{j,:}^{\top} \] 因此可以将 $\mathbf{W}_{i,:}\Sigma$ 作为词 $w_i$ 的分布式表示。 将特征值按降序排列,最大的 $K$ 个奇异值(及其奇异向量)对矩阵 $\mathbf{M}$ 的贡献最大。因此只使用它们来近似 $\mathbf{M}$,公式变为: \[ \mathbf{M}_{i,:} \approx \mathbf{W}_{i,:K} \odot [\sigma_1, \sigma_2, \ldots, \sigma_K]\mathbf{D}^{\top}_{:,:K} \] 其中 $\odot$ 是元素级乘法,$\sigma_i$ 是 $\Sigma$ 的第 $i$ 个对角元素。 在 LSA 中,对计数统计进行 SVD 得到分布式表示 $\mathbf{W}_{i,:K}$。通常,使用较小的 $K$ 就可以得到足够好的近似,这意味着高维符号化表示中的语义现在被压缩并分布到低维实值向量中。LSA 广泛用于提高信息检索中基于查询的文档排名的召回率,因为它支持模糊语义匹配。 LSA 的一个挑战是计算成本高。对一个 $n \times d$ 矩阵进行完整的 SVD 需要 $O(\min\{n^2d, nd^2\})$ 时间,并且 SVD 的并行化并不容易。随机索引方法可以克服基于 SVD 的 LSA 的计算困难,避免对巨大的词 - 文档矩阵进行昂贵的预处理。在随机索引中,为每个文档分配一个随机生成的高维稀疏三元向量(称为索引向量)。对于文档中的每个词,将文档的索引向量添加到词的向量中。处理完整个文本语料库后,可以得到累积的词向量。随机索引易于并行化和实现,其性能与基于 SVD 的 LSA 相当。 - **概率潜在语义分析(PLSA)** LSA 进一步发展为 PLSA。可以将 $\mathbf{W}_{i,:K}$ 视为潜在因子 $\{z_k | k = 1, \ldots, K\}$ 上的分布,其中: \[ \mathbf{W}_{i,k} = P(w_i | z_k), \quad k = 1, \ldots, K \] 类似地,$\mathbf{D}_{i,:K}$ 也可以视为一个分布: \[ \mathbf{D}_{j,k} = P(d_j | z_k), \quad k = 1, \ldots, K \] $\{\sigma_k | k = 1, \ldots, K\}$ 是因子 $z_k$ 的先验概率,即 $P(z_k) = \sigma_k$。因此,词 - 文档矩阵成为词 $w_j$ 和文档 $d_j$ 的联合概率: \[ \mathbf{M}_{i,j} = P(w_i, d_j) = \sum_{k = 1}^{K}P(w_i | z_k)P(z_k)P(d_j | z_k) \] 借助贝叶斯定理,可以计算在文档 $d_j$ 给定的情况下 $w_i$ 的条件概率: \[ P(w_i | d_j) = \frac{P(w_i, d_j)}{P(d_j)} = \sum_{k = 1}^{K}P(w_i | z_k)P(z_k | d_j) \] 从这个公式可以看出定义了一个生成过程。为了在文档 $d_j$ 中生成一个词,首先从 $P(z_k | d_j)$ 中采样一个潜在因子 $z_k$,然后从条件概率 $P(w_i | z_k)$ 中采样一个词 $w_i$。 为了使上述公式严格成立,$\mathbf{W}$、$\Sigma$ 和 $\mathbf{D}$ 的元素必须是非负的。在这种概率约束下进行优化时,使用与 SVD 不同的损失函数: \[ \mathcal{L} = -\sum_{j}\sum_{i}\mathbf{M}_{i,j} \log P(w_i, d_j) \] 后续工作证明优化上述目标与非负矩阵分解相同。 - **潜在狄利克雷分配(LDA)** PLSA 进一步发展为 LDA,这是一种流行的主题模型,广泛用于文档检索。LDA 在由上述公式定义的生成过程中添加了层次贝叶斯先验。文档 $j$ 中词的生成过程如下: 1. 选择 $\theta_j \in \mathbb{R}^{K} \sim Dir(\alpha)$,其中 $Dir(\alpha)$ 是狄利克雷分布(通常 $\alpha$ 的每个维度小于 1),$K$ 是主题数量。这是文档 $d_j$ 中主题的概率分布。 2. 对于每个主题 $z$,选择 $\phi_z \in \mathbb{R}^{|V|} \sim Dir(\beta)$,其中 $|V|$ 是词汇表的大小。通常 $\beta$ 的每个维度小于 1。这是主题 $z$ 生成词的概率分布。 3. 对于文档 $d_j$ 中的每个词 $w_i$: - 选择一个主题 $z_{i,j} \sim Multinomial(\theta_j)$。 - 从 $w_{i,j} = P(w_j | d_j) \sim Multinomial(\phi_{z_{i,j}})$ 中选择一个词。 LDA 有两个特点需要强调:一是狄利克雷先验中的超参数 $\alpha$ 和 $\beta$ 通常设置为小于 1,导致“稀疏先验”,即采样的 $\theta$ 和 $\phi$ 的大多数维度接近零。 下面用 mermaid 流程图展示 LDA 的生成过程: ```mermaid graph LR A[选择文档 j] --> B[选择主题分布 θj ~ Dir(α)] B --> C[为每个主题 z 选择词分布 φz ~ Dir(β)] C --> D[对于文档 d_j 中的每个词 w_i] D --> E[选择主题 z_{i,j} ~ Multinomial(θj)] E --> F[选择词 w_{i,j} ~ Multinomial(φ_{z_{i,j}})] ``` 综上所述,词表示学习有多种方法,从简单的符号化表示到更复杂的分布式表示,每种方法都有其特点和适用场景。在实际应用中,需要根据具体需求选择合适的方法。 ### 词表示学习全解析 #### 3. 不同词表示方法的对比 为了更清晰地了解符号化表示和分布式表示的差异,下面通过表格进行对比: | 表示类型 | 优点 | 缺点 | 适用场景 | | ---- | ---- | ---- | ---- | | 符号化表示 | 简单且可解释,每个表示项有清晰含义 | 计算困难,稀疏性导致词相似度计算不易,方法难以推广 | 对可解释性要求高,对计算效率要求不高的场景,如初步的语义分析 | | 分布式表示 | 解决了符号化表示的计算难题,语义分散在各维度,更适合计算 | 向量维度无明确含义,解释性差 | 需要进行大规模计算和复杂语义匹配的场景,如信息检索、文本分类 | #### 4. 词表示学习方法的应用案例 ##### 4.1 信息检索 在信息检索中,词表示学习方法起着关键作用。以分布式表示中的 LSA 为例,它可以将高维的符号化表示压缩到低维实值向量中,支持模糊语义匹配。具体操作步骤如下: 1. **数据准备**:收集相关的文档集合,构建词 - 文档矩阵 $\mathbf{M}$。 2. **矩阵分解**:对词 - 文档矩阵 $\mathbf{M}$ 进行 SVD 分解,得到 $\mathbf{W}$、$\Sigma$ 和 $\mathbf{D}$。 3. **获取分布式表示**:取 $\mathbf{W}_{i,:K}$ 作为词的分布式表示。 4. **查询处理**:将查询词转换为分布式表示,与文档的分布式表示进行相似度计算,根据相似度对文档进行排序。 通过这种方式,可以提高基于查询的文档排名的召回率,找到与查询语义相关的文档。 ##### 4.2 文本分类 文本分类任务也可以利用词表示学习方法。基于语料库的词表示可以将文本转换为向量形式,便于分类算法处理。以下是一个简单的文本分类流程: 1. **数据收集与预处理**:收集文本数据,并进行分词、去除停用词等预处理操作。 2. **词表示构建**:根据词袋假设或分布假设,构建词的表示,如使用文档 - 词矩阵。 3. **特征提取**:从词表示中提取特征,如词频、TF - IDF 等。 4. **模型训练**:选择合适的分类模型,如支持向量机、神经网络等,使用训练数据进行模型训练。 5. **分类预测**:使用训练好的模型对新的文本进行分类预测。 #### 5. 词表示学习的发展趋势 随着自然语言处理技术的不断发展,词表示学习也在不断演进。以下是一些可能的发展趋势: - **融合多种信息**:将不同来源的信息,如语言知识库、语料库、上下文信息等进行融合,以获得更丰富、更准确的词表示。 - **动态词表示**:考虑词在不同上下文和语境中的动态变化,生成更灵活的词表示。 - **与深度学习的结合**:进一步探索词表示学习与深度学习模型的结合,如在循环神经网络、卷积神经网络、Transformer 等模型中应用更有效的词表示。 #### 6. 总结 词表示学习是自然语言处理中的重要基础,它为各种自然语言处理任务提供了有力支持。符号化表示和分布式表示各有优缺点,适用于不同的场景。在实际应用中,需要根据具体需求选择合适的词表示方法。同时,随着技术的发展,词表示学习也在不断创新和完善,未来有望取得更好的效果。 下面用 mermaid 流程图展示词表示学习在自然语言处理中的整体应用流程: ```mermaid graph LR A[文本数据] --> B[词表示学习] B --> C{表示类型} C -->|符号化表示| D[简单语义分析] C -->|分布式表示| E[信息检索] C -->|分布式表示| F[文本分类] E --> G[查询处理] F --> H[模型训练与预测] ``` 总之,深入理解词表示学习的方法和原理,对于推动自然语言处理技术的发展具有重要意义。在实际应用中,我们应充分发挥各种方法的优势,不断探索和创新,以满足不同场景下的需求。
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

张_伟_杰

人工智能专家
人工智能和大数据领域有超过10年的工作经验,拥有深厚的技术功底,曾先后就职于多家知名科技公司。职业生涯中,曾担任人工智能工程师和数据科学家,负责开发和优化各种人工智能和大数据应用。在人工智能算法和技术,包括机器学习、深度学习、自然语言处理等领域有一定的研究
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

开源安全工具:Vuls与CrowdSec的深入剖析

### 开源安全工具:Vuls与CrowdSec的深入剖析 #### 1. Vuls项目简介 Vuls是一个开源安全项目,具备漏洞扫描能力。通过查看代码并在本地机器上执行扫描操作,能深入了解其工作原理。在学习Vuls的过程中,还能接触到端口扫描、从Go执行外部命令行应用程序以及使用SQLite执行数据库操作等知识。 #### 2. CrowdSec项目概述 CrowdSec是一款开源安全工具(https://github.com/crowdsecurity/crowdsec ),值得研究的原因如下: - 利用众包数据收集全球IP信息,并与社区共享。 - 提供了值得学习的代码设计。 - Ge

RHEL9系统存储、交换空间管理与进程监控指南

# RHEL 9 系统存储、交换空间管理与进程监控指南 ## 1. LVM 存储管理 ### 1.1 查看物理卷信息 通过 `pvdisplay` 命令可以查看物理卷的详细信息,示例如下: ```bash # pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name rhel PV Size <297.09 GiB / not usable 4.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 76054 Free PE 0 Allocated PE 76054

Ansible高级技术与最佳实践

### Ansible高级技术与最佳实践 #### 1. Ansible回调插件的使用 Ansible提供了多个回调插件,可在响应事件时为Ansible添加新行为。其中,timer插件是最有用的回调插件之一,它能测量Ansible剧本中任务和角色的执行时间。我们可以通过在`ansible.cfg`文件中对这些插件进行白名单设置来启用此功能: - **Timer**:提供剧本执行时间的摘要。 - **Profile_tasks**:提供剧本中每个任务执行时间的摘要。 - **Profile_roles**:提供剧本中每个角色执行时间的摘要。 我们可以使用`--list-tasks`选项列出剧

信息系统集成与测试实战

### 信息系统集成与测试实战 #### 信息系统缓存与集成 在实际的信息系统开发中,性能优化是至关重要的一环。通过使用 `:timer.tc` 函数,我们可以精确测量执行时间,从而直观地看到缓存机制带来的显著性能提升。例如: ```elixir iex> :timer.tc(InfoSys, :compute, ["how old is the universe?"]) {53, [ %InfoSys.Result{ backend: InfoSys.Wolfram, score: 95, text: "1.4×10^10 a (Julian years)\n(time elapsed s

轻量级HTTP服务器与容器化部署实践

### 轻量级 HTTP 服务器与容器化部署实践 #### 1. 小需求下的 HTTP 服务器选择 在某些场景中,我们不需要像 Apache 或 NGINX 这样的完整 Web 服务器,仅需一个小型 HTTP 服务器来测试功能,比如在工作站、容器或仅临时需要 Web 服务的服务器上。Python 和 PHP CLI 提供了便捷的选择。 ##### 1.1 Python 3 http.server 大多数现代 Linux 系统都预装了 Python 3,它自带 HTTP 服务。若未安装,可使用包管理器进行安装: ```bash $ sudo apt install python3 ``` 以

构建交互式番茄钟应用的界面与功能

### 构建交互式番茄钟应用的界面与功能 #### 界面布局组织 当我们拥有了界面所需的所有小部件后,就需要对它们进行逻辑组织和布局,以构建用户界面。在相关开发中,我们使用 `container.Container` 类型的容器来定义仪表盘布局,启动应用程序至少需要一个容器,也可以使用多个容器来分割屏幕和组织小部件。 创建容器有两种方式: - 使用 `container` 包分割容器,形成二叉树布局。 - 使用 `grid` 包定义行和列的网格。可在相关文档中找到更多关于 `Container API` 的信息。 对于本次开发的应用,我们将使用网格方法来组织布局,因为这样更易于编写代码以

实时资源管理:Elixir中的CPU与内存优化

### 实时资源管理:Elixir 中的 CPU 与内存优化 在应用程序的运行过程中,CPU 和内存是两个至关重要的系统资源。合理管理这些资源,对于应用程序的性能和可扩展性至关重要。本文将深入探讨 Elixir 语言中如何管理实时资源,包括 CPU 调度和内存管理。 #### 1. Elixir 调度器的工作原理 在 Elixir 中,调度器负责将工作分配给 CPU 执行。理解调度器的工作原理,有助于我们更好地利用系统资源。 ##### 1.1 调度器设计 - **调度器(Scheduler)**:选择一个进程并执行该进程的代码。 - **运行队列(Run Queue)**:包含待执行工

容器部署与管理实战指南

# 容器部署与管理实战指南 ## 1. 容器部署指导练习 ### 1.1 练习目标 在本次练习中,我们将使用容器管理工具来构建镜像、运行容器并查询正在运行的容器环境。具体目标如下: - 配置容器镜像注册表,并从现有镜像创建容器。 - 使用容器文件创建容器。 - 将脚本从主机复制到容器中并运行脚本。 - 删除容器和镜像。 ### 1.2 准备工作 作为工作站机器上的学生用户,使用 `lab` 命令为本次练习准备系统: ```bash [student@workstation ~]$ lab start containers-deploy ``` 此命令将准备环境并确保所有所需资源可用。 #

基于属性测试的深入解析与策略探讨

### 基于属性测试的深入解析与策略探讨 #### 1. 基于属性测试中的收缩机制 在基于属性的测试中,当测试失败时,像 `stream_data` 这样的框架会执行收缩(Shrinking)操作。收缩的目的是简化导致测试失败的输入,同时确保简化后的输入仍然会使测试失败,这样能更方便地定位问题。 为了说明这一点,我们来看一个简单的排序函数测试示例。我们实现了一个糟糕的排序函数,实际上就是恒等函数,它只是原封不动地返回输入列表: ```elixir defmodule BadSortTest do use ExUnit.Case use ExUnitProperties pro

PowerShell7在Linux、macOS和树莓派上的应用指南

### PowerShell 7 在 Linux、macOS 和树莓派上的应用指南 #### 1. PowerShell 7 在 Windows 上支持 OpenSSH 的配置 在 Windows 上使用非微软开源软件(如 OpenSSH)时,可能会遇到路径问题。OpenSSH 不识别包含空格的路径,即使路径被单引号或双引号括起来也不行,因此需要使用 8.3 格式(旧版微软操作系统使用的短文件名格式)。但有些 OpenSSH 版本也不支持这种格式,当在 `sshd_config` 文件中添加 PowerShell 子系统时,`sshd` 服务可能无法启动。 解决方法是将另一个 PowerS