正则表达式很常用,但是规则也很复杂,每次用的时候查资料即可。我这里只是总结一下常用的正则表达式。

字符串过滤

我们常常需要根据正则表达式,来对字符串进行过滤。例如仅保留汉字、数字、字母等。用法如下例所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# coding = utf-8
import re

num = 'a¥1aB23Cqqq$我.04'
print("原字符串: ", num)
# 字符串只保留中文
num1 = re.sub(u"([^\u4e00-\u9fa5])", "", num)
print("字符串只保留中文: ", num1)
# 字符串只保留英文
num2 = re.sub(u"([^\u0041-\u005a\u0061-\u007a])", "", num)
print("字符串只保留英文: ", num2)
# 字符串只保留数字
num3 = re.sub(u"([^\u0030-\u0039])", "", num)
print("字符串只保留数字: ", num3)
num4 = re.sub("\D", "", num)
print("字符串只保留数字: ", num4)
# 字符串保留数字.和¥
num5 = re.sub(u"([^\u0030-\u0039\u002e\uffe5])", "", num)
print("字符串保留数字.和¥: ", num5)
# 字符串只保留英文和数字
num6 = re.sub(u"([^\u0041-\u005a\u0061-\u007a\u0030-\u0039])", "", num)
print("字符串只保留英文和数字: ", num6)

s = "ABC今天下雨了,abs不开心123!。??"
# 字符串只保留中文、字母、数字。
num7 = re.sub(u"([^\u4e00-\u9fa5\u0041-\u005a\u0061-\u007a\u0030-\u0039])", "", s)
print('字符串只保留汉字、英文和数字: ', num7)

输出结果如下所示:

阅读全文 »

事先声明,此文章大部分内容来源于Linux shell 命令中nohup 、&、重定向的使用。不理解的地方我会添加个人见解。

nohup 和 & 使用方法

nohup (不挂断)

nohup 是 no hung up 的缩写,意思是不挂断 。

使用 Xshell 等 Linux 客户端工具,远程执行 Linux 脚本时,有时候会由于网络问题,导致客户端失去连接,终端断开,脚本运行一半就意外结束了。这种时候,就可以用nohup 指令来运行指令,即使客户端与服务端断开,服务端的脚本仍可继续运行。

nohup 语法格式:

阅读全文 »

注意以下内容,主要参考了linux的top命令参数详解

简介

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。 比较准确的说,top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU使用。内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。

参数含义

阅读全文 »

本文主要来源于Expressive TTS(01)

Expressive TTS是目前语音合成领域中比较活跃的方向,它和单纯TTS的区别是,它更关注合成声音的风格(例如新闻播报,讲故事,解说)、情感(例如生气,兴奋,悲伤)、韵律(例如重读,强调、语调)等等。自从深度学习技术大放异彩后,语音合成模型在合成声音的自然度方面有了极大的提高(例如Tacotron,Tacotron2,WaveNet),跳词复读的问题也在最近得到了解决(例如DurIAN,FastSpeech),而深度学习不仅可以让语音的自然度得到大幅度的提升,对一些难以显式建模的特征上也有很强大的学习能力,因此,让语音合成能更加具有expressive成为了一个研究热点。

第一篇:Uncovering Latent Style Factors for Expressive Speech Synthesis(2017)

https://arxiv.org/abs/1711.00520

这一篇是 google 的王宇轩大佬早在 2017 年上传到 arxiv 上的一篇文章,也是表现力语音合成领域可追溯到的比较早的一篇文章。

阅读全文 »

本篇介绍几个经典的语音合成模型。

什么是语音合成

语音合成是通过文字人工生成人类声音, 也可以说语音生成是给定一段文字去生成对应的人类读音。 这里声音是一个连续的模拟的信号。而合成过程是通过计算机, 数字信号去模拟。 这里就需要数字信号处理模拟信号信息,详细内容可参考 [1]。

img

Fig. 1 an example of voice signal.

阅读全文 »

开新坑了,最近在攻击语音合成系统,现在学习一下语音基础知识。

辅音和元音的区别

  • 辅音发音时,气流在通过咽头、口腔的过程中, 要受到某部位的阻碍;元音发音时,气流在咽头、 口腔不受阻碍。这是元音和辅音最主要的区别。
  • 辅音发音时,发音器官成阻的部位特别紧张; 元音发音时发音器官各部位保持均衡的紧张状态。
  • 辅音发音时,气流较强;元音发音时,气流较 弱。
  • 辅音发音时,声带不一定振动,声音一般不响亮;元音发音时,声带振动,声音比辅音响亮。

一般只有元音(一些介于元音辅音中间分类不明的音暂不讨论)才会有共振峰,而元音的音质由声道的形状决定,而声道的形状又通过发音的动作来塑造(articulatory+movements)。

清音和浊音

阅读全文 »

最近终于搞懂了transformer和原理和实现,可以看bert了。事先声明,本文的大部分内容来自BERT模型详解。大佬写的太好了,本来不想复制粘贴的,但是有部分内容看不明白,必须加点笔记。

