直接上代码 怎么用 ,具体原理 你参照其他人的
环境 python3 linux pycharm
训练语料文件: 具体的文件这里我涉及到业务的问题没办法放出来 格式就是excel 如下图 后面用pandas 处理读取
这个函数时处理成我们fasttext 能够接受的格式
def writeData(sentences,fileName):
out=open(fileName,'w',encoding='utf-8')
for sentence in sentences:
out.write(sentence+"\n")
def pre_data_process():
base_dir='./data/你的excel文件名'#data是我自己的文件名,你可以自己改自己的
df = pd.read_excel(base_dir,encoding ="utf-8")
df=df.dropna() #去空行处理
langue=df['语料'].values.tolist()
intent=df['原始意图'].values.tolist()
#分割语句 这个里面你可以用stopwords 进行停用词的处理,我这边没有处理
sentences=[]
for i,j in zip(langue,intent):
segs=jieba.lcut(str(i)) #分词
sentences.append(" ".join(segs) + "\t" + "__label__" +j)
random.shuffle(sentences) #乱序处理 必须要
writeData(sentences,'train_data.txt')
前处理的文本格式变成了最终的模板类型如图:
import fasttext
classifier=fasttext.supervised('train_data.txt','classifier.model',label_prefix='__label__',min_count=1,word_ngrams=2,bucket= 2000000,lr=0.1,epoch=100,dim=200)
这里 ‘train_data.txt’ 是我上面语料处理后的文件 具体格式见上图 ‘classifier.model’ 是你要生成模型的名称
后面的参数你可以参照API:https://blog.csdn.net/qq_32023541/article/details/80845913
word_ngrams=2,bucket= 2000000 这个是一个坑 注意设置n-grams 时要有bucket 不然会报错
调用训练好的模型:
classifier = fasttext.load_model('./model/classifier.model.bin', label_prefix='__label__')
texts = ' '.join(jieba.lcut(text)) #这里我图方便 后面可以用hanlp 提高分词准确
texts = [texts]
labels_predict = classifier.predict_proba(texts,k=3)[0]# 预测输出结果为二维形式 [('请问', 0.998047), ('委屈', 1.95313e-08), ('倒萨啊', 1.95313e-08)] 输出的top3 的意图及top可能性
django 做的web 接口如下:
参照 blog :https://blog.csdn.net/john_bh/article/details/79268850#31-fasttext%E6%9C%89%E7%9B%91%E7%9D%A3%E5%AD%A6%E4%B9%A0%E5%88%86%E7%B1%BB