neuralcoref

GitHub
2.9k 471 简单 1 次阅读 4天前MIT插件语言模型数据工具开发框架
AI 解读 由 AI 自动生成,仅供参考

NeuralCoref 是一款专为 spaCy 自然语言处理框架设计的核心共指消解扩展工具。它的核心任务是解决文本中“谁指代谁”的难题,即识别并链接指向同一实体的不同表达(例如将句子中的“他”、“这位科学家”与具体人名关联起来),从而让机器更准确地理解上下文逻辑。

该工具非常适合需要构建高级聊天机器人、智能问答系统或进行深度文本分析的开发者与研究人员使用。得益于其无缝集成于 spaCy 流水线的特性,用户无需搭建复杂架构即可在现有项目中快速启用共指消解功能。

在技术实现上,NeuralCoref 采用了混合架构:首先利用规则引擎结合 spaCy 的词性标注、句法分析和命名实体识别能力来筛选潜在的指代提及,随后通过前馈神经网络计算每对提及之间的共指得分。这种设计既保证了处理速度,又具备了较高的准确率。目前,NeuralCoref 已准备好投入生产环境,提供针对英语优化的预训练模型,并支持可视化的在线演示,帮助开发者直观地调试和验证结果。对于希望提升 NLP 应用语境理解能力的团队来说,这是一个高效且易于上手的选择。

使用场景

某新闻聚合平台的技术团队正在构建自动摘要系统,需要从海量英文报道中提取关键人物及其关联事件,以生成结构化的人物动态简报。

没有 neuralcoref 时

  • 指代关系断裂:系统无法识别"he"、"the CEO"或"Mr. Smith"均指向同一人,导致人物行为被割裂为多个独立片段。
  • 统计严重失真:在计算人物提及频率时,因无法合并代词与原名,导致核心人物的热度排名被大幅低估。
  • 上下文逻辑混乱:生成的摘要中频繁出现“他做了什么”却无前文主语的情况,读者完全无法理解事件主体。
  • 人工清洗成本高:开发人员不得不编写大量脆弱的正则规则来匹配常见代词,维护困难且覆盖率极低。

使用 neuralcoref 后

  • 实体集群自动归一:neuralcoref 利用神经网络精准将文中所有指代同一实体的词汇(如"Elon Musk"、"he"、"the entrepreneur")聚类为统一对象。
  • 数据洞察更精准:基于解析后的共指簇统计提及次数,真实反映了人物在报道中的核心地位,提升了推荐算法的准确性。
  • 摘要可读性飞跃:系统在生成摘要时能自动将模糊代词还原为具体人名,确保每句话的主语清晰明确,逻辑通顺。
  • 开发效率显著提升:直接集成进 spaCy 流水线即可生效,无需维护复杂的规则库,轻松适配各类新闻文体。

neuralcoref 通过深度学习技术消除了文本中的指代歧义,让机器真正读懂了“谁是谁”,从而大幅提升了自然语言处理任务的理解深度与应用价值。

运行环境要求

操作系统
  • macOS
  • Linux
  • Windows (Cygwin
  • MinGW
  • Visual Studio)
GPU

未说明

内存

未说明

依赖
notes该工具仅支持英语模型。首次导入时会自动下载神经网络权重到缓存文件夹(默认为 ~/.neuralcoref_cache),可通过环境变量 NEURALCOREF_CACHE 自定义路径。若遇到二进制不兼容错误,需从源码重新安装(pip install --no-binary)。核心ference 解析效果高度依赖所选 spaCy 英文模型的性能(特别是词性标注、句法分析和命名实体识别组件),建议使用较大的 spaCy 英文模型以获得更好效果。
python3.6+ (仅支持 64 位)
spacy>=2.1
Cython
neuralcoref hero image

快速开始

✨NeuralCoref 4.0:使用神经网络在spaCy中进行共指消解。

NeuralCoref 是一个适用于 spaCy 2.1 及以上版本的管道扩展,它利用神经网络标注并解析共指聚类。NeuralCoref 已经可以用于生产环境,集成到 spaCy 的 NLP 管道中,并且可以扩展到新的训练数据集。

如需简要了解共指消解和 NeuralCoref,请参阅我们的 博客文章

NeuralCoref 使用 Python/Cython 编写,附带一个针对 英语 的预训练统计模型。

NeuralCoref 配有一个可视化客户端 NeuralCoref-Viz,这是一个由 REST 服务器驱动的 Web 界面,您可以在 在线试用。NeuralCoref 采用 MIT 许可证发布。

