实践目标:
(1)使用Visual Studio Code建立Python项目;
(2)编写从数据库读取语料数据的代码。
1、 建立项目
文本相似性分析由多个模块构成,在开发过程中需要对这些模块进行管理,很有必要以项目方式开发文本相似性分析程序。
使用Visual Studio Code建立Python项目非常简单,在磁盘上创建一个新文件夹,如创建“similar”文件夹。
启动Visual Studio Code,单击“打开文件夹”,即建立了“similar”项目。
当前项目没有任何内容,在后面的编程中,逐步创建项目文件。
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程序失败,提示如下图所示的错误。
该问题主要原因是项目采用了模块化结构,一个目录表示一个模块,该目录下的代码文件隶属于该模块,当程序调用其它模块文件时,会发生找不到该模块的问题。如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的标准库目录。