NLP 学习笔记

猎隼丶止戈 猎隼丶止戈 | 511 | 2023-08-30

词性大全

下面的表格就是网络上流传的经验总结,仅供参考。

这个词性表,实际上是个约定俗成的标准。类似 robots.txt​ 一样,这些词性标准可以遵守也可以不遵守,也可以定制自己特有的词性标准。

词性表

词性编码词性名称注 解例子
a形容词取英语形容词 adjective 的第 1 个字母[重要/a 步伐/n]NP
美丽/a
看似/v 抽象/a
ad副形词直接作状语的形容词。形容词代码 a 和副词代码 d 并在一起[积极/ad 谋求/v]V-ZZ
幻象/n 易/ad 逝/Vg
ag形语素形容词性语素。形容词代码为 a ,语素代码 g 前面置以 A 。
绿色/n 似/d 锦/Ag
an名形词具有名词功能的形容词。形容词代码 a 和名词代码 n 并在一起[外交/n 和/c 安全/an]NP-BL
b区别词取汉字 “别” 的声母详细见下方 区别词 说明。
bg区别语素区别词性语素。区别词代码为 b ,语素代码 g 前面置以 B 。赤/Ag 橙/Bg 黄/a 绿/a 青/a 蓝/a 紫/a
c连词取英语连词 conjunction 的第 1 个字母合作/vn 与/c 伙伴/n
d副词取 adverb 的第 2 个字母,因其第 1 个字母已用于形容词进一步/d 发展/v
dg副语素副词性语素。副词代码为 d,语素代码 g 前面置以 D。了解/v 甚/Dg 深/a
煞/Dg 是/v 喜人/a
df例:不要 。否定版本的副词?
dg副语素副词性语素。副词代码为 d,语素代码 g 前面置以 D
e叹词取英语叹词 exclamation 的第 1 个字母啊/e ,/w 那/r 金灿灿/z 的/u 麦穗/n
f方位词取汉字 “方”军人/n 的/u 眼睛/n 里/f 不/d 是/v 没有/v 风景/n
g语素绝大多数语素都能作为合成词的 “词根”,取汉字“根” 的声母
h前接成分取英语 head 的第 1 个字母许多/m 非/h 主角/n 人物/n
办事处/n 的/u “/w 准/h 政府/n ”/w 功能/n 不断/d 加强/v
i成语取英语成语 idiom 的第 1 个字母一言一行/i
义无反顾/i
j简称略语取汉字 “简” 的声母[德/j 外长/n]NP
文教/j
k后接成分少年儿童/l 朋友/n 们/k
身体/n 健康/a 者/k
l习用语习用语尚未成为成语,有点 “临时性”,取“临” 的声母少年儿童/l 朋友/n 们/k
落到实处/l
m数词取英语 numeral 的第 3 个字母,n,u 已有他用详细见下方 数词 说明。
mg数语素数词性语素。数词代码为 m ,语素代码 g 前面置以 M 。甲/Mg 减下/v 的/u 人/n 让/v 乙/Mg 背上/v
凡/d “/w 寅/Mg 年/n ”/w 中/f 出生/v 的/u 人/n 生肖/n 都/d 属/v 虎/n
mq数量词
n名词取英语名词 noun 的第 1 个字母岗位/n 城市/n 机会/n 她/r 是/v 责任/n 编辑/n
(编辑/v 科技/n 文献/n)
ng名语素名词性语素。名词代码为 n,语素代码 g 前面置以 N出/v 过/u 两/m 天/q 差/Ng
理/v 了/u 一/m 次/q 发/Ng
nr/PER人名名词代码 n 和 “人(ren)” 的声母并在一起详细见下方 人名 说明。
nrfg人名
nrt人名
ns/LOC地名名词代码 n 和处所词代码 s 并在一起。详细见下方 地名 说明。
nt/ORG机构团体“团” 的声母为 t,名词代码 n 和 t 并在一起。详细见下方 机构团体 说明。
nw作品名来自 LAC
nx字母专名外文字符A/nx 公司/n
B/nx 先生/n
X/nx 君/Ng
24/m K/nx 镀金/n
C/nx 是/v 光速/n
Windows98/nx
PentiumIV/nx
I LOVE THIS GAME/nx
nz其他专名“专” 的声母的第 1 个字母为 z,名词代码 n 和 z 并在一起。
详细见下方 其他专名 说明。
o拟声词取英语拟声词 onomatopoeia 的第 1 个字母。哈哈/o 一/m 笑/v
装载机/n 隆隆/o 推进/v
p介词取英语介词 prepositional 的第 1 个字母。对/p 子孙后代/n 负责/v
以/p 煤/n 养/v 农/Ng
为/p 治理/v 荒山/n 服务/v
把/p 青年/n 推/v 上/v 了/u 领导/vn 岗位/n
q量词取英语 quantity 的第 1 个字母。首/m 批/q
一/m 年/q
r代词取英语代词 pronoun 的第 2 个字母, 因 p 已用于介词。单音节代词“本”、“每”、“各”、“诸”后接单音节名词时,和后接的单音节名词合为代词;当后接双音节名词时,应予切分。
本报/r
每人/r
本社/r
本/r 地区/n
各/r 部门/n
rg代语素代词性语素。代词代码为 r,在语素的代码 g 前面置以 R。读者/n 就/d 是/v 这/r 两/m 棵/q 小树/n 扎根/v 于/p 斯/Rg 、/w 成长/v 于/p 斯/Rg 的/u 肥田/n 沃土/n
rr人称代词
rz例:这位
s处所词取英语 space 的第 1 个字母家里/s 的/u 电脑/n 都/d 联通/v 了/u 国际/n 互联网/n
西部/s 交通/n 咽喉/n
t/TIME时间词取英语 time 的第 1 个字母详细见下方 时间 说明。
tg时语素时间词性语素。时间词代码为 t, 在语素的代码 g 前面置以 T3 日/t 晚/Tg 在/p 总统府/n 发表/v 声明/n
尊重/v 现/Tg 执政/vn 当局/n 的/u 权威/n
u助词取英语助词 auxiliary详细见下方 助词 说明。
ud例:得
ug例:过
uj例:的
ul例:了
uv例:地
uz例:着
v动词取英语动词 verb 的第一个字母详细见下方 动词 说明。
vd副动词直接作状语的动词。动词和副词的代码并在一起形势/n 会/v 持续/vd 好转/v
认为/v 是/v 电话局/n 收/v 错/vd 了/u 费/n
vg动语素动词性语素。动词代码为 v。在语素的代码 g 前面置以 V洗/v 了/u 一个/m 舒舒服服/z 的/u 澡/Vg
vi例:沉溺于 等同于
vn名动词指具有名词功能的动词。动词和名词的代码并在一起引起/v 人们/n 的/u 关注/vn 和/c 思考/vn
收费/vn 电话/n 的/u 号码/n
vq例:去浄 去过 唸过
w标点符号”/w
:/w
x非语素字非语素字只是一个符号,字母 x 通常用于代表未知数、符号。
xc其他虚词来自 LAC
y语气词取汉字 “语” 的声母。会/v 泄露/v 用户/n 隐私/n 吗/y
又/d 何在/v 呢/y
Yg语气语素语气词性语素。语气词代码为 y。在语素的代码 g 前面置以 Y。唯/d 大力/d 者/k 能/v 致/v 之/u 耳/Yg
z状态词取汉字 “状” 的声母的前一个字母。取得/v 扎扎实实/z 的/u 突破性/n 进展/vn
四季/n 常青/z 的/u 热带/n 树木/n
短短/z 几/m 年/q 间
zg例:且 丗 丟
un未知词不可识别词及用户自定义词组。取英文 Unkonwn 首两个字母。(非北大标准,CSW 分词中定义)

