目录
0、介绍
知识点
1、正则表达式
基本的正则表达式的语法
re 模块
综合训练
2、分词
分词的⽅法
中文分词工具
3、词性标注
词性标注的方法
NLTK在词性标注的应用
4、词干提取与词形还原
词干提取与词形还原的相似点
词干提取与词形还原不同似点
NLTK在词⼲提取的应用
三步走实现词性还原
5、命名实体识别
命名实体识别(NER) 的方法
命名实体识别的常见工具
NLTK在命名实体识别的应用
6、文本的数据增强
常见的数据增广方法
nlpcda在中文数据增强的应用
7、实验总结
事情无论巨细,往往存在一个准备阶段。比如做饭炒菜,需要择菜、洗菜、切菜、热锅等准备工作;出远门需要整理好身份证、手机、钱包等随身物品。类似地,在处理文本的任务中,也存在预处理这么一个重要阶段,包括诸如统一数据格式、去噪、词形还原、分词之类的基本操作,以及语义分析、关键词提取、对于数据不平衡的处理等更进一步的精细处理。
假设有一天,你的上司给你几百个 txt 文本,并且布置了一个任务,找出文本中所有出现的身份证号以及电话号码,并且要求在一个小时内完成。这时候该怎么办呢?总不可能肉眼一个个地去找吧,太费时了!在这里,正则表达式就派上用场了。学会了正则表达式,你就能在 20 分钟内完成此任务。
正则表达式,又称规则表达式,英语称为 Regular Expression,通常被用来检索、替换那些符合某个模式(规则)的文本,例如在以上任务中匹配身份证号或者电话号码,是在文本预处理过程中常用的技术。
那么,正则表达式怎么写呢?在这之前,让我们首先来熟悉一些基本的正则表达式的语法:
.
: 能够匹配除换行符 \n 以外的任意单个字符。\w
:与单个字母数字字符匹配。\W
:与单个非字母数字字符匹配。\d
:与单个数字匹配。\D
:与单个非数字匹配。\s
:与单个空格字符(空格,换行符,返回符,制表符,表格)匹配。\S
:与任何非空格字符匹配。\t
:匹配单个 tab 符。\n
:匹配单个换行符。\r
:匹配单个回车符。^
和$
:分别匹配字符串的开头或结尾。[..]
:匹配方括号中..表达的字符。[^..]
:匹配方括号中..表达以外的任何字符。{m,n}
:匹配前一个字符的出现次数在 m 至 n 次之间。a|b
:匹配 a 或 b。?
:匹配前一个字符出现次数 0 或 1。+
:模式前一个字符出现 1 次或多次。*
:模式前一个字符出现 0 次或多次。\
:转义字符,通常用于将一些被占用成为正则表达的符号还原为原来的意思,比如 \+ 表示加号。()
:被括起来的表达式部分将作为分组,并返回相匹配的文本。(只返回括号内的内容)
如果是第一次接触正则表达式的朋友,可能会觉得这些语法有些难记有些抽像,并且难以理解,这是正常现象,不必担心。事实上,我们通过一些代码示例及练习,便可以快速地在实践中学会灵活使用正则表达式。而在 Python 中,通过内嵌集成 re 模块,我们可以直接调用从而快速实现正则匹配,re 中常用的功能有:
re.match()
:从字符串中的首字符开始匹配相应的模式串。re.search()
:从字符串中的任意位置都可以匹配相应的模式串,只要找到第一个匹配即返回,如果字符串没有匹配,则返回 None 。re.findall()
:从字符串中的任意位置都可以匹配相应的模式串,找到所有匹配情况后返回,如果字符串没有匹配,则返回 None 。re.sub()
:从字符串中的任意位置都可以匹配相应的模式串,找到所有匹配情况后替换成希望的表达形式,返回替换后的字符串。注:这里的“模式串”,英文称为 pattern,指的便是使用正则语法所构成的一种表达式。
接下来分别就 re.match()
,re.search()
,re.findall()
做一些简单的代码演示,同学们可以观察结果,深入理解这三者的区别。
import re
# r'自然语言'指模式串,'自然语言处理'指要被匹配的字符串
# 注:模式串前加 r 是为了防止字符转义
result = re.match(r'自然语言', '自然语言处理')
print(result) # 匹配成功返回一个匹配的对象,否则返回None
# 输出:
基于不同函数获取结果的不同部分:
print('Matching string :', result.group()) # 获取被匹配到的部分
print('Starting position of the match :', result.start()) # 获取被匹配到的部分初始位置
print('Ending position of the match :', result.end()) # 获取被匹配到的部分结束位置
# Matching string : 自然语言
# Starting position of the match : 0
# Ending position of the match : 4
result = re.match(r'语言', '自然语言处理') # 注意 match 需要从首字符开始匹配
print(result) # 匹配成功返回一个匹配的对象,否则返回 None
# None
# 搜寻字符串中任意位置都可能匹配的模式串,找到首个即返回
result = re.search(r'语言', '自然语言处理自然语言')
print(result) # 匹配成功返回一个匹配的对象,否则返回 None
print('Matching string :', result.group()) # 获取被匹配到的部分
#
# Matching string : 语言
# 搜寻字符串中任意位置都可能匹配的模式串,遍历匹配,可以获取字符串中所有匹配的字符串,
result = re.findall(r'语言', '自然语言处理自然语言')
print(result) # 返回一个列表
# ['语言', '语言']
在这里总结一下 re.match()
, re.search()
以及 re.findall()
之间的区别:
re.match()
只从字符串的开始位置进行匹配,如果字符串不符合正则表达式,则匹配失败,函数返回 Nonere.search()
匹配整个字符串,从任意位置都可以开始匹配,直到找到一个匹配即返回re.findall()
则会找到所有匹配结果并返回。
如果想替换字符串中的符合某些模式的地方,可以使用 re.sub()
:
# r'自然语言'指模式串,'language'指替换内容,'自然语言处理'指要被匹配的字符串
result = re.sub(r'语言', 'language', '自然语言处理语言')
print(result)
# 自然language处理language
通过以上简单的例子,我们熟悉了 re 模块中一些常用函数的功能,接下来增加难度,尝试用更复杂的正则表达式语法规则来解决一些实际问题。
题目:抽取一段英文中的首个单词。
# 使用了模式串 r'^\w+',这是因为 ^ 表示字符串的开始部分,而 \w+ 可以表示多个连续的字母。
result = re.findall(r'^\w+', 'Whatever is worth doing is worth doing well.')
print(result)
# ['Whatever']
题目:返回邮箱地址中的域名。
# r'@\w+\.(\w+)' 中最后的 \w+ 左右加了括号,因此只会返回括号中匹配的部分
# . 能够匹配除换行符 \n 以外的任意单个字符,这里需要匹配原本的 . 所以加上转义字符变为 \.
result = re.findall(
r'@\w+\.(\w+)', '[email protected], [email protected], [email protected], [email protected]')
print(result)
# ['com', 'in', 'com', 'biz']
题目:返回字符串中固定格式的日期,如 11-09-2020。
# \d{2}表示两个数字,同理得表达式为 r'\d{2}-\d{2}-\d{4}'
result = re.findall(
r'\d{2}-\d{2}-\d{4}', 'Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009')
print(result)
# ['12-05-2007', '11-11-2011', '12-01-2009']
题目:只保留字符串中的中文字符。
方法:将非中文字符替换掉
# 中文的Unicode范围为 \u4e00-\u9fa5,前面加 ^ 表示非汉字
# 注意 ^ 放在[]中才表示“非”的意义,而放在外面则表示“初始位置”的意义
result = re.sub(r'[^\u4e00-\u9fa5]', '', 'language自然!!·~语言##处理;’;')
print(result)
# 自然语言处理
题目:验证是否为身份证号码。
注:身份证号可能为 15 或 18 位,15 位全为数字,18 位中前 17 位为数字,最后一位为 X 或者 x。
# r'(^\d{15}$)|(^\d{18}$)|(^\d{17}(X|x)$)' 中三个大括号中的表达式分别对应以上三种情况
# 一头一尾的 ^ 以及 $ 表明匹配的范围是字符串的起止范围
result = re.match(
r'(^\d{15}$)|(^\d{18}$)|(^\d{17}(X|x)$)', '94023856739300998X')
print(result)
#
经过了以上例子的学习,同学们是不是对正则表达式多了一些理解了呢。大家在学习正则表达式的时候,一定要多加练习,多实践,多跑跑代码,效果比单纯地记忆各种正则表达式语法好多了。
分词是自然语言处理中的重要步骤,也就是将句⼦、段落、⽂章这种⻓⽂本,分解为以词为基本单位的数据结构,⽅便后续的处理分析⼯作。为什么要分词呢?这是因为词是表达完整含义的最⼩单位,将文本进行分词后,可以做更细化的文本表征(例如词袋模型、词向量等方式)以及更多的预处理操作(如提取关键词、获取主题)。
那为啥不分字或者以句子为单位呢?一方面,字的粒度太⼩,⽆法表达完整含义,⽐如”⿏“可以是”⽼⿏“,也可以是”⿏标“。 另一方面,句⼦的粒度太⼤,承载的信息量多,很难复⽤。所以一般用粒度适中的词作为切分单位。
当然,在有些情况下,分字也可能是更好的选择,比如,处理的文本是古文,这是因为古文中大多以字为词。另外,分字不容易遇到未登录字(专业术语,其实就是“生词”的意思)的问题,而分词容易遇到未登录词的问题。这是因为中文中的字的数量远远小于词的数量,因此很容易在训练文本中覆盖大部分的测试文本中的字。而有的时候,我们也会对粒度进行扩张,比如有些固定短语或者专业术语经常搭配出现(神经网络,支持向量机),也会被当作切分的单位。因此,我们需要根据具体情况进行切分分析。
英⽂有天然的空格作为分隔符,但是中⽂没有。所以如何切分中文是⼀个难点,再加上中⽂⾥⼀词多义的情况⾮常多,导致很容易出现歧义,可以简单地概括为以下三大难点:
⼤致可分为三类:
基于词典的匹配分词⽅式:
基于统计的分词⽅法:
基于深度学习:
常⻅的分词器都是使⽤机器学习算法和词典相结合的方法,⼀⽅⾯能够提⾼分词准确率,另⼀⽅⾯能够改善领域适应性。
注:对于如何把分词问题转化为序列标注问题,这里有些朋友可能会觉得疑惑。实际上我们可以这样来做: 分别用 B、M、E 来表示某词的头、中、尾三部分,并且 S 代表单字成词。以句子 “王先生就职于武汉大学”为例,以每个字为单位对其进行序列标注,便是 “BMEBESBMME”,再根据词的头、中、尾规则进行切分成词,便是 “BME/BE/S/BMME”,如此一来,便可以对应到分词结果 “王先生/就职 /于/武汉大学”。
根据 GitHub 上的 star 数排名的中文分词工具:
- Hanlp
- Stanford 分词
- ansj 分词器
- 哈⼯⼤ LTP
- KCWS分词器
- jieba
- 清华⼤学THULAC
- ICTCLAS
在实际应用中,一般情况下,我们只需要调包进行分词就可以了,几行代码就能搞定分词。接下来以 jieba 为例,我们来实现中文的分词。
全模式,也就是会把所有可能的分词结果都展示出来:
import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))
# Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
精确模式,只取一种最有可能的切分方式:
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))
# Default Mode: 我/ 来到/ 北京/ 清华大学
搜索引擎模式,在精确模式的基础上,对长词再次划分:
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")
print(", ".join(seg_list))
# 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
当然,简单的调包有时候在下游任务中并不完全适用,比如难以正确地切分一些专业词汇、领域词汇或者新出现的词汇,可以通过在 jieba 中添加新词的方式进行解决。如何应用呢?首先,我们要新建一个词典文件,如 new_word.txt
,其中的内容规则如下:
例如:
创新办 3 i
云计算 5
凱特琳 3 nz
台中
最后,通过 jieba.load_userdict(file_path)
就能加载新的词典,其中 file_path
表示词典文件的路径,我们可以对比新词载入前后的效果。
# 示例:
seg_list = jieba.cut("胡小胖是创新办主任,也是云计算方面的专家。", cut_all=False)
print("Before: " + "/ ".join(seg_list))
!wget -nc "https://labfile.oss.aliyuncs.com/courses/3205/new_word.txt"
jieba.load_userdict("new_word.txt")
seg_list = jieba.cut("胡小胖是创新办主任,也是云计算方面的专家。", cut_all=False)
print("After: " + "/ ".join(seg_list))
# Before: 胡小胖/ 是/ 创新/ 办/ 主任/ ,/ 也/ 是/ 云/ 计算/ 方面/ 的/ 专家/ 。
# After: 胡小胖/ 是/ 创新办/ 主任/ ,/ 也/ 是/ 云计算/ 方面/ 的/ 专家/ 。
另外需要注意的是,如果新词数较少,通过创建、导入词典的文件过于复杂,或者定义了词典,又想做一些改动。在这些情况下,可以通过在代码中使用 add_word(word, freq=None, tag=None)
和 del_word(word)
,在程序中动态修改词典:
add_word(word, freq=None, tag=None)
:添加新词。del_word(word)
:去除某个词。
# 在程序中动态地去除新词“创新办”
jieba.del_word("创新办")
seg_list = jieba.cut("胡小胖是创新办主任,也是云计算方面的专家。", cut_all=False)
print("After: " + "/ ".join(seg_list))
# After: 胡小胖/ 是/ 创新/ 办/ 主任/ ,/ 也/ 是/ 云计算/ 方面/ 的/ 专家/ 。
首先观察这样两个文本:
其中的助词 “啊” 存不存在对于语义并无太大影响,而“跑步”好像是句子中非常关键的单词。
通过以上例子可知,一般而言,文本里的动词可能比较重要,而助词可能不太重要,那么这个时候可以先对词汇进行词性标注(即在文本中判定每个词的语法范畴,确定其词性并加以标注的过程,这也是⾃然语⾔处理中⼀项⾮常重要的基础性⼯作),再基于词性提取关键词。因此,词性标注为文本处理提供了相当关键的信息。
特别地,中文是⼀种缺乏词形态变化的语⾔,词的类别不能像印欧语那样,直接从词的形态变化上来判别。在中文中,常⽤词兼类(某一词具备多种词性)现象严重,比如:
其中 “领导” 在不同的语境下分别为 “名词” 以及 “动词”,因此 “领导” 便是一个 “兼类词”。常⽤词中兼类词所占的⽐例⾼达 22.5%,⽽且越是常⽤的词,不同的⽤法越多。由于兼类使⽤程度⾼,兼类现象涉及汉语中⼤部分词类,因⽽造成在汉语⽂本中词类歧义排除的任务量巨⼤。
可大致分为四类:
同分词一样,词性标注也属于于自然语言处理中较底层、技术较为成熟的基础任务,应用现成的工具可以轻松实现,以下是一些常见的具备词性标注功能的工具:
- jieba
- SnowNLP
- THULAC
- StanfordCoreNLP
- HanLP
- NLTK
- SpaCy
接下来以 jieba 为例,我们来实现中文的词性标注。
import jieba.posseg
# jieba.posseg.cut()能够同时实现分词并词性标注
sentence_taged = jieba.posseg.cut("胡小胖是创新办主任,也是云计算方面的专家。")
for i in sentence_taged:
print(i.word, i.flag) # flag 即表示词性
接下来以 NLTK 为例,我们来实现英文的词性标注。
我们使用 NLTK 对英文文本进行处理时,首先需要下载 NLTK 拓展包,你可以使用 nltk.download()
来选择性下载所需拓展包或者直接使用 python -m nltk.downloader all
下载全部数据拓展包。
由于访问境外网络较慢,所以这里从蓝桥云课服务器下载相应数据扩展包。
!wget -nc "https://labfile.oss.aliyuncs.com/courses/3205/nltk_data.zip" !unzip -o "nltk_data.zip" -d /root/
本地使用时,你可以执行:
import nltk
nltk.download('punkt') # 下载英文分词所需拓展包
nltk.download('averaged_perceptron_tagger')
nltk.download('maxent_ne_chunker')
nltk.download('words')
import nltk
# 注意,nltk.word_tokenize()是对英文的分词,nltk.pos_tag()为词性标注
sentence_taged = nltk.pos_tag(nltk.word_tokenize("Great minds think alike. "))
print(sentence_taged)
# [('Great', 'JJ'), ('minds', 'NNS'), ('think', 'VBP'), ('alike', 'RB'), ('.', '.')]
在初学英语的时候,相信大家都会遇到一个令人头疼的问题,同一个单词在不同情况下会发生时态变化。实际上对于机器而言,这也对文本的后续处理造成了一定困扰,比如我在搜索引擎中键入 “apple”,查询相关的文章,假如有个文本中包含了 "apples" ,它是否也该返回作为搜索结果呢?理论上是的。所以在这里,就需要对文本中的 "apples" 做一些特殊处理,以便其能与 “apple” 产生关联,这里就涉及到了两种技术,即词干提取以及词形还原。
词⼲提取,英文称为 Stemming,指的是去除单词的前后缀得到词根的过程,一般应⽤于扩展检索。常⻅的前后词缀有「第三人称」、「进⾏式」、「过去分词」等,对于单词 "walk",有如下变化形式:
它们在进行词干提取后,都得到 "walk"。
词形还原,英文称为 Lemmatisation,指的是基于词典,将单词的复杂形态转变成最基础的形态,属于文本预处理中的前序步骤,将一些词汇统一成一般形式以便后续的分析处理。词形还原不是简单地将前后缀去掉,⽽是会根据词典将单词进⾏转换。比如:
以上单词在进行词形还原后,均得到 "be"。
很多人对词干提取与词形还原的定义还是觉得模糊,事实上,两者确实存在一些相似之处:
当然,两者也存在很多不同之处:
需要注意的是,词干提取与词形还原只针对具有形态变化的语言,比如英文、法文、德文等,中文是固定形态语言,因此并不存在这两种预处理操作。 接下来应用 NLTK 工具包进行词干提取以及词形还原。
# 导入下面三种词干提取器进行对比
import nltk.stem.porter as pt
import nltk.stem.lancaster as lc
import nltk.stem.snowball as sb
words = ['table', 'probably', 'wolves', 'playing', 'is', 'dog', 'the', 'beaches',
'grounded', 'dreamt', 'envision']
pt_stemmer = pt.PorterStemmer()
lc_stemmer = lc.LancasterStemmer()
sb_stemmer = sb.SnowballStemmer("english")
for word in words:
pt_stem = pt_stemmer.stem(word)
lc_stem = lc_stemmer.stem(word)
sb_stem = sb_stemmer.stem(word)
print("%8s %8s %8s %8s" % (word, pt_stem, lc_stem, sb_stem))
虽然在以上的结果中,三种词⼲提取的算法结果一致,但这里有必要说明一下三者的区别:
具体应用 NLTK 中的 stem 进行词形还原时,指定单词的词性很重要,不然词形还原可能效果不好,如以下例子:
from nltk.stem import WordNetLemmatizer # 用于词形还原
wnl = WordNetLemmatizer()
# 单词对应的词性指定错误,最终的结果也会出错
print(wnl.lemmatize('ate', 'n'))
print(wnl.lemmatize('fancier', 'v'))
# ate
# fancier
由以上结果可知,对于词形还原,是根据单词在文本中的词性而变化的,如果词性填写错误,最终结果也会出错。因此首先要进行词性判断,再根据词性进行词形还原。
对于某个文本,实施词形还原需要以下三个步骤:
- 分词
- 词性标注
- 词形还原
from nltk import word_tokenize, pos_tag
from nltk.corpus import wordnet
# 获取单词的词性
def get_wordnet_pos(tag):
if tag.startswith('J'):
return "j"
elif tag.startswith('V'):
return "v"
elif tag.startswith('N'):
return "n"
elif tag.startswith('R'):
return "r"
else:
return None
sentence = 'football is a family of team sports that involve, to varying degrees, kicking a ball to score a goal.'
tokens = word_tokenize(sentence) # 第一步:分词
tagged_sent = pos_tag(tokens) # 第二步:获取单词词性
wnl = WordNetLemmatizer() # 第三步:词干提取器
lemmas_sent = []
for tag in tagged_sent:
wordnet_pos = get_wordnet_pos(tag[1]) or wordnet.NOUN # tag[1]指单词词性
lemmas_sent.append(wnl.lemmatize(tag[0], pos=wordnet_pos)) # tag[0]指单词本身
print(lemmas_sent)
# ['football', 'be', 'a', 'family', 'of', 'team', 'sport', 'that', 'involve', ',',
# 'to', 'vary', 'degree', ',', 'kick', 'a', 'ball', 'to', 'score', 'a', 'goal', '.']
现在有这样一个任务:《西游记》里出现过哪些人物,师徒四人都走过了哪些地方。这时候,命名实体识别就派上用场了。命名实体识别,英文称为 Named Entity Recognition,简称为 NER,目的在于识别文本中具有特定意义的实体,比如人名、地点名、组织机构名、时间等,常常用于语义挖掘及信息提取。
可大致分为三类:
以下是一些常见的具备命名实体识别功能的工具:
- Stanford NER:斯坦福⼤学开发的基于条件随机场的命名实体识别系统,该系统参数基于 CoNLL、MUC-6、MUC-7和ACE命名实体语料训练而得。
- MALLET:麻省理工⼤学开发的⼀个统计⾃然语⾔处理的开源包。
- Hanlp HanLP:⼀系列模型与算法组成的 NLP ⼯具包,由⼤快搜索主导并完全开源,⽬标是普及⾃然语⾔处理在⽣产环境中的应⽤。
- nltk
- SpaCy:⼯业级的⾃然语⾔处理⼯具。
- Crfsuite:可以载入自己的数据集去训练 CRF 实体识别模型。
接下来应用 NLTK 工具包进行命名实体识别:
from nltk import ne_chunk
sentence = "Bill works for Aplle so he went to Boston for a conference."
result = ne_chunk(pos_tag(word_tokenize(sentence)))
print(result)
需要注意的是,大部分工具只能识别一些基本的常见的人名、地名、组织名、时间等,如果是特殊领域的实体,比如医疗领域中的药物名,疾病名,大部分工具便难以识别了,这是因为这些工具背后所应用的训练集不存在这些实体。这个时候,需要标注好的领域数据,可以应用 Crfsuite 训练个性化的识别器,也可以自己搭建一些深度学习的模型进行序列标注训练。
在文本处理任务中,我们所收集的真实数据往往存在数据类别不平衡的问题,因为在现实场景下,不是所有的类别都以均等的机会出现。比如,垃圾邮件比正常邮件少些,有错字的文本比正常的文本少些。
那么,对于样本少的类别,模型可能就学习不到其特性。而有时候我们恰恰又非常希望模型能够识别某些出现比较少的类,比如对于错别词的预测。因此,对于数据不平衡的处理或者说数据增强是数据预处理过程中的关键环节。
针对文本数据而言,在未转化成数值表征形式的时候,可以在字符层面进行数据增广,常见的方法有:
nlpcda 是一个中文数据增强工具,能够快速实现包括随机替换、回译等方式的文本增强,以下是几个案例。
nlpcda 中的
Randomword()
能够实现随机(等价)实体替换,输入的两个主要参数为:
create_num = 3
:返回 3 个增强文本。change_rate = 0.3
: 随机替换的概率。
!pip install nlpcda # 安装 nlpcda
from nlpcda import Randomword
sentence = "今天是2020年12月8日:我面试了58同城"
smw = Randomword(create_num=3, change_rate=0.3)
result = smw.replace(sentence)
print('随机实体替换结果:')
for r in result:
print(r)
# 随机实体替换结果:
# 今天是2020年12月8日:我面试了58同城
# 今天是2020年12月8日:我面试了中国通信服务
# 今天是2020年12月8日:我面试了瑞丰光电
nlpcda 中的
Similarword()
能够实现随机同义词替换,用法与Randomword()
一致。
from nlpcda import Similarword
sentence = "今天是2020年12月8日:我面试了58同城"
smw = Similarword(create_num=3, change_rate=0.8)
result = smw.replace(sentence)
print('随机实体替换结果:')
for r in result:
print(r)
# 随机实体替换结果:
# 今天是2020年12月8日:我面试了58同城
# 今日是2020年12月8日:我面试了58同城
# 今儿个是2020年12月8日:我面试了58同城
nlpcda 中的
baidu_translate()
能够实现百度中英翻译互转实现的增强,输入的四个主要参数为:
content
:原文本appid
:百度翻译 api 的 appidsecretKey
:百度翻译 api 的 secretKeyt_from
:原文本的语言t_to
:翻译文本的语言
注:申请 appid、secretKey 链接: http://api.fanyi.baidu.com/api/trans
from nlpcda import baidu_translate
zh = '天气晴朗,天气很不错,空气很好'
# 申请你的 appid、secretKey 分别填入 "xxx" 后代码才能运行
en_s = baidu_translate(content=zh, appid='xxx',
secretKey='xxx', t_from='zh', t_to='en') # 中文转英文
zh_s = baidu_translate(content=en_s, appid='xxx',
secretKey='xxx', t_from='en', t_to='zh') # 英文转回中文
print(zh_s)
俗话说,好的准备是成功的一半。在自然语言处理任务中,预处理是非常关键的一大基础步骤。本实验介绍了一些常见的文本预处理方法,并且大部分内容通过简单地调用工具便可以快速实现:
在很多自然语言处理应用的场景中,是由机器输出一些自然语言,比如聊天系统、机器翻译。那么,如何评判它们说的像不像“人话”呢?在下一实验中,我们将开始学习自然语言处理中非常重要且有意思的一个基础概念:语言模型。