【深度学习】NLP相关工具及其使用

Posted by ShawnD on October 13, 2020

jieba

lcut

jieba.cut生成的是一个生成器,generator,也就是可以通过for循环来取里面的每一个词。

1
word_list= [word for word in jieba.cut(text)]

jieba.lcut 直接生成的就是一个list

1
2
3
4
text = "深度学习(英语: deep learning)是机器学习的分支, 是一种以人工神经网络为架构, 对数据进行表征学习的算法。"

cuted = jieba.lcut(text)
print(cuted)
1
2
3
4
5
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.474 seconds.
Prefix dict has been built successfully.
['深度', '学习', '(', '英语', ':', ' ', 'deep', ' ', 'learning', ')', '是', '机器', '学习', '的', '分支', ',', ' ', '是', '一种', '以', '人工神经网络', '为', '架构', ',', ' ', '对', '数据', '进行', '表征', '学习', '的', '算法', '。']

posseg

词性(词类)是词汇中剧本的语法属性,而词性标注是在给定句子中判定每个词的语法范畴,确定它的词性并加以标注的过程。

比如给定句子“她很漂亮”,对应的词性标注结果就是“她/名词 很/副词 漂亮/形容词”,这就是一个简单的词性标注的例子。

1
2
3
4
5
6
7
8
9
10
11
import jieba.posseg as pseg
words = pseg.cut("在武汉市到苏州社保后可以补缴")
# type(words) = <class 'generator'>
>>> [w for w in words]
>[pair('在', 'p'), pair('武汉市', 'ns'), pair('到', 'v'), pair('苏州', 'ns'), pair('社保', 'j'), pair('后', 'f'), pair('可以', 'c'), pair('补缴', 'v')]

>>> [w.flag for w in words]
>['p', 'ns', 'v', 'ns', 'j', 'f', 'c', 'v']

>>> [w.word for w in words]
>['在', '武汉市', '到', '苏州', '社保', '后', '可以', '补缴']

kashgari

hanziconv

繁体中文转换(官方hanziconv) 可以转换夹杂其他字符如数字

1
2
3
4
5
6
7
8
9
10
from hanziconv import HanziConv

line_jian = '<>123asdasd把中文字符串进行繁体和简體间的转换'
line_fan = '<>123asdasd把中文字符串進行繁體和簡体间的轉換'
jian = HanziConv.toSimplified(line_fan)				#繁转简
fan = HanziConv.toTraditional(line_jian)			#简转繁
resu = HanziConv.same(line_jian, line_fan)			#比较繁简体文字是否相同
print(jian)
print(fan)
print(resu)

输出结果:

1
2
3
4
<>123asdasd把中文字符串进行繁体和简体间的转换
<>123asdasd把中文字符串進行繁體和簡體間的轉換
True

segtok

segtok包提供两个模块, segtok.segmenter 和 segtok.tokenizer 。

分段器提供将(印欧语)文本拆分为句子的功能。

标记赋予器提供了将(印欧语系)句子拆分为单词和符号(统称为 标记 )的功能。

这两个模块也可以从命令行使用。 虽然其他印欧语系的语言也可以使用,但它的设计只考虑了西班牙语、英语和德语等语言。

re

正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’\t’,等价于 ‘\t’)匹配相应的特殊字符。

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符, 除了换行符, 当re.DOTALL标记被指定时, 则可以匹配包括换行符的任意字符
re? 匹配0个或1个由前面正则表达式定义的片段, 非贪婪方式

re?

1
2
3
s = "<lalaala/> test <ttttt />"
text = re.sub("<.*?>", " ", s, flags=re.S)
print(text)

返回:

1
  test  
1
2
3
s = "<lalaala/> test <ttttt />"
text = re.sub("<.*>", " ", s, flags=re.S)
print(text)

返回

1
      

非贪婪模式就是碰到一个合适的就替换了, 不会等到最后。

sub

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

1
re.sub(pattern, repl, string, count=0, flags=0)
  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags: 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

可选flags:

  • re.I: 使匹配对大小写不敏感
  • re.L: 做本地化识别(locale-aware)匹配
  • re.M: 多行匹配,影响 ^ 和 $
  • re.S: 使 . 匹配包括换行在内的所有字符
  • re.U: 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
  • re.X: 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

pickle

dump

1
2
3
4
5
6
7
8
9
10
11
12
13
    ws = Word2Sequence()
    data_path = "./datasets/aclImdb/train"
    temp_data_path = [os.path.join(data_path, "pos"), os.path.join(data_path, "neg")]
    for data_path in temp_data_path:
        file_paths = [os.path.join(data_path, file_name) for  file_name in os.listdir(data_path) if file_name.endswith("txt")]
        for file_path in tqdm(file_paths):
            sentence = tokenize(open(file_path).read())
            ws.fit(sentence)
			
	ws.build_vocab(min=10, max_features=20000)
    print(ws.dict)
    pickle.dump(ws, open("./saved_models/ws.pkl", "wb"))
    print(len(ws))

load

加载pickle时, 需要先将保存的类import

如:

1
2
3
4
5
import pickle
from word_sequence import Word2Sequence

ws = pickle.load(open("./saved_models/ws.pkl", "rb"))
print(ws.dict)

任何文件引入这个ws, 都需要先引入Word2Sequence

FastText

pysparnn

Spacy

模板代码

解析json文件为txt(以LCCD数据集为例)

1
2
3
4
5
6
7
8
9
10
11
12
import json

with open("data/LCCD.json", 'rb') as f:
    data = json.load(f)

with open("data/LCCD.txt", "w", encoding="utf-8") as f:
    for dialogue_index, dialogues in enumerate(tqdm(data)):
        for dialogue in dialogues:
            f.write(dialogue.replace(' ', '') + '\r\n')
        # 最后一条记录不添加换行符
        if dialogue_index < len(data) - 1:
            f.write("\r\n")

References

  1. Python中汉字繁简体互转
  2. fastText
  3. jieba.cut 和jieba.posseg
  4. Python 程序报错: No module named transformers.modeling_gpt2