说明

区别词

女/b 司机/n
金/b 手镯/n
慢性/b 胃炎/n
古/b 钱币/n
副/b 主任/n
总/b 公司/n

单音节区别词和单音节名词或名语素组合,作为一个词,并标以名词词性 n。

雄鸡/n
雌象/n
女魔/n
古币/n

少数“单音节区别词 + 双音节词”的结构作为一个词。

总书记/n

数词

  1. 数量词组应切分为数词和量词。

    三/m 个/q
    10/m 公斤/q
    一/m 盒/q 点心/n
    
  2. 但少数数量词已是词典的登录单位,则不再切分。

    一个/m
    一些/m
    
  3. 基数、序数、小数、分数、百分数一律不予切分,为一个切分单位,标注为 m 。

    一百二十三/m
    20万/m
    123.54/m
    一个/m
    第一/m
    第三十五/m
    20%/m
    三分之二/m
    千分之三十/m
    几十/m 人/n
    十几万/m 元/q
    第一百零一/m 个/q
    
  4. 约数,前加副词、形容词或后加“来、多、左右”等助数词的应予分开。

    约/d 一百/m 多/m 万/m
    仅/d 一百/m 个/q
    四十/m 来/m 个/q
    二十/m 余/m 只/q
    十几/m 个/q
    三十/m 左右/m
    
  5. 两个数词相连的及“成百”、“上千”等则不予切分。

    五六/m 年/q
    七八/m 天/q
    十七八/m 岁/q
    成百/m 学生/n
    上千/m 人/n
    
  6. 表序关系的“数 + 名”结构,应予切分。

    二/m 连/n
    三/m 部/n
    

人名

  1. 汉族人及与汉族起名方式相同的非汉族人的姓和名单独切分,并分别标注为 nr 。

    张/nr 仁伟/nr
    欧阳/nr 修/nr
    阮/nr 志雄/nr
    朴/nr 贞爱/nr
    

    汉族人除有单姓和复姓外,还有双姓,即有的女子出嫁后,在原来的姓上加上丈夫的姓。如:陈方安生。这种情况切分、标注为:

    陈/nr 方/nr 安生/nr
    

    唐姜氏,切分、标注为:

    唐/nr 姜氏/nr
    
  2. 姓名后的职务、职称或称呼要分开。

    江/nr 主席/n
    小平/nr 同志/n
    江/nr 总书记/n
    张/nr 教授/n
    王/nr 部长/n
    陈/nr 老总/n
    李/nr 大娘/n
    刘/nr 阿姨/n
    龙/nr 姑姑/n
    
  3. 对人的简称、尊称等若为两个字,则合为一个切分单位,并标以 nr 。

    老张/nr
    大李/nr
    小郝/nr
    郭老/nr
    陈总/nr
    
  4. 明显带排行的亲属称谓要切分开,分不清楚的则不切开。

    三/m 哥/n
    大婶/n
    大/a 女儿/n
    大哥/n
    小弟/n
    老爸/n
    
  5. 一些著名作者的或不易区分姓和名的笔名通常作为一个切分单位。

    鲁迅/nr
    茅盾/nr
    巴金/nr
    三毛/nr
    琼瑶/nr
    白桦/nr
    
  6. 外国人或少数民族的译名(包括日本人的姓名)不予切分,标注为 nr。

    克林顿/nr
    叶利钦/nr
    才旦卓玛/nr
    小林多喜二/nr
    北研二/nr
    华盛顿/nr
    爱因斯坦/nr
    

    有些西方人的姓名中有小圆点,也不分开。

    卡尔·马克思/nr
    

