从MySQL数据库提取语料数据
5953字,阅读需时20分钟

课程目标:

(1)使用Visual Studio Code建立Python项目;

(2)编写从数据库读取语料数据的代码。

1、 建立项目

文本相似性分析由多个模块构成,在开发过程中需要对这些模块进行管理,很有必要以项目方式开发文本相似性分析程序。

使用Visual Studio Code建立Python项目非常简单,在磁盘上创建一个新文件夹,如创建“similar”文件夹。

启动Visual Studio Code,单击“打开文件夹”,即建立了“similar”项目。

001.png

当前项目没有任何内容,在后面的编程中,逐步创建项目文件。

2、 从数据库读取语料

在项目根目录下建立db目录,该目录存储与数据库相关的Python代码文件。在db目录下,建立readnews.py文件,该文件完成从数据库读取语料数据的功能。

编写readnews.py代码之前,首先在项目根目录下建立一个项目配置文件,为项目配置参数和初始设置,如数据库的登录账号、密码等信息。在项目根目录下新建config.ini文件。

程序清单 config.ini

#配置文件#
 
#MYSQL数据库配置#
[MYSQL]
MYSQL_HOST = 127.0.0.1
MYSQL_DBNAME = newsdb
# 配置数据库的访问用户
MYSQL_USER = root
# 配置数据库的访问密码
MYSQL_PASSWD = 123456

项目在执行过程中,要用到若干中间数据文件,为了方便获取这些数据文件的位置路径,建立filepath.py文件,在该文件内定义获取相关文件位置路径的方法。

在项目根目录下建立tool目录,在tool目录下新建filepath.py文件。

程序清单 filepath.py

#文件路径处理#
#导入os模块
import os
 
# 获取项目的根目录
def get_root_path():
    curPath = os.path.abspath(os.path.dirname(__file__))
    rootPath = curPath[:curPath.find("similar" + os.sep)+len("similar" + os.sep)]
    return rootPath
# 获取数据目录
def get_data_dir():
    curPath = os.path.abspath(os.path.dirname(__file__))
    rootPath = curPath[:curPath.find("similar" + os.sep)+len("similar" + os.sep)]
    return rootPath + "data" + os.sep
 
# 获取配置文件路径
def get_config_path():
    return get_root_path() + "config.ini"

编辑readnews.py代码文件,从数据库读取语料数据。

程序清单 readnews.py

'''
1、MySQL模块
2、读取稿件库新闻条目
'''
#导入pymysql模块
import pymysql as mysql
#导入配置模块
import configparser as config
#导入正则模块
import re
#导入os模块
import os
#导入路径模块
import tool.filepath as path
 
 
 
# 定义数据库连接函数
def connect_database_newpaper():
 
    #获取配置数据
    cf = config.ConfigParser()
    configpath = path.get_config_path()
    cf.read(configpath,encoding='UTF-8')
    #读取MYSQL_HOST(MySQL主机地址)
    host=cf.get("MYSQL","MYSQL_HOST"),
    #读取MYSQL_DBNAME(MySQL数据库名称)
    db=cf.get("MYSQL","MYSQL_DBNAME"),
    #读取MYSQL_USER(MySQL数据库用户名)
    user=cf.get("MYSQL","MYSQL_USER"),
    #读取MYSQL_PASSWD(MySQL数据库用户登录密码)
    passwd=cf.get("MYSQL","MYSQL_PASSWD"),
    #设置字符集为utf8编码
    charset='utf8',
   
    try:
        conn = mysql.connect(
            host=host[0],
            user=user[0],
            password=passwd[0],
            database=db[0]
        )
        return conn  #获取配置数据
    except Exception as e:
        print(e)
        return "error"
 
# 过滤HTML标签和换行符
def remove_html_tag(html):
    # 过滤HTML标签
    pattern = re.compile(r'<[^>]+>',re.S)
    text = pattern.sub('',html)
    # 过滤换行符
    pattern = re.compile(r'[\\\r\\\n]+',re.S)
    text = pattern.sub('',text)
    # 替换英文逗号
    pattern = re.compile(r'[,]+',re.S)
    text = pattern.sub('。',text)
    text = text.strip()
    return text
 
 
# 读取新闻条目
def query_database_record_limit(p_start,p_end):
    # 稿件内容和ID
    content = []
    # 连接数据库
    conn = connect_database_newpaper()
    if conn == "error":
        print("数据库连接错误")
    else:
        # 获取Curso对象
        cursor = conn.cursor()
        try:
            # 查询news表
            cursor.execute("SELECT guid,content FROM news limit " + str(p_start) + "," + str(p_end))
            # 获取所有结果集
            result = cursor.fetchall()
            # 遍历结果集的每行记录
            for row in result:
                # 获取id和main_content字段内容   
                content.append([row[0],remove_html_tag(row[1])])
            return  content        
        except Exception as e:
            print(e)
        # 关闭数据库连接
        finally:
            cursor.close()  
            conn.close()
 
 
# 程序入口
if __name__ == '__main__':
    print(query_database_record_limit(0,10))

connect_database_newpaper()方法从项目配置文件读取数据库登录账号,登录密码和数据库连接地址,并连接数据库,返回数据库连接对象。

remove_html_tag()方法使用正则表达式过滤新闻内容中的HTML标签、换行符、标点符号,这些单词和字符对文本的比对分析没有任何帮助。

query_database_record_limit()方法首先获取数据库连接对象,编写和执行SQL查询语句,然后遍历返回记录,对每条记录的content字段内容进行过滤处理,添加到列表对象,最后返回列表对象。

为方便调试程序,该文件添加了“__main__”入口,可以直接执行该文件,验证语料数据读取结果。

下面是实践过程可能出现的问题和解决方法。

问题1:运行readnews.py程序失败,提示如下图所示的错误。

002.png

该问题主要原因是项目采用了模块化结构,一个目录表示一个模块,该目录下的代码文件隶属于该模块,当程序调用其它模块文件时,会发生找不到该模块的问题。如readnews.py程序调用了tool模块下的filepath.py文件。

解决方法:

Python搜索模块的路径是由四部分构成的:程序的主目录、PATHONPATH环境变量、标准链接库目录、扩展名为pth的路径配置文件,这四部分的路径都存储在sys.path 列表中。

(1)程序的主目录

程序的主目录是指包含主模块的目录,Python首先会在主目录中搜索模块,若所有模块都在主目录中,所有的导入都会自动完成,而不需要单独配置模块路径。

(2)PATHONPATH环境变量

PATHONPATH是Windows系统的环境变量,在Windows系统中可以设置PATHONPATH环境变量,将项目存储模块文件的路径添加到PATHONPATH环境变量。

(3)标准链接库目录

标准链接库目录是Python安装第三方库的目录,这些目录是Python解释器的默认搜索目录。

(4)扩展名为pth的路径配置文件

如果不设置PATHONPATH环境变量,也可以用记事本创建一个扩展名为pth的路径配置文件,该文件每一行都是一个有效的目录,Python会读取路径文件中的内容,每行都作为一个有效的目录,加载到模块搜索路径列表中。

例如下面的文件内容:

d:\pythoncode\module\lib
d:\pythoncode\book\lib

该文件要放置到Python的安装目录或标准库所在的目录,才能被Python自动读取。文件放置的目录可以通过下面的Python代码查看:

>>> import site
>>> site.getsitepackages()
['C:\\python', 'C:\\python\\lib\\site-packages']
>>>

编写扩展名为pth的文件,将项目根目录的绝对路径写入该文件,并将该文件放置到Python的标准库目录。

我要评论
全部评论