✨ 版本 4.0 现已推出!可通过 pip 安装,并兼容 SpaCy 2.1 及以上版本。

当前发布版本 spaCy Travis-CI NeuralCoref 在线演示

  • 操作系统: macOS / OS X · Linux · Windows (Cygwin, MinGW, Visual Studio)
  • Python 版本: Python 3.6+(仅 64 位)
  • 包管理器: [pip]

安装 NeuralCoref

使用 pip 安装 NeuralCoref

这是安装 NeuralCoref 最简单的方式。

pip install neuralcoref

spacy.strings.StringStore size changed 错误

如果您在使用 import neuralcoref 加载 NeuralCoref 时遇到 spacy.strings.StringStore size changed, may indicate binary incompatibility 的错误,这意味着您需要从源代码而非二进制包安装 NeuralCoref,以便使其与您系统上最新版本的 SpaCy 进行编译。

在这种情况下,只需按以下步骤重新安装:

pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcoref

安装 SpaCy 模型

要使用 NeuralCoref,您还需要一个 SpaCy 的英语模型。

您可以根据应用需求选择任何合适的英语模型,但请注意,NeuralCoref 的性能高度依赖于 SpaCy 模型的表现,尤其是其词性标注、句法分析和命名实体识别组件的性能。因此,使用更大的 SpaCy 英语模型将有助于提升共指消解的质量(详情请参阅下方的“内部机制与模型”部分)。

以下是如何安装 SpaCy 和一个小型英语模型的示例,更多信息请访问 SpaCy 官网

pip install -U spacy
python -m spacy download en

从源码安装 NeuralCoref

您也可以从源码安装 NeuralCoref。首先需要安装依赖项,包括 Cython 和 SpaCy。

具体步骤如下:

venv .env
source .env/bin/activate
git clone https://github.com/huggingface/neuralcoref.git
cd neuralcoref
pip install -r requirements.txt
pip install -e .

内部机制与模型

NeuralCoref 由两个子模块组成:

  • 基于规则的提及检测模块,它利用 SpaCy 的词性标注、句法分析和命名实体识别结果来识别潜在的共指提及;
  • 一个前馈神经网络,用于为每对潜在提及计算共指得分。

首次在 Python 中导入 NeuralCoref 时,它会将神经网络模型的权重下载到缓存文件夹中。

默认情况下,缓存文件夹设置为 ~/.neuralcoref_cache(参见 file_utils.py),但您可以通过设置环境变量 NEURALCOREF_CACHE 来指定其他位置以覆盖此行为。

缓存文件夹可以随时安全删除,下次加载模块时会重新下载模型。

您可以通过在加载 NeuralCoref 之前激活 Python 的 logging 模块来获取有关内部模型位置、下载和缓存过程的更多信息,方法如下:

import logging;
logging.basicConfig(level=logging.INFO)
import neuralcoref
>>> INFO:neuralcoref:Getting model from https://s3.amazonaws.com/models.huggingface.co/neuralcoref/neuralcoref.tar.gz or cache
>>> INFO:neuralcoref.file_utils:https://s3.amazonaws.com/models.huggingface.co/neuralcoref/neuralcoref.tar.gz not found in cache, downloading to /var/folders/yx/cw8n_njx3js5jksyw_qlp8p00000gn/T/tmp_8y5_52m
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 40155833/40155833 [00:06<00:00, 6679263.76B/s]
>>> INFO:neuralcoref.file_utils:copying /var/folders/yx/cw8n_njx3js5jksyw_qlp8p00000gn/T/tmp_8y5_52m to cache at /Users/thomaswolf/.neuralcoref_cache/f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14.7d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
>>> INFO:neuralcoref.file_utils:creating metadata file for /Users/thomaswolf/.neuralcoref_cache/f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14.7d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
>>> INFO:neuralcoref.file_utils:removing temp file /var/folders/yx/cw8n_njx3js5jksyw_qlp8p00000gn/T/tmp_8y5_52m
>>> INFO:neuralcoref:extracting archive file /Users/thomaswolf/.neuralcoref_cache/f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14.7d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633 to dir /Users/thomaswolf/.neuralcoref_cache/neuralcoref

加载 NeuralCoref

将 NeuralCoref 添加到英语 SpaCy 语言模型的管道中