地名

  1. 国名不论长短,作为一个切分单位。

    中国/ns
    中华人民共和国/ns
    日本国/ns
    美利坚合众国/ns
    美国/ns
    
  2. 地名后有“省”、“市”、“县”、“区”、“乡”、“镇”、“村”、“旗”、“州”、“都”、“府”、“道”等单字的行政区划名称时,不切分开,作为一个切分单位。

    四川省/ns
    天津市/ns
    景德镇/ns
    沙市市/ns
    牡丹江市/ns
    正定县/ns
    海淀区/ns
    通州区/ns
    东升乡/ns
    双桥镇/ns
    南化村/ns
    华盛顿州/ns
    俄亥俄州/ns
    东京都/ns
    大阪府/ns
    北海道/ns
    长野县/ns
    开封府/ns
    宣城县/ns
    
  3. 地名后的行政区划有两个以上的汉字,则将地名同行政区划名称切开,不过要将地名同行政区划名称用方括号括起来,并标以短语 NS。

    [芜湖/ns 专区/n] NS
    [宣城/ns 地区/n]ns
    [内蒙古/ns 自治区/n]NS
    [深圳/ns 特区/n]NS
    [厦门/ns 经济/n 特区/n]NS
    [香港/ns 特别/a 行政区/n]NS
    [香港/ns 特区/n]NS
    [华盛顿/ns 特区/n]NS
    
  4. 地名后有表示地形地貌的一个字的普通名词,如“江、河、山、洋、海、岛、峰、湖”等,不予切分。

    鸭绿江/ns
    亚马逊河/ns
    喜马拉雅山/ns
    珠穆朗玛峰/ns
    地中海/ns
    大西洋/ns
    洞庭湖/ns
    塞普路斯岛/ns
    
  5. 地名后接的表示地形地貌的普通名词若有两个以上汉字,则应切开。然后将地名同该普通名词标成短语 NS。

    [台湾/ns 海峡/n]NS
    [华北/ns 平原/n]NS
    [帕米尔/ns 高原/n]NS
    [南沙/ns 群岛/n]NS
    [京东/ns 大/a 峡谷/n]NS
    [横断/b 山脉/n]NS
    
  6. 地名后有表示自然区划的一个字的普通名词,如“ 街,路,道,巷,里,町,庄,村,弄,堡”等,不予切分。

    中关村/ns
    长安街/ns
    学院路/ns
    景德镇/ns
    吴家堡/ns
    庞各庄/ns
    三元里/ns
    彼得堡/ns
    北菜市巷/ns
    
  7. 地名后接的表示自然区划的普通名词若有两个以上汉字,则应切开。然后将地名同自然区划名词标成短语 NS。

    [米市/ns 大街/n]NS
    [蒋家/nz 胡同/n]NS
    [陶然亭/ns 公园/n]NS
    
  8. 大小地名相连时的标注方式为

    北京市/ns
    海淀区/ns
    海淀镇/ns
    [南/f 大街/n]NS
    [蒋家/nz 胡同/n]NS 24/m 号/q
    

机构团体

  1. 短语标记 NT

    联合国/nt
    中共中央/nt
    国务院/nt
    北京大学/nt
    
  2. 大多数团体、机构、组织的专有名称一般是短语型的,较长,且含有地名或人名等专名,再组合,标注为短语 NT。

    [中国/ns 计算机/n 学会/n]NT
    [香港/ns 钟表业/n 总会/n]NT
    [烟台/ns 大学/n]NT
    [香港/ns  理工大学/n]NT
    [华东/ns  理工大学/n]NT
    [合肥/ns 师范/n 学院/n]NT
    [北京/ns 图书馆/n]NT
    [富士通/nz 株式会社/n]NT
    [香山/ns 植物园/n]NT
    [安娜/nz 美容院/n]NT
    [上海/ns 手表/n 厂/n]NT
    [永和/nz 烧饼铺/n]NT
    [北京/ns 国安/nz 队/n]NT
    
  3. 对于在国际或中国范围内的知名的唯一的团体、机构、组织的名称即使前面没有专名,也标为 nt 或 NT。

    联合国/nt
    国务院/nt
    外交部/nt
    财政部/nt
    教育部/nt
    国防部/nt
    
    [世界/n 贸易/n 组织/n]NT
    [国家/n 教育/vn 委员会/n]NT
    [信息/n 产业/n 部/n]NT
    [全国/n 信息/n 技术/n 标准化/vn 委员会/n]NT
    [全国/n 总/b 工会/n]NT
    [全国/n 人民/n 代表/n 大会/n]NT
    

    美国的“国务院”,其他国家的“外交部、财政部、教育部”,必须在其所属国的国名之后出现时,才联合标注为 NT。

    [美国/ns 国务院/n]NT
    [法国/ns 外交部/n]NT
    [美/j 国会/n]NT
    

    日本有些政府机构名称很特别,无论是否出现在“日本”国名之后都标为 nt。

    [日本/ns 外务省/nt]NT
    [日/j 通产省/nt]NT
    通产省/nt
    
  4. 前后相连有上下位关系的团体机构组织名称的处理方式如下

    [联合国/nt 教科文/j 组织/n]NT
    [中国/ns 银行/n 北京/ns 分行/n]NT
    [河北省/ns 正定县/ns 西平乐乡/ns 南化村/ns 党支部/n]NT
    
  5. 当下位名称含有专名(如“北京/ns 分行/n”、“南化村/ns 党支部/n”、“昌平/ns 分校/n”)时,也可脱离前面的上位名称单独标注为 NT。

    [中国/ns 银行/n]NT
    [北京/ns 分行/n]NT
    北京大学/nt [昌平/ns 分校/n]NT
    
  6. 团体、机构、组织名称中用圆括号加注简称时

    [宝山/ns 钢铁/n (/w 宝钢/j )/w 总/b 公司/n]NT
    [宝山/ns 钢铁/n 总/b 公司/n]NT
    (/w 宝钢/j )/w
    

