Echogarden 文本分割库
一个为自然语言文本提供单词,短语和句子分割的库.
- 满 多语种。覆盖所有语言和书写系统,作为Unicode字符。 需要时,使用 Web Assembly 端口 会 议 日 程 和 议 程 ICU C++ 计算机 图书馆 (如果有的话)处理难于分割的东亚语言,如中文、日文、泰文和高棉文
- 部分 不同语言的混合物,包括不同脚本的混合物,如汉语,西里尔语和拉丁语,都在一个句子或短语中,不需要明确指定特定语言
- 包括 内置压制清单 用于特定语言的缩写和特殊词型。 目前包括的语文有英文、德文、西班牙文、法文、意大利文、葡萄牙文和俄文,大多取自《公约》第2条 JSON数据集
- 接受 用户提供的压制列表
- 这么快。对于大多数语言来说,单词分割大多通过单个正则表达式进行,为给定的选项和压制集动态构建. 处理大部分是在 JavaScript 正则表达式引擎内完成,或者在优化后的WebGathers 二进制内完成
- 在类型脚本中写入
安装
npm install @echogarden/text-segmentation
为了能够精细地分解出汉语,日语,泰语和高棉语的单词,安装这个额外的包:
npm install @echogarden/icu-segmentation-wasm
(单位:千美元)@echogarden/icu-segmentation-wasm 是 27 MB 软件包,并设定为 同伴依赖。由于大小原因,它不是默认安装的,以方便可能不需要它的部署——特别是浏览器)
使用量
拆分为单词
import { splitToWords } from '@echogarden/text-segmentation'
const wordSequence: WordSequence =
await splitToWords('Hello, world! How are you doing today?', { language: 'en' })
console.log(wordSequence.words)
打印一个单词列表(包括空格和通点):
['Hello', ',', ' ', 'world', '!', ' ', 'How',' ', 'are', ' ', 'you', ' ', 'doing', ' ', 'today', '?']
语言混合物
提供的语言选项类似 language: 'en' 仅用于装入抑制词典。 您仍可在同一输入文本中包含不同语言和脚本的混合物:
await splitToWords('Hello world! Привет мир! 你好世界!')
生产 :
['Hello', ' ', 'world', '!', ' ', 'Привет', ' ', 'мир', '!', ' ', '你好', '世界', '!']
获取详细的元数据
为了获得更详细的信息,
console.log(wordSequence.entries)
打印对象列表,包括每个字的元数据:
[
{ text: 'Hello', startOffset: 0, endOffset: 5, isPunctuation: false },
{ text: ',', startOffset: 5, endOffset: 6, isPunctuation: true },
{ text: ' ', startOffset: 6, endOffset: 7, isPunctuation: true },
{ text: 'world', startOffset: 7, endOffset: 12, isPunctuation: false },
{ text: '!', startOffset: 12, endOffset: 13, isPunctuation: true },
{ text: ' ', startOffset: 13, endOffset: 14, isPunctuation: true },
{ text: 'How', startOffset: 14, endOffset: 17, isPunctuation: false },
{ text: ' ', startOffset: 17, endOffset: 18, isPunctuation: true },
{ text: 'are', startOffset: 18, endOffset: 21, isPunctuation: false },
{ text: ' ', startOffset: 21, endOffset: 22, isPunctuation: true },
{ text: 'you', startOffset: 22, endOffset: 25, isPunctuation: false },
{ text: ' ', startOffset: 25, endOffset: 26, isPunctuation: true },
{ text: 'doing', startOffset: 26, endOffset: 31, isPunctuation: false },
{ text: ' ', startOffset: 31, endOffset: 32, isPunctuation: true },
{ text: 'today', startOffset: 32, endOffset: 37, isPunctuation: false },
{ text: '?', startOffset: 37, endOffset: 38, isPunctuation: true }
]
分词、短语和句子
const result: SegmentationResult =
await segmentText(`Hello, world! How are you doing today?`)
result 是一个嵌入对象,其中包含给定文本中的句子、短语和词的分解。 它由这些类型脚本描述:
interface SegmentationResult {
words: WordSequence
sentences: Sentence[]
}
interface Sentence {
text: string
charRange: Range
wordRange: Range
words: WordSequence
phrases: Phrase[]
}
interface Phrase {
text: string
charRange: Range
wordRange: Range
words: WordSequence
}
interface Range {
start: number
end: number
}
分割预定义的单词序列
如果你有一个先前存在 WordSequence 对象(或可能是一种被修改的现有形式),可以将其分解为句子和短语,而无需重算词边界:
const result: SegmentationResult = await segmentWordSequence(wordSequence: WordSequence)
这样,也可以指定自定义的单词边界,而词组和句子分割操作将确保断开字符在非平分词的跨度中永远不被识别出.
算法大纲
单词分割
寻找数个被接受的角色序列模式中的一个,并认定该模式为单个单词.
有几种公认的模式,按此顺序加以评价:
- 用户提供的抑制
- 语言特有压制. 例如,在英文中,它包括缩略语,例如:
Mr., (中文(简体) ),Mrs., (中文(简体) ),e.g., (中文(简体) ),i.e, (中文(简体) ),etc.,或者收缩类似和'cause, (中文(简体) ),'bout英语,'n南非语 - 名词压制(英語:Noun spressions),以所有语言共享,如品牌名称,缩写和编程语言等. 实例:
C#, (中文(简体) ),F#, (中文(简体) ),C++, (中文(简体) ),Yahoo!, (中文(简体) ),Toys"R"Us, (中文(简体) ),Dunkin', (中文(简体) ),Ke$ha, (中文(简体) ),Sky+, (中文(简体) ),I/O, (中文(简体) ),A/C, (中文(简体) ),A/V - 顶级域, 如
.com, (中文(简体) ),.org, (中文(简体) ),.net(也作为名词加倍).NET(如“.NET框架”) - 数字图案,由由各种分隔符字符分隔的位数序列组成,如小数分隔符
3.14, (中文(简体) ),3,14成千上万的分离者喜欢233,421(单位:千美元),, (中文(简体) ),233.421(单位:千美元).)或(或)233 421(单位:千美元)。可选-或者说+标志像-34,534.123, (中文(简体) ),+43 345,344,或科学标记,如1.554e-34 - 时间规律
15:12财务报告和审定财务报表06:34:23 - 日期图案
10/15/2021(目前已停用) - 尺寸模式,如
53x545x76 - 百分比模式,即数字模式之前或之后
%一样53.243%或者说%34.12 - 货币模式
$101.25, (中文(简体) ),€50, (中文(简体) ),20£, (中文(简体) ),-53.23¥,与百分比图案一样,数字图案前有或后有货币符号 - 爱莫吉像..
- 缩写图案如
Y.M.C.A: 如果有单个的序列, 这些模式会自动匹配( 不需要特殊压制).在单个字母之间交替( 如x.y.z),可选,字符之间可能有一个空格,比如:x. y. z. - 点连接的单词序列
abc.def.g12 - 强调连接的单词序列
abc_def_g12 - 间接连接的单词序列
abc·def·g12 - 终于: 由字母字符组成的单词字符序列(Unicode类)
Letter),标记字符( Unicode 类别)Mark)或数字字符( Unicode 分类)Decimal_Number)),其中可能包括诸如:'财务报告和审定财务报表’和内在分离者-, (中文(简体) ),_·
目前的限制数字 :
- 目前没有对前作或后作的apostropes的一般识别,比如英语占有式复数"兄弟的朋友"或"外交官的合同". 原因:这需要大字典或更精密的语言理解,因为apostrophe一般与一出一出引文模糊.
含有汉语、日语、泰语或高棉语字符的字词的进一步分解
这需要 @echogarden/icu-segmentation-wasm 要设置的软件包 手动 已安装.
- 标出以前确定的每个字段
- 检查字段是否包含至少一个属于支持的东亚语言字符范围的代码点
- 在发现的第一个匹配上装入 ICU 模块( 因为启动延迟了大约 )
40ms- 说吧80ms,该模块仅在绝对需要时才被装入) - 使用 ICU 库进一步分割字段
句子和短语分割
句子分割数字 :
- 拆分为单词, 或使用预先提供的单词序列
- 识别句尾词, 如
., (中文(简体) ),。, (中文(简体) ),?, (中文(简体) ),?, (中文(简体) ),!, (中文(简体) ),!或换行符,字段外,并据此识别句子边界 - 扩展句子的跨度,以任何可能的后缀字符,在结束字符之后,例如
”, (中文(简体) ),’, (中文(简体) ),), (中文(简体) ),], (中文(简体) ),}, (中文(简体) ),»,换行符或其他空格
词组分割数字 :
- 检测到的句子
- 在每一句中,指明短语分隔符,例如
,, (中文(简体) ),、, (中文(简体) ),,, (中文(简体) ),،, (中文(简体) ),;, (中文(简体) ),;, (中文(简体) ),:, (中文(简体) ),:, (中文(简体) ),—外部单词跨度, 以及基于它们的分词 - 将短语的长度与任何后端的分点字符相扩展,直到包含句子的结尾
许可证
麻省理工学院