可以添加一些专业领域的分词。
import jieba
jieba.initialize()
text = "南京市长江大桥"
text_sp = jieba.cut(text)
jieba.add_word("南京市长",99999999) # 动态规划
jieba.add_word("江大",9999)
jieba.add_word("桥",9999)
# 动态添加词典,和下面的加载自定义词典的功能一样,只是动态添加的词典会覆盖原有的词典,而加载自定义词典则是追加到原有的词典中。
# jieba.load_userdict("myword.txt")# 加载自定义词典,加入我自己有一些想添加的词,如“南京市长”,“桥”,等等,并赋予其权重9999,使其优先识别。
# print(text_sp)
# for i in text_sp:
# print(i,end=" ")
text_sp = list(text_sp)
print(text_sp)
文本分类,用pytorch的dataset,和dataloader
整个流程是,先拿到数据,拿数据的时候要注意空值,注意不满足数据 标签格式的数据,注意标签格式不对的数据,然后我们将数据进行一个buildword_to_index,然后开始写dataset,因为我们用的是Pytorch,所以我们前面要import,然后写自己的dataset,继承,写自己的dataset要注意三个函数,__init__,getitem,还有len,这三个函数,此处我们就不用管什么shuffle和batfchsize了,这些东西会在dataloader中设置,dataset主要是去一条一条拿到数据,然后我们将dataset传入到dataloader,参数可以将batchasize和shuffle传入其中,我们还要设置一个collate_fn,我们可以通过它去处理一个batch的数据,我们可以将一个batch的数据处理为,文本,标签,长度的格式。
from torch.utils.data import Dataset,DataLoader
def get_data(path):
all_text = []
all_label = []
with open(path,"r",encoding="utf8") as f:
all_data = f.read().split("\n")
for data in all_data:
try:
if len(data) == 0:
continue
data_s = data.split(" ")
if len(data_s) != 2:
continue
text,label = data_s
label = int(label)
except Exception as e:
print(e)
else:
all_text.append(text)
all_label.append(int(label))
return all_text,all_label
def build_word2index(train_text):
word_2_index ={"PAD":0,"UMK":1}
for text in train_text:
for word in text:
if word not in word_2_index:
word_2_index[word] = len(word_2_index)
return word_2_index
class TextDataset(Dataset):
#z这里继承了Dataset类,实现了__getitem__和__len__方法,还有一个很总要的__init__方法
def __init__(self,all_text,all_lable):
self.all_text = all_text
self.all_lable = all_lable
def __getitem__(self, index):
#这里实在一条一条的返回数据
text = self.all_text[index]
label = self.all_lable[index]
text_len = len(text)
return text,label,text_len
def process_batch_batch(self, data):
batch_text = []
batch_label = []
batch_len = []
for d in data:
batch_text.append(d[0])
batch_label.append(d[1])
batch_len.append(d[2])
min_len = min(batch_len)
batch_text = [i[:min_len] for i in batch_text]
return batch_text,batch_label
def __len__(self):
return len(self.all_text)
#这里会告诉数据总长度,也就是数据集的大小,到后面我们再检查数据的时候,会用到这个值,我们可以通过这个数据来设置数据集的大小。
if __name__ == "__main__":
train_text,train_lable = get_data("train.txt")
assert len(train_lable) == len(train_text),"数据长度都不一样,你玩毛线呢?"
word_2_index = build_word2index(train_text)
train_batch_size = 4
epoch = 1
train_dataset = TextDataset(train_text,train_lable)
train_dataloader = DataLoader(train_dataset,batch_size=train_batch_size,shuffle=False,collate_fn=train_dataset.process_batch_batch)
#这里用道德collate_fn来处理数据,将数据处理成batch_text,batch_label,batch_len的形式,这样我们就可以直接拿到batch_text,batch_label,batch_len了。
for e in range(epoch):
for batch_text,batch_label in train_dataloader:
print("*"*100)
print(batch_text)
数据展示
今天下雨了 1
麻辣烫好吃! 2
肥猪肉不好吃。 0
啊 手动阀手 动阀 2 32
明天会下雨吗? 1
这件衣服不好看 0
中国队赢了 2
这件衣服好看 2
男足输越南 0
世界杯马上开赛 1
的 的
的风格s 岁的法国
岁的法国 是豆腐干山豆根是德国 阿斯蒂芬