其他专名

  1. 除人名、国名、地名、团体、机构、组织以外的其他专有名词都标以 nz。

    满族/nz
    俄罗斯族/nz
    汉语/nz
    罗马利亚语/nz
    捷克语/nz,中文/nz
    英文/nz
    满人/nz
    哈萨克人/nz
    诺贝尔奖/nz
    茅盾奖/nz
    
  2. 包含专有名称(或简称)的交通线,标以 nz;短语型的,标为 NZ。

    津浦路/nz
    石太线/nz
    [京/j 九/j 铁路/n]NZ
    [京/j 津/j 高速/b 公路/n]NZ
    
  3. 历史上重要事件、运动等专有名称一般是短语型的,按短语型专有名称处理,标以 NZ。

    [卢沟桥/ns 事件/n]NZ
    [西安/ns 事变/n]NZ
    [五四/t 运动/n]NZ
    [明治/nz 维新/n]NZ
    [甲午/t 战争/n]NZ
    
  4. 专有名称后接多音节的名词,如“语言”、“文学”、“文化”、“方式”、“精神”等,失去专指性,则应分开。

    欧洲/ns 语言/n
    法国/ns 文学/n
    西方/ns 文化/n
    贝多芬/nr 交响乐/n
    雷锋/nr 精神/n
    美国/ns 方式/n
    日本/ns 料理/n
    宋朝/t 古董/n
    
  5. 商标(包括专名及后接的“牌”、“型”等)是专指的,标以 nz,但其后所接的商品仍标以普通名词 n。

    康师傅/nr 方便面/n
    中华牌/nz 香烟/n
    牡丹III型/nz 电视机/n
    联想/nz 电脑/n
    鳄鱼/nz 衬衣/n
    耐克/nz 鞋/n
    
  6. 以序号命名的名称一般不认为是专有名称。

    2/m 号/q 国道/n
    十一/m 届/q 三中全会/j
    

    如果前面有专名,合起来作为短语型专名。

    [中国/ns 101/m 国道/n]NZ
    [中共/j 十一/m 届/q 三中全会/j]NZ
    
  7. 书、报、杂志、文档、报告、协议、合同等的名称通常有书名号加以标识,不作为专有名词。由于这些名字往往较长,名字本身按常规处理。

    《/w 宁波/ns 日报/n 》/w
    《/w 鲁迅/nr 全集/n 》/w
    中华/nz 读书/vn 报/n
    杜甫/nr 诗选/n
    

    少数书名、报刊名等专有名称,则不切分。

    红楼梦/nz
    人民日报/nz
    儒林外史/nz
    
  8. 当有些专名无法分辨它们是人名还是地名或机构名时,暂标以 nz。

    [巴黎/ns 贝尔希/nz 体育馆/n]NT
    

    其中“贝尔希”只好暂标为 nz。

时间

  1. 年月日时分秒,按年、月、日、时、分、秒切分,标注为 t 。

    1997年/t
    3月/t
    19日/t
    下午/t
    2时/t
    18分/t
    

    若数字后无表示时间的“年、月、日、时、分、秒”等的标为数词 m。

    1998/m 中文/n 信息/n 处理/vn 国际/n 会议/n
    
  2. 历史朝代的名称虽然有专有名词的性质,仍标注为 t。

    西周/t
    秦朝/t
    东汉/t
    南北朝/t
    清代/t
    

    “牛年、虎年”等一律不予切分,标注为:

    牛年/t
    虎年/t
    甲午年/t
    甲午/t 战争/n
    庚子/t 赔款/n
    戊戌/t 变法/n
    

助词

[[俄罗斯/ns 和/c 北约/j]NP-BL 之间/f [战略/n 伙伴/n 关系/n]NP 的/u 建立/vn]NP 填平/v 了/u [[欧洲/ns 安全/a 政治/n]NP 的/u 鸿沟/n]NP

动词

[[[欧盟/j 扩大/v]S 的/u [历史性/n 决定/n]NP]NP 和/c [北约/j 开放/v]S]NP-BL [为/p [创建/v [一/m 种/q 新/a 的/u 欧洲/ns 安全/a 格局/n]NP]VP-SBI]PP-MD [奠定/v 了/u 基础/n]V-SBI

编辑/v 科技/n 文献/n (她/r 是/v 责任/n 编辑/n)

参考

  1. nlp 分词词性表大全,结巴分词的词性都代表什么意思?
  2. 深度学习----NLP 结巴分词词性大全
  3. 自然语言处理之词性标注集
  4. NLP 标记集资料

工具库

HanLP

简介

HanLP 是一系列模型与算法组成的 NLP 工具包,目标是普及自然语言处理在生产环境中的应用。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。

功能:

使用

Maven 坐标

为了方便用户,特提供内置了数据包的 Portable 版,只需在 pom.xml 加入:

<dependency>
    <groupId>com.hankcs</groupId>
    <artifactId>hanlp</artifactId>
    <version>portable-1.8.4</version>
</dependency>
调试模式
HanLP.Config.enableDebug();
拼音转换
List<Pinyin> pinyins = HanLP.convertToPinyinList("形形色色,行");
Console.log("---> 拼音:{}", pinyins);
分词
普通操作
List<Term> segment = HanLP.segment("模型跟词典没有绝对的区别,隐马模型被做成人人都可以编辑的词典形式,不代表它不是模型。");
Console.log("---> 分词:{}", segment);
开启人名识别
String[] testCase = new String[]{
        "签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。",
        "王国强、高峰、汪洋、张朝阳光着头、韩寒、小四",
        "张浩和胡健康复员回家了",
        "王总和小丽结婚了",
        "编剧邵钧林和稽道青说",
        "这里有关天培的有关事迹",
        "龚学平等领导,邓颖超生前",
        };
