弄了几天正向最大匹配法分词,终于弄完了吧。Python写的。Python确实是一门好语言,写起来很简单、顺手。
一、关于正向最大匹配法分词
中文分词(Chinese Word Segmentation)指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。
正向最大匹配法:
例子: 将句子 ’ 今天来了许多新同事 ’ 分词。 设最大词长为5
今天来了许
今天来了
今天来
今天 ====》 得到一个词 – 今天
来了许多新
来了许多
来了许
来了
来 ====》 得到一个词 – 来
了许多新同
了许多新
了许多
了许
了 ====》 得到一个词 – 了
许多新同事
许多新同
许多新
许多 ====》得到一个词 – 许多
新同事
新同
新 ====》得到一个词 – 新
同事 ====》得到一个词 – 同事
最后正向最大匹配的结果是:/今天/来/了/许多/新/同事/
二、正向最大匹配分词算法
三、语料库的处理与算法的输入
语料库的处理流程:
输入:人民日报语料库199801.txt
输出:dict.txt词表文件
分词算法:
输入:将dict.txt处理后得到的list集,以及最大词长;待分词的句子
输出:分词后的句子
Azkaban是一个Hadoop批处理调度器,可以通过访问其前台展示页面来进行部署、运行job等操作。
//IndexServlet.java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/* set runtime properties from request and response */
super.setRuntimeProperties(req, resp);
AzkabanApplication app = getApplication();
String action = getParam(req, "action");
if ("loadjobs".equals(action)) {
resp.setContentType("application/json");
String folder = getParam(req, "folder");
resp.getWriter().print(getJSONJobsForFolder(app.getAllFlows(), folder));
resp.getWriter().flush();
return;
}
else if("unschedule".equals(action)) {
String jobid = getParam(req, "job");
app.getScheduleManager().removeScheduledJob(jobid);
} else if("cancel".equals(action)) {
cancelJob(app, req);
} else if("schedule".equals(action)) {
String redirect = scheduleJobs(app, req, resp);
if (!redirect.isEmpty()) {
resp.sendRedirect(redirect);
return;
}
} else {
throw new ServletException("Unknown action: " + action);
}
resp.sendRedirect(req.getContextPath());
}
看文件名就可以看出了这个是整个系统运行的源头,一切从这里开始. . . . . . .
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
AzkabanApplication中是一系列用于整个系统初始化的代码,接下来就来看一下吧~
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public AzkabanApplication(List<File> jobDirs, File logDir, File tempDir, boolean enableDevMode) throws IOException {
this._jobDirs = Utils.nonNull(jobDirs);
this._logsDir = Utils.nonNull(logDir);
this._tempDir = Utils.nonNull(tempDir);
if(!this._logsDir.exists())
this._logsDir.mkdirs();
if(!this._tempDir.exists())
this._tempDir.mkdirs();
for(File jobDir: _jobDirs) {
if(!jobDir.exists()) {
logger.warn("Job directory " + jobDir + " does not exist. Creating.");
jobDir.mkdirs();
}
}
if(jobDirs.size() < 1)
throw new IllegalArgumentException("No job directory given.");
/**
* 加载默认的属性文件
* 实际上只用.properties为后缀的文件
*/
Props defaultProps = PropsUtils.loadPropsInDirs(_jobDirs, ".properties", ".schema");
/**
* 主要功能就是加载HADOOP_HOME
*/
_baseClassLoader = getBaseClassloader();
String defaultTimezoneID = defaultProps.getString(DEFAULT_TIMEZONE_ID, null);
if (defaultTimezoneID != null) {
DateTimeZone.setDefault(DateTimeZone.forID(defaultTimezoneID));
TimeZone.setDefault(TimeZone.getTimeZone(defaultTimezoneID));
}
/**
* 由于Azkaban支持锁shezhi,在这里进行锁管理的初始化
*/
NamedPermitManager permitManager = getNamedPermitManager(defaultProps);
/**
* 初始化Azkaban支持的job类型
*/
JobWrappingFactory factory = new JobWrappingFactory(
permitManager,
new ReadWriteLockManager(),
_logsDir.getAbsolutePath(),
"java",
new ImmutableMap.Builder<String, Class<? extends Job>>()
.put("java", JavaJob.class)
.put("command", ProcessJob.class)
.put("javaprocess", JavaProcessJob.class)
.put("pig", PigProcessJob.class)
.put("propertyPusher", NoopJob.class)
.put("python", PythonJob.class)
.put("ruby", RubyJob.class)
.put("script", ScriptJob.class).build());
_hdfsUrl = defaultProps.getString("hdfs.instance.url", null);
_jobManager = new JobManager(factory,
_logsDir.getAbsolutePath(),
defaultProps,
_jobDirs,
_baseClassLoader);
_mailer = new Mailman(defaultProps.getString("mail.host", "localhost"),
defaultProps.getString("mail.user", ""),
defaultProps.getString("mail.password", ""));
String failureEmail = defaultProps.getString("job.failure.email", null);
String successEmail = defaultProps.getString("job.success.email", null);
int schedulerThreads = defaultProps.getInt("scheduler.threads", 50);
_instanceName = defaultProps.getString(INSTANCE_NAME, "");
final File initialJobDir = _jobDirs.get(0);
File schedule = getScheduleFile(defaultProps, initialJobDir);
File backup = getBackupFile(defaultProps, initialJobDir);
File executionsStorageDir = new File(
defaultProps.getString("azkaban.executions.storage.dir", initialJobDir.getAbsolutePath() + "/executions")
);
if (! executionsStorageDir.exists()) executionsStorageDir.mkdirs();
/**
* 获得上次启动Azkaban时执行的最大jobId
*/
long lastExecutionId = getLastExecutionId(executionsStorageDir);
logger.info(String.format("Using path[%s] for storing executions.", executionsStorageDir));
logger.info(String.format("Last known execution id was [%s]", lastExecutionId));
final ExecutableFlowSerializer flowSerializer = new DefaultExecutableFlowSerializer();
final ExecutableFlowDeserializer flowDeserializer = new DefaultExecutableFlowDeserializer(_jobManager, factory);
FlowExecutionSerializer flowExecutionSerializer = new FlowExecutionSerializer(flowSerializer);
FlowExecutionDeserializer flowExecutionDeserializer = new FlowExecutionDeserializer(flowDeserializer);
/**
* 初始化管理工作流的缓存,默认将cache大小设置为1000
* 这里是整个初始化过程中的重点!!!
*/
_allFlows = new CachingFlowManager(
new RefreshableFlowManager(
_jobManager,
flowExecutionSerializer,
flowExecutionDeserializer,
executionsStorageDir,
lastExecutionId
),
defaultProps.getInt("azkaban.flow.cache.size", 1000)
);
_jobManager.setFlowManager(_allFlows);
_jobExecutorManager = new JobExecutorManager(
_allFlows,
_jobManager,
_mailer,
failureEmail,
successEmail,
schedulerThreads
);
this._schedulerManager = new ScheduleManager(_jobExecutorManager, new LocalFileScheduleLoader(schedule, backup));
/* set predefined log url prefix
*/
String server_url = defaultProps.getString("server.url", null) ;
if (server_url != null) {
if (server_url.endsWith("/"))
_jobExecutorManager.setRuntimeProperty(AppCommon.DEFAULT_LOG_URL_PREFIX, server_url + "logs?file=" );
else
_jobExecutorManager.setRuntimeProperty(AppCommon.DEFAULT_LOG_URL_PREFIX, server_url + "/logs?file=" );
}
this._velocityEngine = configureVelocityEngine(enableDevMode);
}这部分将系统所需的各个部分,各个属性都进行了初始化的操作。
注: 本文是由本人原创,如需引用请注明出处:
http://blog.csdn.net/zhang__bing/article/details/8721834
在做机房收费系统时,遇到这样一个问题:登陆系统时,在B层的登陆函数UserLogin_BLL()中调用了D层的两个函数—判断用户是否存在IsUserExist_DA(),验证密码是否正确CheckPassWord_DA()。在D层的这两个方法中的sql语句及设置参数分别是:
(1)
'sql语句
Dim sql As String = "SELECT COUNT(*) FROM T_UserInfo WHERE UserName=@UserName"
'设置参数
Dim parameter As SqlParameter = New SqlParameter("@UserName", enUser.UserName)
(2)
'sql语句
Dim sql As String = "SELECT UserName,PassWord FROM T_UserInfo WHERE UserName=@UserName AND PassWord=@PassWord"
'设置参数
Dim parameters() As SqlParameter =
{
New SqlParameter("@UserName", enUser.UserName),
New SqlParameter("@PassWord", enUser.PassWord)
}
(注意:两个sql语句中都有@UserName这个参数)
执行B层的UserLogin_BLL()函数时,就需要执行D层的IsUserExist()和CheckPassWord()两个函数,对吧!!
那么此时问题就出现了:报如下错:
问题在于:
在多次执行SqlCommand的时候,第一次执行没有错..第二次就会出现变量名在批查询或存储过程内部必须唯一,
这是因为以前的参数还存在事务中。所以在执行第二次时,变量无法辨别,我们只需SqlCommand执行完毕后,添加如下语句即可:cmd.Parameters.Clear();就可以了,也就是在同一事务中若要多次执行带有相同参数名的SQL语句,必须在第一次执行后清理参数.
如下代码:(此代码是我的sqlhelper中的一个函数)