WEB项目看来是完不成了,先把论文做了吧,我干嘛选NLP。。。
一、经典的NLP和现在的NLP
-
经典的NLP
经典的NLP需要学习词袋模型,TF IDF,word to vector,LSTM,LDA,很多都是传统算法和传统模型。
这些东西完全不用学习了,完全用不上。 -
现在的NLP
是一个纯的Transformer的模型
拼的是预选模型
和之前的经典NLP一点的相关性都没有了
想要快速上手,需要将Transformer熟练起来
然后找HUGGING FACE这样的一个工具
或者找PyTorch中的一些模板
直接上手开始做,主要是分类的模型
二、python字符串的处理
关于环境什么都不用搭建,直接使用下面这个网站即可:
https://www.kaggle.com/
# 1 去掉字符串前后的空白
str = " 今天天气真好,你那里天气好吗? "
str.strip()
# 2 去掉字符串左边或者右边的空白
str = " 今天天气真好,你那里天气好吗? "
print(str.lstrip())
print(str.rstrip())
# 3 去除指定的字符(将需要去除的字符全部放进去)
str = "*&^#$%F今天天气真好,你那里天气好吗?*&%#@A"
print(str.strip("*&^#$%F*&%#@A"))
# 4 替换
str = "今天天气真好今,天,你那里天气好吗?"
print(str.replace("今天", "明天"))
# 5 利用替换去除中间内容
str = "今天天气真好今,天,你那里天气好吗?"
print(str.replace("今天", ""))
# 6 查找一个单词的位置
str = "今天天气真好今,天,你那里天气好吗?"
print(str.find("今天"))
# 7 判断字符串里面是否全部是字母
str = "Hello World!"
print(str.isalpha())
str = str.replace(" ", "")
str = str.replace("!", "")
print(str.isalpha())
# 8 判断字符串里面是否全部是数字
str = "1020103455"
print(str.isdigit())
# 9 指定字符对字符串进行分割操作
str = "今天 天气 好晴朗, 处处 好风光"
print(str.split(" "))
# 10 指定字符对字符串列表合并
str = "今天 天气 好晴朗, 处处 好风光"
str = str.split(" ")
print("&&".join(str))
# 11 查看字符串对象有什么方法
help(str)
# 因为字符串是不可变类型,所以如果需要对字符串进行修改需要重新赋值来创建一个新的字符串对象。
二、正则表达式语法
在python中re模块是正则表达式的模块,re模块在python当中已经默认进行安装了。
# 1 预先创建一个正则模板
import re
pattern = re.compile(f".")
# 2 根据正则模板在字符串中进行匹配,这里点表示匹配字符串中每一个字符
str = "你对我来说很重要。11aabb"
print(re.findall(pattern, str))
# 3 字符集合[],在中括号里面的字符都会被匹配掉
pattern = re.compile(f"[ab]")
print(re.findall(pattern, str))
# 4 字符集合的范围写法,这里匹配所有的大写字母和所有的小写字母
str = "你好啊我是am78星云的uUrRTh5533号机器人。"
pattern = re.compile(f"[a-zA-Z]")
print(re.findall(pattern, str))
# 5 指定匹配不包括字符集合中的元素
pattern = re.compile(f"[^a-zA-Z]")
print(re.findall(pattern, str))
# 6 将字符集合取并集进行匹配
pattern = re.compile(f"[a-zA-Z]|[0-9]")
print(re.findall(pattern, str))
# 1 匹配数字,可以等价的使用字符集合来匹配
import re
str = "你好啊我是am78星云 的uUrRTh5533号\n机器人。"
pattern = re.compile(f"\d")
print(re.findall(pattern, str))
# 2 使用对应字母的大写表示取反的
pattern = re.compile(f"\D")
print(re.findall(pattern, str))
# 3 匹配数字和字母(注意汉字也算是字母)
pattern = re.compile(f"\w")
print(re.findall(pattern, str))
# 4 匹配非数字和字母
pattern = re.compile(f"\W")
print(re.findall(pattern, str))
# 5 匹配空白
pattern = re.compile(f"\s")
print(re.findall(pattern, str))
# 1 匹配零次或者多次数字
import re
str = "你好啊我是am78星云 的uUrRTh5533号\n机器人。"
pattern = re.compile(f"\d*")
print(re.findall(pattern, str))
# 2 匹配1次或者多次数字
pattern = re.compile(f"\d+")
print(re.findall(pattern, str))
# 3 匹配0次或者1次数字
pattern = re.compile(f"\d?")
print(re.findall(pattern, str))
# 4 匹配多少次,注意这里需要加上r不然这里会出现问题
str = "你好啊我是am78星云 的uUrRTh5533号\n机器人。"
pattern = re.compile(r"\d{2}")
print(re.findall(pattern, str))
# 5 指定匹配次数的范围,能够匹配更多就默认会匹配更多,所以最后一次匹配的是5553
str = "你好啊我是am78星云 的uUrRTh5533号\n机器人。"
pattern = re.compile(r"\d{2,4}")
print(re.findall(pattern, str))
三、match和search
两个方法返回的不是列表,而是一个Match类对象,如果匹配不成功返回的是None类型,一般使用的时候都需要进行判断是否为None类型。
match是从头开始,search可以跳过开头。
# 1 match
import re
pattern = re.compile(r"\d")
str = "123木头人,不许说话,不许动。"
print(re.match(pattern, str)) # <re.Match object; span=(0, 1), match='1'>
print(re.match(pattern, str).group())
# str = "木头人123,不许说话不许动。"
# print(re.match(pattern, str).group()) # 报错
# 2 search
str = "木头人123,不许说话不许动。"
print(re.search(pattern, str).group()) # 正常
四、sub替换
# 1 sub,正则模板,替换成,原字符串,替换的次数
import re
str = "aabbcc112233hhg23gss"
pattern = re.compile(r"\d")
print(re.sub(pattern, '数字', str, 2))
# 2 subn多返回一个替换的次数
pattern = re.compile(r"\d")
print(re.subn(pattern, '数字', str, 2))
五、split
# 1 split
import re
str = "所有老婆:大老婆二老婆小老婆"
pattern = re.compile(r"[大二小]")
print(re.split(pattern, str))
六、命名组
# 1 命名组
import re
str = "机器学习,人工智能123深度学习"
pattern = re.compile(r"(?P<d>\d+)(?P<nd>\D+)")
print(re.search(pattern, str).group())
print(re.search(pattern, str).group("d"))
print(re.search(pattern, str).group("nd"))
print(re.search(pattern, str).groups())
对于正则表达式来说只需要学习简单的语法,剩下的交给gpt即可。
七、NLTK
老牌自然语言处理工具包,主要用于处理英文数据。
# import nltk
# nltk.download() # 需要安装额外的工具包
from nltk.tokenize import word_tokenize # 分词器
from nltk.text import Text # 创建Text对象
input_str = "Today's weather is good,very windy and sunny, we have no classes in the afternoon,We have to play backetball tomorrow."
# 1 分词操作
tokens = word_tokenize(input_str)
tokens = [word.lower() for word in tokens]
print(tokens)
# 2 将分好的词初始化为Text对象,接下来好对Text对象进行别的操作
t = Text(tokens)
good_count = t.count('good') # 统计这个单词出现的次数
print(good_count)
good_index = t.index('good') # 这个单词出现在单词列表的索引位置
print(good_index)
t.plot(8) # 展示前八个出现次数最多的词语
八、停用词及词性标注
from nltk.corpus import stopwords # 导入停用词
# stopwords.readme().replace('\n', ' ') # 停用词说明文档
print(stopwords.fileids()) # 看看支持哪些语言的停用词,之前是没有中文的这里居然有中文的停用词了真牛逼
# 查看指定的语言的停用词
# print(stopwords.raw('chinese')) # 感觉中文的停用词有些少
print(stopwords.raw('english').replace('\n', ' '))
# 1 去掉停用词
from nltk.tokenize import word_tokenize # 分词器
input_str = "Today's weather is good,very windy and sunny, we have no classes in the afternoon,We have to play backetball tomorrow."
tokens = word_tokenize(input_str)
test_words = [word.lower() for word in tokens]
test_words_set = set(test_words)
test_words_set.intersection(set(stopwords.words('english'))) # 与停用词词典的交集
filtered = [w for w in test_words_set if (w not in stopwords.words('english'))] # 如果单词不在停用词表中就进行保留-过滤停用词
print(filtered)
# 2 词性标注
from nltk import pos_tag
tags = pos_tag(test_words)
for tag in tags:
print(tag)
# 3 分块
from nltk.chunk import RegexpParser
sentence = [('the', 'DT'), ('little', 'JJ'), ('yellow', 'JJ'), ('dog', 'NN'), ('died', 'VBD')]
grammer = "MY_NP: {<DT>?<JJ>*<NN>}" # 有点类似正则表达式
cp = nltk.RegexpParser(grammer) # 生成规则
result = cp.parse(sentence) # 进行分块
print(result)
print(type(result)) # <class 'nltk.tree.Tree'>,这里使用draw画不出来,有点难受result.draw()
# 4 命名实体识别
from nltk import ne_chunk
sentence = "Edison went to Tsinghua University today."
print(ne_chunk(pos_tag(word_tokenize(sentence))))
标签:入门,开始,compile,re,01NLP,str,pattern,print,findall From: https://www.cnblogs.com/wumouhao/p/18644868下一节:数据清洗
看的B站的小迪,一个个慢慢看吧,反正也不会。
到时候论文请教导师吧,哈哈哈