Segment segment2 = HanLP.newSegment().enableNameRecognize(true);
for (String sentence : testCase) {
    List<Term> termList = segment2.seg(sentence);
    System.out.println(termList);
}

目前分词器基本上都默认开启了中国人名识别,比如 HanLP.segment()​ 接口中使用的分词器等等,用户不必手动开启;上面的代码只是为了强调。

识别器

方法默认
中国人名识别enableNameRecognize()开启
音译人名识别enableTranslatedNameRecognize()开启
日本人名识别enableJapaneseNameRecognize()关闭
地名识别enablePlaceRecognize()关闭
机构名识别enableOrganizationRecognize()关闭

关闭的识别器需要用户手动开启,一是因为消耗性能,二是有些不常用。

用户自定义词典
Console.log("================ 加载自定义词典 =================");
CustomDictionary.add("唐三", "nr 1024");
CustomDictionary.add("小舞", "nr 1024");
CustomDictionary.add("戴沐白", "nr 1024");
CustomDictionary.add("奥斯卡", "nr 1024");
CustomDictionary.add("马红俊", "nr 1024");
CustomDictionary.add("宁荣荣", "nr 1024");
CustomDictionary.add("朱竹清", "nr 1024");
CustomDictionary.add("白沉香", "nr 1024");
CustomDictionary.add("千仞雪", "nr 1024");
CustomDictionary.add("胡列娜", "nr 1024");
CustomDictionary.add("唐昊", "nr 1024");
CustomDictionary.add("比比东", "nr 1024");
CustomDictionary.add("阿银", "nr 1024");
CustomDictionary.add("玉小刚", "nr 1024");
CustomDictionary.add("弗兰德", "nr 1024");
CustomDictionary.add("柳二龙", "nr 1024");
CustomDictionary.add("赵无极", "nr 1024");
CustomDictionary.add("独孤博", "nr 1024");
CustomDictionary.add("宁风致", "nr 1024");
CustomDictionary.add("波赛西", "nr 1024");
CustomDictionary.add("千道流", "nr 1024");
CustomDictionary.add("唐晨", "nr 1024");
CustomDictionary.add("这座山", "rqn 1");
CustomDictionary.add("外门", "n 1024");
CustomDictionary.add("唐门", "nt 1024");
停用词词典
Console.log("================ 加载停用词词典 =================");
CoreStopWordDictionary.load("E:\\hanlp-wiki-vec-zh\\train\\stop_words.txt", Boolean.TRUE);
// 分词
List<Term> segment = HanLP.segment(true)
        .enableNameRecognize(true)
        .enableOrganizationRecognize(true)
        .enablePlaceRecognize(true)
        .enableNumberQuantifierRecognize(true)
        .seg(s);
// 删除停用词
CoreStopWordDictionary.apply(segment);
感知机分词
PerceptronLexicalAnalyzer analyzer = new PerceptronLexicalAnalyzer("E:\\下载\\HanLP\\data\\model\\perceptron\\large\\cws.bin");
List<Term> segment = analyzer.enableCustomDictionary(true)
                    .enableNameRecognize(true)
                    .enableOrganizationRecognize(true)
                    .enablePlaceRecognize(true)
                    .enableNumberQuantifierRecognize(true)
                    .seg("测试一下");
文本相似度
WordVectorModel wordVectorModel = new WordVectorModel("E:\\hanlp-wiki-vec-zh\\train\\yl-msr.txt");
float           similarity1     = wordVectorModel.similarity("父亲", "爸爸");
Console.log("---> 父亲 = 爸爸 近似度为 {}", similarity1);
DocVectorModel docVectorModel = new DocVectorModel(wordVectorModel);
float           similarity      = docVectorModel.similarity("唐三的父亲是铁匠", "宁荣荣的爸爸是组委会成员");
Console.log("---> 唐三的父亲是铁匠 = 宁荣荣的爸爸是组委会成员 近似度为 {}", similarity);

训练:

