NLP入门——数据预处理:分词

使用Moses进行英文分词

Moses clone

clone到本地后,在/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl中规定了标点符号规范化规则,使用 /mosesdecoder/scripts/tokenizer/tokenizer.perl进行分词。

首先将添加环境变量:export moses_scripts="~/nlp/git/mosesdecoder/scripts"

添加后输入echo,打印出环境变量的路径。

csharp 复制代码
:~/nlp/git/mosesdecoder/scripts$ echo $moses_scripts
~/nlp/git/mosesdecoder/scripts

在终端执行:

csharp 复制代码
:~/nlp/token$ echo "My name is loopy." | perl ~/nlp/git/mosesdecoder/scripts/tokenizer/tokenizer.perl -a -l en -no-escape
Tokenizer Version 1.1
Language: en
Number of threads: 1
My name is loopy .

显示分词处理后的内容。
| 为管道命令,command1 | command2 | command3 将前一个文件的输出给下一个文件的输入
-a表示aggressive,决定是否为激进的切分,切分的尽可能小。

csharp 复制代码
:~/nlp/token$ echo "My name is-loopy." | perl ~/nlp/git/mosesdecoder/scripts/tokenizer/tokenizer.perl -a -l en -no-escape 
My name is @-@ loopy .
:~/nlp/token$ echo "My name is-loopy." | perl ~/nlp/git/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en -no-escape 
My name is-loopy .

其中-a切分,@-@表示"-"和前后两tokens相连;而不带-a的切分则不会将"-"切分为token
-l后跟语言,en表示英文
-no-escape:用于禁止 Moses 在输出翻译结果时对特殊字符进行转义

csharp 复制代码
:~/nlp/token$ echo "My name is loopy &." | perl ~/nlp/git/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en
My name is loopy & .
:~/nlp/token$ echo "My name is loopy &." | perl ~/nlp/git/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en -no-escape
My name is loopy & .

如果预处理的内容做得足够好,那么应该使用-no-escape来保留完整的文本。

可以将分词后的内容输入到文件里,而不是直接输出到终端:

csharp 复制代码
:~/nlp/token$ echo "My name is loopy." | perl ~/nlp/git/mosesdecoder/scripts/tokenizer/tokenizer.perl -a -l en -no-escape > tmp.txt
Tokenizer Version 1.1
Language: en
Number of threads: 1
:~/nlp/token$ cat tmp.txt 
My name is loopy .

将预处理后的英文文本规范化标点后分词

csharp 复制代码
:~/nlp/token$ perl ~/nlp/git/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l en < uni.en | perl ~/nlp/git/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en -no-escape > en.tok &

使用&将程序可以放到后台执行,执行结束后看到分词后的en.tok文件:

对分词后的文本处理大小写问题

在英文文本中,句首词首字母需要大写,但句首词The和句中的the是同一个单词,我们需要把句首词的大写转成小写。但却不能粗暴地将所有大写转为小写(因为一些专有名词仍然需要大写)。因此需要训练一个模型判断后修改。

使用/mosesdecoder/scripts/recaser/train-recaser.perl进行模型的训练。

python 复制代码
:~/nlp/token$ perl ~/nlp/git/mosesdecoder/scripts/recaser/train-recaser.perl --model truecaser.en --corpus en.tok 

--model后的参数是训练好的模型的输出路径,--corpus后是传入的数据。

python 复制代码
:~/nlp/token$ perl ~/nlp/git/mosesdecoder/scripts/recaser/truecase.perl --model truecase.en < en.tok > en.tc 

利用训练好的模型进行大小写转换。转换后的文本输入到en.tc中,如下图:

可以看到,首字母大写已经被转化为小写。

使用jieba进行中文分词

首先安装jieba:pip install jieba github jieba

python 复制代码
#seg.py
#encoding: utf-8

import sys
from jieba import cut
def handle(srcf, rsf):

    ens = "\n".encode("utf-8")
    with open(srcf,"rb") as frd,  open(rsf,"wb") as fwrt:
        for line in frd:
            tmp = line.strip()#除去每行首尾换行符、空格、制表符
            if tmp:
                fwrt.write(" ".join(cut(tmp.decode("utf-8"))).encode("utf-8"))#cut方法调用后,转化成list即可以看到每行分词后的结果,即将每行转化为分词,每个分词均是字符串类型,使用空格隔开转化为字符串
                fwrt.write(ens)#行末添加换行符

if __name__=="__main__":
    handle(*sys.argv[1:])

str.join(iterable)中,可迭代对象中的元素必须是字符串类型,否则TypeError。

执行seg.py文件,对预处理后的中文文本进行分词

python 复制代码
:~/nlp/token$ python seg.py uni.zh zh.tok 
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.283 seconds.
Prefix dict has been built successfully.

执行结束后看到分词后的zh.tok文件:

利用OpenCC进行繁简体转换

python 复制代码
# t2s.py
#encoding: utf-8

import sys
import opencc

def t2s(srcf, rsf):

    ens = "\n".encode("utf-8")
    with open(srcf,"rb") as frd,  open(rsf,"wb") as fwrt:
        for line in frd:
            tmp = line.strip()#除去每行首尾换行符、空格、制表符
            if tmp:
                converter = opencc.OpenCC('t2s.json')
                tmp = converter.convert(tmp.decode("utf-8")) 
                fwrt.write(tmp.encode("utf-8"))
                fwrt.write(ens)
                
if __name__=="__main__":
    t2s(*sys.argv[1:])

有t2s.json和s2t.json文件,t即为traditional繁体,s为simple简体。

执行python t2s.py zh.tok t2s.tok即可将所有繁体转化为简体。

相关推荐
潘正翔9 分钟前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发
通问AI16 分钟前
Apple Intelligence 国行备案深度技术解析:阿里千问如何被集成到苹果端侧AI架构
人工智能·架构
视***间25 分钟前
算力赋能零售与创意新生态:视程空间Pandora,解锁线下场景智能化无限可能
人工智能·边缘计算·智慧零售·ai算力·视程空间·创意开发
冬奇Lab37 分钟前
MCP 系列(08):企业治理——Registry、路由与可观测性
人工智能·llm·mcp
weigangwin42 分钟前
agent-workspace-linux 不是远程桌面:Linux AI 工作区的隔离边界验收
linux·xvfb·mcp·桌面隔离·权限边界·bubblewrap·agent-workspace
冬奇Lab43 分钟前
每日一个开源项目(第161篇):Open Interpreter - 开源 AI 编程 Agent,用 Rust 重写,支持 Kimi、Qwen、DeepSeek
人工智能·开源·资讯
renhongxia11 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
天上路人1 小时前
AU-48双麦多功能语音处理模组:100dB AEC + 波束定向拾音,会议与监控全场景覆盖
人工智能·ai降噪·语音处理·ai语音·麦克风·回音消除
甲维斯1 小时前
Codex定制皮肤,Windows一键切换已经搞定!
人工智能
Python+991 小时前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python