以下是实例化 NeuralCoref 并将其添加到 SpaCy 注释管道中的推荐方法:


# 加载您常用的 SpaCy 模型(任一 SpaCy 英语模型)
import spacy
nlp = spacy.load('en')

# 将 Neural Coref 添加到 SpaCy 的管道中
import neuralcoref
neuralcoref.add_to_pipe(nlp)

# 完成。现在您可以像操作 SpaCy 文档注释一样使用 Neural Coref。
doc = nlp(u'我姐姐有一只狗。她很喜欢它。')

doc._.has_coref
doc._.coref_clusters

手动加载 Neural Coref 并将其添加到英语 SpaCy 语言模型的管道中

另一种将 Neural Coref 添加到 SpaCy 模型管道的方法是先实例化 Neural Coref 类,然后手动将其添加到 SpaCy 语言模型的管道中。


# 加载您常用的 SpaCy 模型(任一 SpaCy 英语模型)
import spacy
nlp = spacy.load('en')

# 加载 NeuralCoref 并将其添加到 SpaCy 模型的管道中
import neuralcoref
coref = neuralcoref.NeuralCoref(nlp.vocab)
nlp.add_pipe(coref, name='neuralcoref')

# 完成!现在你可以像平常操作 SpaCy 文档及其标注一样使用 NeuralCoref。
doc = nlp(u'我姐姐有一只狗。她很喜欢它。')

doc._.has_coref
doc._.coref_clusters

使用 NeuralCoref

NeuralCoref 会解析共指关系,并将这些信息作为 扩展属性 注入到 SpaCy 的 DocSpanToken 对象中,存储在 ._. 字典下。

以下是所有标注的列表:

属性 类型 描述
doc._.has_coref 布尔值 文档中是否已解析出任何共指关系
doc._.coref_clusters Cluster 列表 文档中所有共指提及的聚类
doc._.coref_resolved Unicode 文档的 Unicode 表示,其中每个共指提及都被其所属聚类中的主要提及替换。
doc._.coref_scores 字典的字典 提及之间共指解析的得分。
span._.is_coref 布尔值 该 span 是否至少包含一个共指提及
span._.coref_cluster Cluster 与该 span 共指的提及聚类
span._.coref_scores 字典 该 span 与其他提及(如果适用)之间的共指解析得分。
token._.in_coref 布尔值 该 token 是否位于至少一个共指提及内
token._.coref_clusters Cluster 列表 包含该 token 的所有共指提及聚类

Cluster 是一组共指提及的聚类,具有 3 个属性和一些方法,用于简化对聚类内部的导航:

属性或方法 类型 / 返回类型 描述
i 整数 聚类在文档中的索引
main Span 聚类中最具代表性的提及范围
mentions Span 列表 聚类中所有提及的列表
__getitem__ 返回 Span 访问聚类中的某个提及
__iter__ 生成 Span 遍历聚类中的提及
__len__ 返回整数 聚类中提及的数量

导航共指聚类链

你还可以轻松地导航共指聚类链,并展示聚类和提及。

以下是一些示例,请亲自尝试以测试效果。

import spacy
import neuralcoref
nlp = spacy.load('en')
neuralcoref.add_to_pipe(nlp)

doc = nlp(u'我姐姐有一只狗。她很喜欢它')

doc._.coref_clusters
doc._.coref_clusters[1].mentions
doc._.coref_clusters[1].mentions[-1]
doc._.coref_clusters[1].mentions[-1]._.coref_cluster.main

token = doc[-1]
token._.in_coref
token._.coref_clusters

span = doc[-1:]
span._.is_coref
span._.coref_cluster.main
span._.coref_cluster.main._.coref_cluster

重要提示:NeuralCoref 中的提及是 SpaCy 的 Span 对象,这意味着你可以访问所有常规的 Span 属性,例如 span.start(该 span 在文档中第一个 token 的索引)、span.end(该 span 后第一个 token 的索引)等。

示例:doc._.coref_clusters[1].mentions[-1].start 将给出文档中第二个共指聚类中最后一个提及的第一个 token 的索引。

参数

你可以向 neuralcoref.add_to_pipeNeuralCoref() 传递多个额外参数来控制 NeuralCoref 的行为。

以下是这些参数及其说明的完整列表:

参数 类型 描述
greedyness 浮点数 一个介于 0 和 1 之间的数值,决定模型在做出共指决策时的“贪婪”程度(越贪婪,共指链接越多)。默认值为 0.5。
max_dist 整数 在考虑当前提及的可能先行词时,系统会回溯多少个提及。降低此值会使系统运行更快,但准确性会降低。默认值为 50。
max_dist_match 整数 如果当前提及与其前方超过 max_dist 距离的提及共享名词或专有名词,则系统会考虑将两者连接起来。此时,系统将搜索距离为 max_dist_match 的提及。默认值为 500。
blacklist 布尔值 系统是否应解析以下代词的共指关系:["i", "me", "my", "you", "your"]。默认值为 True(解析共指)。
store_scores 布尔值 系统是否应将共指得分存储在标注中。默认值为 True。
conv_dict 字典(str, list(str)) 一个转换字典,可用于将 稀有词(键)的嵌入替换成一组 常见词(值)嵌入的平均值。例如:conv_dict={"Angela": ["woman", "girl"]} 将帮助通过使用更常见的 womangirl 的嵌入来解析 Angela 的共指关系,而不是直接使用 Angela 的嵌入。目前此功能仅适用于单个单词,不适用于词组。

如何更改参数

import spacy
import neuralcoref

# 加载 SpaCy 模型
nlp = spacy.load('en')

# 控制参数的第一种方式
neuralcoref.add_to_pipe(nlp, greedyness=0.75)

# 控制参数的另一种方式
nlp.remove_pipe("neuralcoref")  # 移除当前的 NeuralCoref 实例
coref = neuralcoref.NeuralCoref(nlp.vocab, greedyness=0.75)
nlp.add_pipe(coref, name='neuralcoref')

使用转换字典参数帮助解析稀有词

以下是一个如何使用 conv_dict 参数来帮助解析像人名这样的稀有词共指关系的示例:

import spacy
import neuralcoref

nlp = spacy.load('en')

# 尝试在未使用转换字典之前:
neuralcoref.add_to_pipe(nlp)
doc = nlp(u'迪皮卡有一只狗。她很喜欢它。这位电影明星一直喜爱动物')
doc._.coref_clusters
doc._.coref_resolved
# >>> [迪皮卡: [迪皮卡、她、它、这位电影明星]]
# >>> '迪皮卡有一只狗。迪皮卡很喜欢迪皮卡。迪皮卡一直喜爱动物'
# >>> 效果并不理想...

# 以下是三种添加转换字典的方法
nlp.remove_pipe("neuralcoref")
neuralcoref.add_to_pipe(nlp, conv_dict={'迪皮卡': ['woman', 'actress']})

# 或者
nlp.remove_pipe("neuralcoref")
coref = neuralcoref.NeuralCoref(nlp.vocab, conv_dict={'Deepika': ['woman', 'actress']})
nlp.add_pipe(coref, name='neuralcoref')
# 或者在 NeuralCoref 已经加入 SpaCy 管道后,通过修改管道中的 NeuralCoref 组件来实现
nlp.get_pipe('neuralcoref').set_conv_dict({'Deepika': ['woman', 'actress']})

# 让我们再次尝试使用转换字典:
doc = nlp(u'迪皮卡有一只狗。她爱它。这位电影明星一直很喜欢动物')
doc._.coref_clusters
# >>> [迪皮卡: [迪皮卡, 她, 迪皮卡], 一只狗: [一只狗, 它]]
# >>> '迪皮卡有一只狗。迪皮卡爱那只狗。迪皮卡一直很喜欢动物'
# >>> 好多了!

将 NeuralCoref 用作服务器

一个将 NeuralCoref 集成到 REST API 中的简单服务器脚本示例,已作为示例提供在 examples/server.py 文件中。

要使用它,您需要先安装 falcon:

pip install falcon

然后您可以按如下方式启动服务器:

cd examples
python ./server.py

并以以下方式查询服务器:

curl --data-urlencode "text=我姐姐有一只狗。她爱它。" -G localhost:8000

管理与部署 NeuralCoref 的方式还有很多。一些示例可以在 spaCy Universe 中找到。

重新训练模型 / 扩展到其他语言

如果您想重新训练模型或将其训练于另一种语言,请参阅我们的训练说明,以及我们的博客文章

版本历史

v4.0.02019/04/08
3.02018/06/08
2.02018/03/23
0.22018/02/15
0.12017/07/07

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|今天
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|昨天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

140.4k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|3天前
开发框架图像Agent

Deep-Live-Cam

Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。

88.9k|★★★☆☆|今天
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|昨天
开发框架语言模型