@Test
public void train()
        throws IOException {
    Console.log("================ 加载斗罗大陆 =================");
    List<String> douluoList = FileUtil.readLines(new File("E:\\hanlp-wiki-vec-zh\\train\\douluo.txt"), CharsetUtil.UTF_8);
    Console.log("================ 加载自定义词典 =================");
    CustomDictionary.add("唐三", "nr 1024");
    CustomDictionary.add("小舞", "nr 1024");
    CustomDictionary.add("戴沐白", "nr 1024");
    CustomDictionary.add("奥斯卡", "nr 1024");
    CustomDictionary.add("马红俊", "nr 1024");
    CustomDictionary.add("宁荣荣", "nr 1024");
    CustomDictionary.add("朱竹清", "nr 1024");
    CustomDictionary.add("白沉香", "nr 1024");
    CustomDictionary.add("千仞雪", "nr 1024");
    CustomDictionary.add("胡列娜", "nr 1024");
    CustomDictionary.add("唐昊", "nr 1024");
    CustomDictionary.add("比比东", "nr 1024");
    CustomDictionary.add("阿银", "nr 1024");
    CustomDictionary.add("玉小刚", "nr 1024");
    CustomDictionary.add("弗兰德", "nr 1024");
    CustomDictionary.add("柳二龙", "nr 1024");
    CustomDictionary.add("赵无极", "nr 1024");
    CustomDictionary.add("独孤博", "nr 1024");
    CustomDictionary.add("宁风致", "nr 1024");
    CustomDictionary.add("波赛西", "nr 1024");
    CustomDictionary.add("千道流", "nr 1024");
    CustomDictionary.add("唐晨", "nr 1024");
    CustomDictionary.add("这座山", "rqn 1");
    CustomDictionary.add("外门", "n 1024");
    CustomDictionary.add("唐门", "nt 1024");
    Console.log("================ 加载停用词词典 =================");
    CoreStopWordDictionary.load("E:\\hanlp-wiki-vec-zh\\train\\stop_words.txt", Boolean.TRUE);
    Console.log("================ 加载大分词模型 =================");
    PerceptronLexicalAnalyzer analyzer = new PerceptronLexicalAnalyzer("E:\\下载\\HanLP\\data\\model\\perceptron\\large\\cws.bin");
    Console.log("================ 生成分词文件 =================");
    List<String> newDouluoList = new ArrayList<String>(douluoList.size());
    for (String s : douluoList) {
        if (StrUtil.isBlank(s)) {
            continue;
        }
        s = StrUtil.trim(s);
        // 分词
        List<Term> segment = analyzer.enableCustomDictionary(true)
                .enableNameRecognize(true)
                .enableOrganizationRecognize(true)
                .enablePlaceRecognize(true)
                .enableNumberQuantifierRecognize(true)
                .seg(s);
        // 删除停用词
        CoreStopWordDictionary.apply(segment);
        newDouluoList.add(segment.stream().map(t -> t.word).collect(Collectors.joining(StrUtil.SPACE)));
    }
    String ylFile = "E:\\hanlp-wiki-vec-zh\\train\\yl.txt";
    FileUtil.writeLines(newDouluoList, ylFile, CharsetUtil.UTF_8);
    Console.log("================ 开始训练 =================");
    Word2VecTrainer trainerBuilder = new Word2VecTrainer();
    trainerBuilder.useNumThreads(16);
    trainerBuilder.setNumIterations(16);
    trainerBuilder.setCallback(new TrainingCallback() {
        @Override
        public void corpusLoading(float percent) {
            log.info("语料加载中... {}", percent);
        }
      
        @Override
        public void corpusLoaded(int vocWords, int trainWords, int totalWords) {
            log.info("语料加载完毕");
            log.info("词表大小:{}", vocWords);
            log.info("词语总词频:{}", totalWords);
            log.info("训练总词频:{}", trainWords);
        }
      
        @Override
        public void training(float alpha, float progress) {
            log.info("---> 学习率:{}  |  训练百分比:{}", alpha, progress);
        }
    });
    WordVectorModel wordVectorModel = trainerBuilder.train("E:\\hanlp-wiki-vec-zh\\train\\yl.txt", "E:\\hanlp-wiki-vec-zh\\train\\yl-msr.txt");
    Console.log("================ 结束训练 =================");
    Console.log("--> 查询相近词测试");
    Console.log("---> 唐三 近似词 {}", wordVectorModel.nearest("唐三"));
    Console.log("---> 宁荣荣 近似词 {}", wordVectorModel.nearest("宁荣荣"));
}

命令行训练:

$ java -cp hanlp.jar com.hankcs.hanlp.mining.word2vec.Train
word2vec Java toolkit v 0.1c

Options:
训练参数:
	-output <file>
		使用 <file> 来保存生成的词向量/词组
	-size <int>
		设置词向量的大小; 默认为 100
	-window <int>
		设置单词之间的最大跳过长度; 默认为 5
	-sample <float>
		设置单词出现的阈值。那些在训练数据中出现频率较高的词将被随机下采样;默认值是0.001,有效范围是(0,0.00001)。
	-hs <int>
		使用分层Softmax;默认为0(不使用)。
	-negative <int>
		反面例子的数量;默认为5,常用值为3-10(0=不使用)。
	-threads <int>
		使用<int>线程(默认为本地机器的核心数)。
	-iter <int>
		运行更多的训练迭代(默认为5次)。
	-min-count <int>
		这将丢弃出现次数少于<int>的单词;默认为5
	-alpha <float>
		设置起始学习率;默认情况下,对 skip-gram 来说是0.025,对 CBOW 来说是0.05。
	-cbow <int>
		使用连续的词包模型;默认为1(skip-gram 模型使用 0)。
	-input <file>
		使用 <file> 中的文本数据来训练模型

示例:
java -cp hanlp.jar com.hankcs.hanlp.mining.word2vec.Train -input corpus.txt -output vectors.txt -size 200 -window 5 -sample 0.0001 -negative 5 -hs 0 -binary -cbow 1 -iter 3

java -jar​ 和 java -cp​ 是 Java 命令的两种不同使用方式,它们有以下区别:

  1. java -jar​:用于执行包含可执行代码的 JAR 文件。当使用 java -jar​ 命令时,Java 虚拟机会自动查找并执行 JAR 文件中的 main​ 方法。此方式主要用于执行独立的可执行 JAR 文件,其中 JAR 文件包含了主类和其依赖的类。
    示例:java -jar myapp.jar
  2. java -cp​:用于指定类路径并执行 Java 类。当使用 java -cp​ 命令时,需要指定要执行的主类的完整类名,并通过 -cp​ 参数指定类路径,即包含所有依赖的类和资源的路径。该方式常用于执行单个类文件或类文件集合,或者执行包含多个依赖的应用程序。
    示例:java -cp myapp.jar com.example.Main

总结:

  • java -jar​ 用于执行独立可执行 JAR 文件,自动查找并执行 JAR 文件中的 main​ 方法。
  • java -cp​ 用于指定类路径并执行 Java 类,需手动指定要执行的主类的完整类名。

