Ex_treme's blog.

文章搜索引擎——后台和总结

2018/04/04 Share

文章搜索引擎(终)

这一章主要是使用第三方的管理工具xadmin来添加管理文章的增删改查功能。

使用Xamdin

  • xadmin介绍

xadmin是由python编写的基于Django的后台管理框架
使用xadmin只需要定义您数据字段等信息,就可以获得一个功能全面的管理系统

xadmin的特点

  1. 基于Bootstrap3,支持多主题哦,支持多屏幕
  2. xadmin是一款全面的后台系统框架,提供很多功能
  3. 拥有强大的插件系统
  4. 只实现了数据库的增删改查

py3安装xadmin

注意一定要区分jango的版本,python>3 django>2.0的安装比较麻烦

1
2
3
$ git clone https://github.com/sshwsfc/xadmin.git@django2
$ pip install future django-import-export
$ mv xadmin-master ../PycharmProjects/sas/extra_apps/

注册和配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
setting:
sys.path.insert(0,os.path.join(BASE_DIR,'extra_apps'))

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article',
'xadmin',
'crispy_forms',
]

urls:
from django.urls import path
import xadmin
from django.contrib import admin
from article.views import ArticleView
from django.views.generic.base import RedirectView
urlpatterns = [
path('xadmin/', xadmin.site.urls),
path('admin/', admin.site.urls),
path('', ArticleView.as_view(),name='index'),
path('favicon.ico',RedirectView.as_view(url='static/favicon.ico')),
]

修改语言环境

1
2
3
4
5
6
7
8
9
10
setting:
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

创建用户名和密码

1
2
3
4
manage.py@sas > createsuperuser
http://localhost:8000/xadmin/
err:(1146, "Table 'FileDB.xadmin_usersettings' doesn't exist")
manage.py@sas > migrate

编写上传文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
setting:

MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'

models:
import jieba
import hashlib
import json
import os
from django.core.files import File
from django.db import models
from django.core.files.storage import FileSystemStorage
# Create your models here.
from django.utils.encoding import force_text


def getStopword():
stopwordPath = os.getcwd() + '/apps/utils/stop_words.txt'
with open(stopwordPath,'r') as f:
stopwordlist = f.read().replace(' ','').replace('\n',' ').split(' ')
stopwordlist.append('\n')
stopwordlist.append(' ')
return stopwordlist

def initfile(filepath):
stopwordlist = getStopword()
with open(filepath,'rb') as f:
m = hashlib.md5()
m.update(f.read())
filemd5 = m.hexdigest()
with open(filepath, 'r') as f:
text = f.read()
fence = jieba.cut(text)
fencelist = []
for f in fence:
if f in stopwordlist:
continue
fencelist.append(f)

fenceJson = json.dumps(fencelist,ensure_ascii=False)
if len(fenceJson)>1 :
article = ArticleModel()
article.file_name = filepath.split('/')[-1]
article.file_path = filepath
article.file_md5 = filemd5
article.file_fence = fenceJson
article.save()


# 类对象会对应数据库中的一个表
from sas.settings import MEDIA_ROOT



class ArticleModel(models.Model):
#CharField对应数据库的varchar类型
file_name = models.CharField(max_length=50,verbose_name='文章名称')
file_path = models.CharField(max_length=150,verbose_name='文章路径')
file_md5 = models.CharField(max_length=32,verbose_name='文章MD5')
file_fence = models.TextField(verbose_name='文章分词')

#重新定义一些属性
class Meta:
#表的别名
verbose_name = '文章信息'
#此项不定义则别名后会存在字符s(英文框架造成的)
verbose_name_plural = verbose_name

#不重写则在返回数据时默认返回类名称,即返回文章名称为类名称
def __unicode__(self):
return self.file_name



class MyStorge(FileSystemStorage):
#删除重复上传的文件
def get_available_name(self, name, max_length=None):
filepath = os.path.join(MEDIA_ROOT,name)
if self.exists(name):
os.remove(filepath)
return name

#保存文件的同时对文章进行分词处理
def save(self, name, content, max_length=None):
"""
Save new content to the file specified by name. The content should be
a proper File object or any python file-like object, ready to be read
from the beginning.
"""
# Get the proper name for the file, as it will actually be saved.
if name is None:
name = content.name

if not hasattr(content, 'chunks'):
content = File(content, name)

name = self.get_available_name(name, max_length=max_length)
name = self._save(name,content)
initfile(os.path.join(MEDIA_ROOT,name))

return force_text(name.replace('\\','/'))


class UploadModel(models.Model):

file_name = models.CharField(max_length=50, verbose_name='文章名称')
file_path = models.FileField(upload_to='article/%Y/%M',verbose_name='文章',storage=MyStorge())

# 重新定义一些属性
class Meta:
# 表的别名
verbose_name = '文章上传'
# 此项不定义则别名后会存在字符s(英文框架造成的)
verbose_name_plural = verbose_name

# 不重写则在返回数据时默认返回类名称,即返回文章名称为类名称
def __unicode__(self):
return self.file_name

image
xadmin很强大,希望今后能用这个后台做更多的事情,假期之前的所有学习任务结束,假日快乐,幸福安康祝福你们~

总结

  • Django相关介绍
  • 创建应用(setting注册)
  • 写models(创建表)
  • 导入静态文件(替换静态资源)
  • 创建utils(TF-IDF,LDA)
  • 没有后台用文件系统做测试
  • 写视图(post-- 向指定的资源提交要被处理的数据)
  • 配置Xadmin
  • 重写存储功能(去重和保存)
  • 避免循环引用

知识点梳理与总结

  • NLP基本概念
  • 文章摘要器开发
  • NLP核心算法
  • jieba分词使用
  • 文章搜索引擎开发

NLP基本概念

  1. 介绍NLP(定义、作用、研究范围、难点)
  2. NLP的流程和关键名词(语言层、抽取层、挖掘层、应用层)
  3. 中文分词(n元分词算法、HMM算法)

文章摘要器开发

  1. 介绍HanLP(HanLP的定义、Jpype适应)
  2. Jpype电泳HanbLP
  3. 读取PDF、Docx类型文件内容(PDFMiner、Docx2txt)
  4. 通过HanLP韩剧哦去关键词、关键的短语
  5. Wxpython实现界面布局

NLP核心算法

  1. TF-IDF算法(TF-IDF=TF×IDF)
  2. LDA算法(词的字典、词频矩阵、LDA Model)

Jieba分词工具

  1. Jieba分词工具介绍使用(cut()\cut_for_search())
  2. TextRank(pAGErANK引入权值)
  3. Jieba使用停用词

文章搜索引擎开发

  1. Django介绍
  2. 初始化Django项目,创建article
  3. 设计数据库,整合前端界面
  4. 整合TFIDF和LDA
  5. 使用xadmion实现后台上传文件(get_available_name().save())
CATALOG
  1. 1. 文章搜索引擎(终)
  2. 2. 使用Xamdin
    1. 2.1. py3安装xadmin
    2. 2.2. xadmin很强大,希望今后能用这个后台做更多的事情,假期之前的所有学习任务结束,假日快乐,幸福安康祝福你们~
  3. 3. 总结
  4. 4. 知识点梳理与总结
    1. 4.1. NLP基本概念
    2. 4.2. 文章摘要器开发
    3. 4.3. NLP核心算法
    4. 4.4. Jieba分词工具
    5. 4.5. 文章搜索引擎开发