基于TF-IDF与逻辑回归模型实现文本实体关系抽取任务

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 基于TF-IDF与逻辑回归模型实现文本实体关系抽取任务

一、基于TF-IDF与逻辑回归模型实现文本实体关系抽取任务

本项目实现一个简单的文本实体关系抽取的方法,通过一个英文文本实体关系抽取的实例来介绍关系抽取的整个流程,包括文本数据的加载以及预处理,之后通过特征工程提取文本的特征,构建机器学习模型并对模型进行训练,最后通过训练好的模型对测试数据进行预测。此实例的目标是通过文本来判断已知实体对的关系,实体对之间的关系分为10个类别,每个类别使用一个数字编码表示。

二、数据集介绍

简述

训练集中有8000个句子,测试集中有2717个句子。

数据介绍

FULL_TRAIN.txt

train.txt

train_result.txt

train_result_full.txt

内容范围

FULL_TEST.txt

test.txt

test_result.txt

test_result_full.txt

数据来源

来自官方网站http://semeval2.fbk.eu/semeval2.php的原始数据

探索方向

SemEval-2010 Task#8的两个工具

官方输出文件格式检查器:semeval2010_task8_format_checker.pl

SemEval-2010任务8的官方得分手:semeval2010_task8_scorer-v1.2.pl

三、数据处理

# 数据处理
def generate_data(data_dir, name):
    filename = data_dir + name + '/' + name + '.txt'
    e1_list, e2_list, text_list = [], [], []
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            raw_text = line.strip().split('\t')[1]
            entity_1 = re.search(r'<e1>.*</e1>', raw_text).group().replace('<e1>', '').replace('</e1>', '')
            entity_2 = re.search(r'<e2>.*</e2>', raw_text).group().replace('<e2>', '').replace('</e2>', '')
            text = raw_text.replace('<e1>', '').replace('</e1>', '').replace('<e2>', '').replace('</e2>', '')
            e1_list.append(entity_1)
            e2_list.append(entity_2)
            text_list.append(text)
    label_dir = data_dir + name + '/' + name + '_result.txt'
    label_list = []
    with open(label_dir, 'r', encoding='utf-8') as f:
        for line in f:
            label = line.strip().split('\t')[1]
            label_list.append(label)
    with open('./temp/' + name + '_generate_easy.txt', 'w', encoding='utf-8') as f:
        for i in range(len(label_list)):
            f.write(e1_list[i] + '\t' + e2_list[i] + '\t' + label_list[i] + '\t' + text_list[i] + '\n')

四、加载数据

# 加载数据
def read_data(filepath):
    labels_dict = {'Cause-Effect': '0', 'Instrument-Agency': '1', 'Product-Producer': '2',
                   'Content-Container': '3', 'Entity-Origin': '4', 'Entity-Destination': '5',
                   'Component-Whole': '6', 'Member-Collection': '7', 'Message-Topic': '8',
                   'Other': '9'}
    label_list, text_list = [], []
    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            text = line.strip().split('\t')
            label_list.append(labels_dict[text[2]])
            text_list.append(text[3])
    return text_list, label_list

五、构建tfidf模型

1.tf-idf的物理意义

tf-idf通过词频统计的方法得到某个词对一篇文档的重要性大小(没有考虑语义信息)。

2.tf值(term frequency)

n表示某个词在文档中出现的次数,N表示文档中所有词出现的次数总和,这是一个归一化的过程,目的是消除文档篇幅长短上的差异。

3.idf值(inverse document frequency)

D表示语料中所有的文档总数,d表示语料中出现某个词的文档数量,公式中的1是为了防止分母为0的情况,lg是以10为底的对数,具有类似于增强区分度的作用(拥挤的值尽可能散开,离群的值尽可能合拢)。

4.tfidf值

最终tfidf值为两者的乘积

# 3.定义tfidf模型
tfidf_model = TfidfVectorizer(stop_words='english').fit(x_train)
print("词典大小 {}".format(len(tfidf_model.vocabulary_)))
# 4.将数据集转成数值向量
x_train_vec = tfidf_model.transform(x_train)
x_val_vec = tfidf_model.transform(x_val)

六、定义回归模型

# 5.定义线性模型
model = LogisticRegression(solver='lbfgs')
model.fit(x_train_vec, y_train)
print('Finished Training')

七、模型预测

# 7.模型测试
y_pred = model.predict(x_train_vec)
acc = accuracy_score(y_train, y_pred)
print("训练集准确率: {}".format(acc))
y_pred = model.predict(x_val_vec)
acc = accuracy_score(y_val, y_pred)
print("验证集准确率: {}".format(acc))

完整源码

import re
import os
import joblib
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 数据处理
def generate_data(data_dir, name):
    filename = data_dir + name + '/' + name + '.txt'
    e1_list, e2_list, text_list = [], [], []
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            raw_text = line.strip().split('\t')[1]
            entity_1 = re.search(r'<e1>.*</e1>', raw_text).group().replace('<e1>', '').replace('</e1>', '')
            entity_2 = re.search(r'<e2>.*</e2>', raw_text).group().replace('<e2>', '').replace('</e2>', '')
            text = raw_text.replace('<e1>', '').replace('</e1>', '').replace('<e2>', '').replace('</e2>', '')
            e1_list.append(entity_1)
            e2_list.append(entity_2)
            text_list.append(text)
    label_dir = data_dir + name + '/' + name + '_result.txt'
    label_list = []
    with open(label_dir, 'r', encoding='utf-8') as f:
        for line in f:
            label = line.strip().split('\t')[1]
            label_list.append(label)
    with open('./temp/' + name + '_generate_easy.txt', 'w', encoding='utf-8') as f:
        for i in range(len(label_list)):
            f.write(e1_list[i] + '\t' + e2_list[i] + '\t' + label_list[i] + '\t' + text_list[i] + '\n')