背景简介

2018年深度学习在NLP领域取得了比较大的突破,最大的新闻当属Google的BERT模型横扫各大比赛的排行榜。作者认为,深度学习在NLP领域比较重点的三大突破为:Word Embedding、RNN/LSTM/GRU+Seq2Seq+Attention+Self-Attention机制和Contextual Word Embedding(Universal Sentence Embedding)。

Word Embedding解决了传统机器学习方法的特征稀疏问题,它通过把一个词映射到一个低维稠密的语义空间,从而使得相似的词可以共享上下文信息,从而提升泛化能力。而且通过无监督的训练可以获得高质量的词向量(比如Word2vec和Glove等方法),从而把这些语义知识迁移到数据较少的具体任务上。但是Word Embedding学到的是一个词的所有语义,比如bank可以是”银行”也可以是”水边。如果一定要用一个固定的向量来编码其语义,那么我们只能把这两个词的语义都编码进去,但是实际一个句子中只有一个语义是合理的,这显然是有问题的。

这时我们可以通过RNN/LSTM/GRU来编码上下文的语义,这样它能学到如果周围是money,那么bank更可能是”银行”的语义。最原始的RNN由于梯度消失和梯度爆炸等问题很难训练,后来引入了LSTM和GRU等模型来解决这个问题。最早的RNN只能用于分类、回归和序列标注等任务,通过引入两个RNN构成的Seq2Seq模型可以解决序列的变换问题。比如机器翻译、摘要、问答和对话系统都可以使用这个模型。尤其机器翻译这个任务的训练数据比较大,使用深度学习的方法的效果已经超过传统的机器学习方法,而且模型结构更加简单。到了2017年,Google提出了Transformer模型,引入了Self-Attention。Self-Attention的初衷是为了用Attention替代LSTM,从而可以更好的并行(因为LSTM的时序依赖特效很难并行),从而可以处理更大规模的语料。Transformer出来之后被广泛的用于以前被RNN/LSTM/GRU霸占的地盘,Google更是在Transformer的论文里使用”Attention is all you need”这样霸气的标题。现在Transformer已经成为Encoder/Decoder的霸主。

阅读全文 »

前面我们详细的介绍了Transformer的原理,但是有的细节还是一头雾水,所以我们接下来介绍一下Transformer的实现,主要参考了文章The Annotated Transformergithub地址

本文的代码部分来自于github,而图来源于The Annotated Transformer

Prelims

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
from os.path import exists
import torch
import torch.nn as nn
from torch.nn.functional import log_softmax, pad
import math
import copy
import time
from torch.optim.lr_scheduler import LambdaLR
import pandas as pd
import altair as alt
from torchtext.data.functional import to_map_style_dataset
from torch.utils.data import DataLoader
from torchtext.vocab import build_vocab_from_iterator
import torchtext.datasets as datasets
import spacy
import GPUtil

from torch.utils.data.distributed import DistributedSampler
import torch.distributed as dist
import torch.multiprocessing as mp
from torch.nn.parallel import DistributedDataParallel as DDP

# Set to False to skip notebook execution (e.g. for debugging)
RUN_EXAMPLES = True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Some convenience helper functions used throughout the notebook


def is_interactive_notebook():
return __name__ == "__main__"

def show_example(fn, args=[]):
if __name__ == "__main__" and RUN_EXAMPLES:
return fn(*args)

def execute_example(fn, args=[]):
if __name__ == "__main__" and RUN_EXAMPLES:
fn(*args)

class DummyOptimizer(torch.optim.Optimizer):
def __init__(self):
self.param_groups = [{"lr": 0}]
None

def step(self):
None

def zero_grad(self, set_to_none=False):
None

class DummyScheduler:
def step(self):
None
阅读全文 »

最近需要用到fairseq框架中的翻译任务,这里记录一下。

从实战开始

首先下载翻译模型:

1
2
3
4
5
6
mkdir -p model
cd model
wget https://dl.fbaipublicfiles.com/fairseq/models/wmt16.en-de.joined-dict.transformer.tar.bz2

bunzip2 wmt16.en-de.joined-dict.transformer.tar.bz2
tar -xvf wmt16.en-de.joined-dict.transformer.tar

解压后的文件如下:

阅读全文 »

之前没有接触过NLP,所以不太理解里面的基本名词。所以这里学习一些NLP的基本概念。事先声明,以下大部分内容来源于第1章-自然语言处理基础概念和easyai的《非技术也能看懂的NLP入门科普》。不理解的地方我会加上自己的批注。

自然语言

自然语言是指汉语、英语、法语等人们日常使用的语言,是自然而然的随着人类社会发展演变而来的语言,区别于如程序设计的语言的人工语言。

语音和文字是构成语言的两个基本属性,语音是语言的物质外壳,文字则是记录语言的书写符号系统。

自然语言与编程语言的对比

阅读全文 »