crf中文分词 java实现,CRF 实现中文分词与词性标记

** 关于命名实体识别和商品打标 **

命名实体识别

在我的业务场景中,需要识别出sku是一件什么物品,比如 sku“良食记东北优质大米 5kg”(标记为“#1”)是大米,sku“德芙丝滑牛奶巧克力碗装 252g”(标记为“#2”)是巧克力。我把以上2个例子中的大米和巧克力定义为实体。

对于只包含一个实体词的 #1,可以得到如下的标记

良食记 品牌

东北 产地

优质 修饰

大米 实体

5kg 规格

这种只包含一个实体词的商品,相对易于识别。

对于包含多个实体词的 #2,可以得到如下标记

德芙 品牌

丝滑 修饰

牛奶 实体(实际为修饰,可能是牛奶味,也可能是成分包含牛奶)

巧克力 实体

碗装 规格

252g 规格

对于这种包含多个实体的商品,如何进行实体判别,则需要引入其他条件。

第一个想到的,即是品牌,我们可以计算品牌和实体词的同现度。

商品打标

词的相关性

比如“烧烤炉”和“烧烤盘”是相关的

特征词

在title为“海蒂诗 更衣室板 塑料白色 四钩”的sku中,“更衣室”、“板”2者联合可以作为此sku的实体词,二者取其一,搜索结果准确率都会下降

**Stanford Named Entity Recognizer **

CRF++ 实现中文分词与词性标记

版本说明

crf++:CRF++-0.58

系统:osx 10.12

安装crf++

cd CRF++-0.58

./configure

make

sudo make install

安装python

在crf++目录下,提供了python的工具包,需要进行安装

cd CRF++-0.58/python

python setup.py build

sudo python setup.py install

** 利用CRF++实现中文分词 **

步骤

生成CRF++所需格式的训练数据

利用训练数据训练出模型

对测试数据集进行分词

以下为详解

生成CRF++所需格式的训练数据

在backoff2005的数据集中,有一份训练数据,是分好词的一份文件。

1fdbe28bc381?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

文件16M左右,每个词以空格隔开。我们需要把这个文件转换为crf++训练数据集所需要的格式。。

crf++所需要的格式如下

“ S

人 B

们 E

常 S

说 S

生 B

活 E

利用训练数据训练出模型

./CRF/crf_learn -f 3 -c 4.0 ./CRF/example/seg/template tmp.data model

1fdbe28bc381?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

生成的模型文件model是一个二进制文件,51M左右。

对测试文件进行分词测试

下载crf_segmenter

运行脚本python crf_segmenter.py crf++/crf++/CRF++-0.58/model ./news.txt crf_4tag_news_out.utf8

feature_index.cpp(193) [mmap_.open(model_filename)] ./mmap.h(153) [(fd = ::open(filename, flag | O_BINARY)) >= 0] open failed: model

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中文分词是自然语言处理的一个重要任务,可以通过CRF(条件随机场)模型来训练一个中文分词模型。以下是一个基于Python的示例代码,使用jieba分词库和sklearn-crfsuite包进行中文分词模型训练。 首先,需要准备训练数据。可以使用已经标注好的中文分词语料库,例如pku和msr语料库。数据格式为每行一个句子,句子中的词语之间用空格隔开,词语后面跟着词性标记,例如: ``` 我 爱 北京 天安门/n ``` 其中,`/n`表示“名词”。这样的标注格式可以使用jieba分词库的`cut`函数进行分词,并将分词结果与标注比较,得到标注序列。 ``` python import jieba def cut_sentence(sentence): return [word for word in jieba.cut(sentence)] def get_labels(sentence, labels): words = cut_sentence(sentence) return [labels[word] for word in words] with open('train_data.txt', 'r') as f: train_data = f.readlines() train_sentences = [] train_labels = [] labels = {} for sentence in train_data: sentence = sentence.strip() words = sentence.split(' ') train_sentences.append(cut_sentence(sentence)) for word in words: if '/n' in word: word, label = word[:-2], word[-2:] labels[word] = label train_labels.append(get_labels(sentence, labels)) ``` 得到训练数据后,可以使用sklearn-crfsuite包来训练CRF模型。 ``` python from sklearn_crfsuite import CRF model = CRF() model.fit(train_sentences, train_labels) ``` 训练完成后,可以使用训练好的模型进行分词。 ``` python test_sentence = '我爱北京天安门' test_sentence_words = cut_sentence(test_sentence) test_features = [[{'word': word}] for word in test_sentence_words] test_labels = model.predict(test_features) results = [] for i in range(len(test_sentence_words)): result = test_sentence_words[i] + '/' + test_labels[0][i] results.append(result) print(' '.join(results)) ``` 输出结果为: ``` 我/r 爱/v 北京/ns 天安门/ns ``` 其中,`/r`表示“代词”,`/v`表示“动词”,`/ns`表示“地名”。这个分词结果和标注完全一致。 这是一个简单的中文分词模型训练示例,实际应用中还需要进行更多的优化和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值