# 1.获得处理好的数据
generate_data('./SemEval2010-Task8-master/', 'train')
generate_data('./SemEval2010-Task8-master/', 'test')
# 加载数据
def read_data(filepath):
    labels_dict = {'Cause-Effect': '0', 'Instrument-Agency': '1', 'Product-Producer': '2',
                   'Content-Container': '3', 'Entity-Origin': '4', 'Entity-Destination': '5',
                   'Component-Whole': '6', 'Member-Collection': '7', 'Message-Topic': '8',
                   'Other': '9'}
    label_list, text_list = [], []
    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            text = line.strip().split('\t')
            label_list.append(labels_dict[text[2]])
            text_list.append(text[3])
    return text_list, label_list
# 2.形成训练数据集
x_train, y_train = read_data('./temp/train_generate_easy.txt')
x_test, y_test = read_data('./temp/test_generate_easy.txt')
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.25, random_state=2022)
print("train data: {}, val data: {}, test data: {}".format(len(y_train), len(y_val), len(y_test)))
# 3.定义tfidf模型
tfidf_model = TfidfVectorizer(stop_words='english').fit(x_train)
print("词典大小 {}".format(len(tfidf_model.vocabulary_)))
# 4.将数据集转成数值向量
x_train_vec = tfidf_model.transform(x_train)
x_val_vec = tfidf_model.transform(x_val)
# 5.定义线性模型
model = LogisticRegression(solver='lbfgs')
model.fit(x_train_vec, y_train)
print('Finished Training')
# 6.保存模型
if not os.path.exists('./checkpoints'):
    os.makedirs('./checkpoints')
joblib.dump(model, "./checkpoints/best_model.joblib")
joblib.dump(tfidf_model, "./checkpoints/base_vectorizer.joblib")
# 7.模型测试
y_pred = model.predict(x_train_vec)
acc = accuracy_score(y_train, y_pred)
print("训练集准确率: {}".format(acc))
y_pred = model.predict(x_val_vec)
acc = accuracy_score(y_val, y_pred)
print("验证集准确率: {}".format(acc))
label_index = ['Cause-Effect', 'Instrument-Agency', 'Product-Producer',
               'Content-Container', 'Entity-Origin', 'Entity-Destination',
               'Component-Whole', 'Member-Collection', 'Message-Topic', 'Other']
# 8.模型验证
model = joblib.load("./checkpoints/best_model.joblib")
tfidf_model = joblib.load("./temp/models/base_vectorizer.joblib")
x_test_vec = tfidf_model.transform(x_test)
y_pred = model.predict(x_test_vec[39])
label_index[int(y_pred[0])]


目录
相关文章
|
6月前
|
vr&ar
垃圾分类模型想上maixpy(2)
1-1 关于模型部署,MaixPy文档的这一部分中可能有些有用的参考:部署模型到 Maix-I(M1) K210 系列开发板 - Sipeed Wiki 。 实际用数字图片进行测试时,手写数字识别的模型无法产生正确的输出。
159 1
|
6月前
|
编解码 并行计算 TensorFlow
垃圾分类模型想上maixpy(3)
1-5 对比Params与模型文件实际体积。 结果:模型实际大小与Params大小是可以对上的,参数应该是以float32存储。我把“字节”与“位”搞混了,应该是一个字节为8位。
74 0
|
18天前
|
机器学习/深度学习 算法
五、分类模型
五、分类模型
13 0
|
6月前
|
自然语言处理 Python
【Python自然语言处理】文本向量化的六种常见模型讲解(独热编码、词袋模型、词频-逆文档频率模型、N元模型、单词-向量模型、文档-向量模型)
【Python自然语言处理】文本向量化的六种常见模型讲解(独热编码、词袋模型、词频-逆文档频率模型、N元模型、单词-向量模型、文档-向量模型)
882 0
|
6月前
|
IDE TensorFlow 开发工具
垃圾分类模型想上maixpy(1)
maixpy笔记 Something 上下拉。应该就是强制高、低电平,可以避免不确定的状态。 模型区没有文件系统,模型之间烧录在指定地址。
115 0
|
机器学习/深度学习 算法 数据挖掘
书写自动智慧文本分类器的开发与应用:支持多分类、多标签分类、多层级分类和Kmeans聚类
书写自动智慧文本分类器的开发与应用:支持多分类、多标签分类、多层级分类和Kmeans聚类
书写自动智慧文本分类器的开发与应用:支持多分类、多标签分类、多层级分类和Kmeans聚类
|
自然语言处理
使用bert+lstm+crf做实体识别经验总结
使用bert+lstm+crf做实体识别经验总结
179 0
|
机器学习/深度学习 存储 自然语言处理
机器学习算法(一): 基于逻辑回归的分类预测
机器学习算法(一): 基于逻辑回归的分类预测
24031 1
机器学习算法(一): 基于逻辑回归的分类预测
|
XML 存储 数据处理
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
|
算法 Windows
【文本分类】基于类信息的TF-IDF权重分析与改进
【文本分类】基于类信息的TF-IDF权重分析与改进
351 0
【文本分类】基于类信息的TF-IDF权重分析与改进