注意:java -jar​ 和 java -cp​ 可以结合使用,即执行指定 JAR 文件并指定类路径,例如:java -jar myapp.jar -cp lib/*​。

参考文章:

  1. 开始动手训练自己的词向量 word2vec
  2. 自然语言处理 3:词向量
  3. NLP(5): 停用词,文本的表示,文本的相似度,tf-idf,词向量
文本摘要
String content = "程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。";
List<String> keywordList = HanLP.extractKeyword(content, 5);
Console.log("---> 关键词提取:{}", keywordList);

String document = "算法可大致分为基本算法、数据结构的算法、数论算法、计算几何的算法、图的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法、厄米变形模型、随机森林算法。\n" +
        "算法可以宽泛的分为三类,\n" +
        "一,有限的确定性算法,这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。\n" +
        "二,有限的非确定算法,这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。\n" +
        "三,无限的算法,是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。";
List<String> sentenceList = HanLP.extractSummary(document, 3);
Console.log("---> 自动摘要:{}", sentenceList);

String text = "算法工程师\n" +
        "算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。\n" +
        "\n" +
        "1职位简介\n" +
        "算法工程师是一个非常高端的职位;\n" +
        "专业要求:计算机、电子、通信、数学等相关专业;\n" +
        "学历要求:本科及其以上的学历,大多数是硕士学历及其以上;\n" +
        "语言要求:英语要求是熟练,基本上能阅读国外专业书刊;\n" +
        "必须掌握计算机相关知识,熟练使用仿真工具MATLAB等,必须会一门编程语言。\n" +
        "\n" +
        "2研究方向\n" +
        "视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师\n" +
        "\n" +
        "3目前国内外状况\n" +
        "目前国内从事算法研究的工程师不少,但是高级算法工程师却很少,是一个非常紧缺的专业工程师。算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、雷达信号处理、生物医学信号处理等领域的一维信息算法处理。\n" +
        "在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法:机器视觉成为此类算法研究的核心;另外还有2D转3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),运动估计运动补偿算法(Motion estimation/Motion Compensation),去噪算法(Noise Reduction),缩放算法(scaling),锐化处理算法(Sharpness),超分辨率算法(Super Resolution),手势识别(gesture recognition),人脸识别(face recognition)。\n" +
        "在通信物理层等一维信息领域目前常用的算法:无线领域的RRM、RTT,传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。\n" +
        "另外数据挖掘、互联网搜索算法也成为当今的热门方向。\n" +
        "算法工程师逐渐往人工智能方向发展。";
List<String> phraseList = HanLP.extractPhrase(text, 10);
Console.log("---> 短语提取:{}", phraseList);

输出:

---> 关键词提取:[程序员, 人员, 程序, 分为, 开发]
---> 自动摘要:[无限算法的产生是由于未能确定的定义终止条件, 这类算法在有限的时间内终止, 这类算法在有限的一段时间内终止]
---> 短语提取:[算法工程师, 算法处理, 一维信息, 算法研究, 图像技术, 信息算法, 处理算法, 视频算法, 通信物理, 不同算法]

Mynlp

简介

MYNLP 是一个 Java 实现的高性能、柔性 API、可扩展的中文 NLP 工具包。

功能:

  • 感知机分词
  • CORE 二元语言模型&词典分词
  • 词性标注
  • 通用感知机
  • 命名实体识别(人名、地名、组织机构名)
  • fastText
  • 文本分类
  • 新词发现
  • 拼音转换&切分
  • 简繁体转换

使用

<!-- 核心词典(20w+词,500w+二元) 18.2M -->
<dependency>
	<groupId>com.mayabot.mynlp.resource</groupId>
	<artifactId>mynlp-resource-coredict</artifactId>
	<version>1.0.0</version>
</dependency>

<!-- 词性标注模型(感知机模型) 17.5M -->
<dependency>
	<groupId>com.mayabot.mynlp.resource</groupId>
	<artifactId>mynlp-resource-pos</artifactId>
	<version>1.0.0</version>
</dependency>

<!-- 命名实体识别(人名识别、其他NER) 13.4M -->
<dependency>
	<groupId>com.mayabot.mynlp.resource</groupId>
	<artifactId>mynlp-resource-ner</artifactId>
	<version>1.0.0</version>
</dependency>

<!-- 拼音词典、拼音切分模型 272K -->
<dependency>
	<groupId>com.mayabot.mynlp.resource</groupId>
	<artifactId>mynlp-resource-pinyin</artifactId>
	<version>1.1.0</version>
</dependency>

<!-- 繁简体词典 478K -->
<dependency>
	<groupId>com.mayabot.mynlp.resource</groupId>
	<artifactId>mynlp-resource-transform</artifactId>
	<version>1.0.0</version>
</dependency>

<!-- 感知机分词模型 62.4M (非必填) -->
<dependency>
	<groupId>com.mayabot.mynlp.resource</groupId>
	<artifactId>mynlp-resource-cws</artifactId>
	<version>1.0.0</version>
</dependency>

<!-- 自定义扩展词库 2.19M -->
<dependency>
	<groupId>com.mayabot.mynlp.resource</groupId>
	<artifactId>mynlp-resource-custom</artifactId>
	<version>1.0.0</version>
</dependency>

<!-- 工具类 -->
<dependency>
	<groupId>com.mayabot.mynlp</groupId>
	<artifactId>mynlp</artifactId>
	<version>4.0.0</version>
</dependency>
Gradle 坐标mynlp-all 依赖文件大小说明
com.mayabot.mynlp.resource:mynlp-resource-coredict:1.0.0Y18.2M核心词典(20w+ 词,500w+ 二元)
com.mayabot.mynlp.resource:mynlp-resource-pos:1.0.0Y17.5M词性标注模型(感知机模型)
com.mayabot.mynlp.resource:mynlp-resource-ner:1.0.0Y13.4M命名实体识别(人名识别、其他 NER)
com.mayabot.mynlp.resource:mynlp-resource-pinyin:1.1.0Y272K拼音词典、拼音切分模型
com.mayabot.mynlp.resource:mynlp-resource-transform:1.0.0Y478K繁简体词典
com.mayabot.mynlp.resource:mynlp-resource-cws:1.0.0N62.4M感知机分词模型
com.mayabot.mynlp.resource:mynlp-resource-custom:1.0.0N2.19M自定义扩展词库

Demo.java:

@Test
public void demo3() {
	Console.log("======================= 分词");
	Lexer lexer = Lexers.coreBuilder()
			.withPos()
			.withPersonName()
			.build();
	String[] tj = new String[]{
			"给定公历日期和农历日期,获取其相对应的农历日期和公历日期。若该日期不存在,则报错。",
			"工作统计",
			"待办任务",
			"今天天气怎么样",
			"下雨了,我心情就不好"
	};
	for (int i = 0; i < tj.length; i++) {
		final String s = tj[i];
		Console.log("---> 第 {} 条解析结果为 {}", i, lexer.scan(s).toList());
	}

	Console.log("======================= 拼音");

	PinyinService pinyin = Mynlp.instance().pinyin();
	PinyinResult  result = pinyin.convert("行者,行长,行不行,行伍,行的");
	System.out.println(result.asString());
	System.out.println(result.asHeadString(","));

	result.fuzzy(true);
	System.out.println(result.fuzzy(true).asString());

	result.keepPunctuation(true);
	System.out.println(result.asString());

	Console.log("======================= 摘要");

	final String s = "随着科技不断发展、社会不断进步、城市不断扩张,当前我们的城市已经是一个复杂的巨系统,存在政治、经济、文化、教育等多种中心高度融合,市政、环卫、城管、交通等多部门分头治理的现象。推行城市运行一网统管能够打通数据壁垒、整合治理资源、推动城市治理更加智慧化精细化,是推动城市治理体系和治理能力现代化的必由之路。\n" +
			"网格化管理和热线服务,是实现城市运行一网统管的两大重要途径。其中,网格化管理是政府城市治理的牛鼻子工作、政务热线是政府倾听市民声音的渠道。以网格化管理为手段、以热线服务为抓手,两大业务优势互补,强化市民诉求和网格数据关联分析,推进主动治理、源头治理,从而助推城市治理精细化水平提升,实现城市高效运行一网统管。\n" +
			"研究ChatGPT技术,通过GPT3.5模型训练,深度赋能热线+网格业务,打造问题智能化闭环处置流程体系,实现“全流程监督,将重点问题解决在萌芽期”。同时实现对问题类型、区域、主体等对象的诉求规律预测,为政府主动治理、资源调配提供数据支撑。这将是未来城市运行一网统管、智慧城市建设的新思路、新突破,可以让市民更加积极参与城市治理、政府更加高效履职,从而实现政府服务更加高效、更加到位;管理水平更加精细、更加智能;人民群众更加幸福、更加满足。";
	final LexerReader  l       = new DefaultLexerReader(lexer);
	final List<String> result1 = new SentenceSummary(l).summarySentences(s, 10);
	final List<String> keyword = new KeywordSummary(l).keyword(s, 10);
	Console.log("---> 桔子摘要:{}", result1);
	Console.log("---> 关键字摘要:{}", keyword);
}

其他

  1. Mynlp 技术参考手册
  2. GitHub

LTP

简介

LTP(Language Technology Platform) 提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、分句、词性标注、命名实体识别、句法分析、用户词典等等工作。

使用

最简单的方式就是使用我们在 docker 中已经编译好的 LTP 服务。这种方式避免了多种不同系统编译安装时可能出现的各种问题,也避免了模型和代码匹配等问题。如果您希望快速部署 LTP 的接口服务器并使用。推荐这种方法。

  1. 使用本仓库 Dockerfile 构建镜像,仅下载 Dockerfile 文件,放在一个空文件夹下,并在该文件夹下执行

    # 由于网络原因可能中途失败。多执行几次即可。
    docker build -t ltp/ltp .
    
  2. 在配置中给 docker 运行给予足够大的内存。我们这里设置了 6G 运行内存。

  3. 使用如下命令启动容器,这里的 8080 是映射到本地的端口号,可以根据需要改动为其他未占用的端口

    docker run -d -p 8080:12345 ltp/ltp /ltp_server --last-stage all
    
  4. 使用如下命令测试服务器是否部署成功。启动后可能需要等待数十秒的模型加载时间。

    curl -d "s=他点头表示同意我的意见。&f=xml&t=all" http://127.0.0.1:8080/ltp
    

其他

参考官方文档:

  1. LTP 官网
  2. GitHub Wiki

NLPIR

简介

NLPIR 汉语分词系统主要功能包括 中文分词、英文分词、词性标注、命名实体识别、新词识别、关键词提取、支持用户专业词典与微博分析。

NLPIR 系统支持多种编码、多种操作系统、多种开发语言与平台。

使用

其他

参考 NLPIR 官方 SDK

应用

FAQ 检索式问答

实现

碰到了,用了再说....

参考

  1. Bibliothecarius

    Bibliothecarius 是一个本地数据分析工具,可根据自定义 prompt 进行对话。该工具支持多种模型,可以进行横向对比,并支持数据隔离和多种数据类型。

    能干啥?

    • 个人或企业知识库问答助手。
    • 分析书籍或材料。
    • 专属于某个群组的 ai 助手。
    • 甚至可以组织 ai 陪你玩剧本杀。
  2. 【实践】从零开始一个 NLP 的 Word2Vec 智能问答

  3. NLP: 基于文本语义的智能问答系统

  4. NLP 基础:检索式问答系统实战

文章标签: Java
推荐指数:

真诚点赞 诚不我欺~

NLP 学习笔记

点赞 收藏 评论

关于作者

猎隼丶止戈
猎隼丶止戈

这个人很懒~

等级 LV3

粉丝 13

获赞 28

经验 363