C#开发邮件工具

2024-06-30

C#开发邮件工具(精选4篇)

C#开发邮件工具 篇1

1 引言

在工作中, 邮件的发送和接收应该是经常要使用到的功能的。因此知道电子邮件的应用程序的原理也是非常有必要的, 在这一个专题中将介绍电子邮件应用程序的原理、电子邮件应用程序中涉及的协议和实现一个简答的电子邮件收发器程序。

2 邮件应用程序基本知识

2.1 电子邮件原理及相关协议

说到电子邮件的原理, 其实和现实生活中寄邮件和寄包裹是一样的原理的。就先回顾下现实生活中寄邮件的流程吧———首先, 先写好信, 信封上面写好收信人的地址, 写信人的地址, 然后把信放到寄信箱中, 邮局的人会某个时候去这个信箱中的信取出来, 然后邮局的人根据信封上写的收信人地址进行转发到当地的邮局, 当地邮局把信寄到收信人的信箱中 (寄包裹的话可能会电话联系, 像在淘宝, 京东买的东西的, 收货人就是通过电话联系一样) , 最后收信人会到自己的信箱中收取信件。上面大致是平时生活中寄信的一个流程。前面已经讲过电子邮件的原理和这个差不多的下面就介绍本专题中电子邮件的原理, 大家可以和现实生活中的寄信过程进行对比, 这样可以更加容易理解和掌握:

通过电子邮件应用 (例如基于客户端的Outlook电子邮件软件和一些基于Web的电子邮件系统———新浪邮箱、谷歌邮箱、QQ邮箱等都属于电子邮件应用) 将一封写好的邮件 (相当于现实生活中的信, 当然邮件也要写明收件人地址, 邮件内容等信息的) 通过电子邮件协议 (SMTP, 在后面的电子邮件相关协议中会介绍) 发送到SMTP服务器 (就是存储邮件的地方, 相当于生活中的邮局一样) , 然后SMTP服务器根据收件人的地址通过SMTP协议转发到相应SMTP接收服务器上, (SMTP服务器进行转发相当于现实生活中邮局的人配送信的过程, 配送到收件人当地的邮局, 然而现实生活中邮局都是一家, 所以可以相互识别———意思就是发送到当地邮局, 当地邮局会接收, 并且帮助你发送到指定人的信箱中, 在网上就是通过SMTP协议来规定这样的一个过程的, 发送到别人的SMTP服务器上别人的服务器必须要认识发送来的邮件并接收) 结束, 接收端邮件服务器 (POP3服务器) 把邮件存放到接受者的电子信箱内 (相当于当地邮局的人把信放到收信人的邮箱中) , 最后收件人可以登录自己的电子信箱, 再与POP3服务器进行连接, 从POP3服务器上下载发送来的邮件, 这样在收件人的电子信箱中就可以看到发送来的电子邮件了 (这就是现实生活中收信人从自己的信箱中取信的一个过程) 。

上面已经把电子邮件的原理和现实生活中寄信的过程进行对比, 相信大家可以更加清楚电子邮件的原理和发送接收过程的, 其实网络上的很多应用都可以以现实生活的例子去理解, 这样的话可以加深对知识的理解。下面就介绍下电子邮件中的相关协议的内容:

网络上的应用的核心就是协议, 因为协议让网络上的客户端相互认识发生来的数据, 所以电子邮件应用也不例外, 也有相关的电子邮件协议来完成发送电子邮件和接收电子邮件的过程, 这些协议主要是:SMTP (简单邮件传输协议, Simple Mai Transfer Protocol) 、POP3 (邮局协议, Post Office Protocol) 和IMAP (网络邮件访问协议, Internet Message Access Protocol) 。

(1) SMTP———SMTP主要负责将邮件从一台机器转发至另一台机器 (可以对照上面电子邮件的过程来理解SMTP的作用) 。

(2) POP3———3表示POP协议的版本, 主要负责将邮件从邮箱中 (POP3服务器) 传输到本地计算机。

(3) IMAP———现在常用的版本为第四版本, 即IMAP4, 主要负责邮件的检索和处理功能, 客户端不需要下载邮件到本地计算机, 可直接从邮件客户端软件对服务器上的信件和文件目录进行操作, 它是POP3的替代协议。

2.2 邮件系统分类

邮件系统主要分为两类的———基于客户端的邮件系统和基于Web浏览器的邮件系统。Office OutLook就是基于客户端的邮件客户端系统, 而像我们经常使用的QQ邮箱、新浪、网易邮箱等都是属于基于Web浏览器的邮件系统, 基于客户端的邮件系统的收发过程, 通过如图1所示来描述。

发送方通过邮件客户端, 将编辑好的邮件向邮件服务 (SMTP服务器, 在发送过程中也叫发送端邮件服务器) 发送, 发送端邮件服务器根据收件人的地址来识别接收端邮件服务器 (POP3服务器) , 然后向POP3服务器发送邮件信息, 接收端邮件服务器将邮件存放在接收者的电子信箱中, 并告知接收者有新邮件, 接收者通过邮件客户端与POP3服务器连接后, 就可以查看新邮件。

然而, 基于Web浏览器的邮件系统与基于客户端的邮件系统不同的地方如下:

(1) 基于Web浏览器邮件系统用户代理 (代理的概念也就是用户不是直接与服务器进行通信, 而是通过代理的方式, 让代理去与服务器通信, 然后用户在从代理中获的服务器的信息, 代理也就是中间人的作用, 相当于生活中中介, 在.net中很多技术都用到了代理, 例如委托的概念其实也就是代理的一个概念的) 是Web浏览器, 基于客户端的邮件系统而是邮件客户端应用程序, 一般是Windows Form程序。

(2) 浏览器发送邮件到SMTP服务器和从POP3服务器中获得邮件的方式都是通过HTTP协议来实现, 与基于客户端的邮件系统不同 (基于客户端的邮件系统发送通过SMTP协议或ESMTP (Extended SMTP) , 获得通过POP3或IMAP协议) 。

2.3 目前主要的电子邮件服务系统

电子邮件服务系统———就是向大家提供邮箱服务的服务系统, 这样的系统当然是由专门的公司进行研发的, 一般叫这样的公司为邮件服务商, 平常使用的网易邮箱, 新浪、Gmail邮箱等都是建立在电子邮件服务系统。现在主要电子邮件服务系统主要有下面几种:

(1) 基于Postfix/Qmail的邮件系统。例如, 雅虎邮箱基于Qmail系统。

(2) 微软Exchange邮件系统。

(3) IBM Lotus Domino邮件系统。

(4) Scalix邮件系统。

(5) Zimbra邮件系统。

(6) MDeamon邮件系统。

3. Net平台对邮件发送功能的支持

在.Net类库中, 在System.Net.Mail命名空间下定义了对邮件处理的类, 这样使邮件的发送更加方便 (这些类也就是对SMTP协议的封装, 使我们更好地区编程, 只需要使用类中的方法和属性等去完成邮件的发送, 避免写复杂的SMTP协议的命令) 。

C#提供了一系列邮件相关的类, 在这里就不一一介绍了, 大家可以参考MSDN去看每个类的使用, 并且在后面程序的实现部分也会有详细的注释去介绍程序中使用到类的使用。需要注意的是:C#提供的类中只有SMTP的字样, 却没有POP3这样的字样, 这说明.Net类库本身中并没有提供对POP3协议的封装类, 但是可以使用Jmail组件来完成从POP3服务器中收取邮件的功能, 具体的使用将在后面的邮件收发器程序中邮件的接收部分介绍。

4 邮件收发器程序的实现

4.1 邮件发送功能

4.1.1 SMTP协议

SMTP协议是用于电子邮件的传输的协议, 电子邮件是通过SMTP服务器进行发送的, SMTP服务器的默认端口为25, 通常发送邮件有两种方式———一种是不使用客户端认证, 即客户端可以使用匿名发送邮件 (这种方式叫做SMTP) ;另一种是客户端必须提供用户名和密码认证 (这种方式叫做ESMTP, Extended SMTP) 目前大部分邮件服务器采用用户名和密码认证的方式。

客户端发送邮件过程为———先通过客户端软件 (本程序中的邮件收发器) 将邮件发送到SMTP服务器, 然后再由SMTP服务器发送到目标SMTP服务器。下面介绍SMTP协议的内容:

SMTP协议总共定义了14个命令, 命令由命令码和气候的参数域组成, 不区别大小写 (通过前面专题的讲述可以得出各个协议的命令组成都差不多的) , 表1就简单介绍下5个常用的命令码:

电子邮件由信封、首部、正文和结束符号4部分组成, 下面就具体介绍下这4个部分的内容:

(1) 信封

信封包括发信人的邮件地址和接收人的邮件地址, 具体对应两条SMTP命令———Mail from:mytest1989@sina.cn (发信人的地址) 和Rcpt to:test@126.com。

(2) 首部

首部中常用的命令有:

1) Subject:<邮件主题>———表示邮件的主题。

2) Date:<时间>———表示发邮件的时间。

3) reply-to:<邮件地址>———表示邮件的回复地址。

4) Content-Type:<邮件类型>———表示邮件包含文本、HTML超文本和附件的类型。

5) X-Priority:<邮件优先级>———表示邮件发送的优先级, 优先级为3表示为普通邮件;如X-Priority:3。

(3) 正文

正文当然指的就是邮件的内容了, 用Data命令指定, 首部以一个空行结束, 下面就是正文部分。

(4) 结束符号

邮件以“."结束,

接收方收到SMTP命令之后, 会给出一个响应码, 每个命令都只有一个响应码, SMTP响应码也是由3位数字组成, 后面附加一些文本信息, 响应信息的格式为:

响应码<空格>文本信息<回车换行>

客户端发出一条命令后, 服务器端返回一个响应, 发送者在发送下一条命令前必须等待服务器的响应, 成功接收到响应码后才继续发送命令。

附:SMTP常用的响应码:

响应码解释响应码解释

211系统状态或系统帮助响应421服务未就绪, 关闭了传输通道

214帮助信息501参数格式错误

220服务就绪502命令不可实现

221服务关闭传输通道535用户验证失败

235用户验证成功553邮箱名不可用, 要求的操作未执行

334等待用户输入验证554操作失败

354开始邮件输入

4.1.2 邮件的发送过程

(1) 客户端与服务器建立连接 (该步中客户端首先发送EHLO local连接命令, 服务器如果返回“220”响应码表示服务器准备就绪了, 客户端再继续发送“Auto login”命令, 请求登录, 服务器收到命令后返回“334”响应码, 表示要输入用户名, 之后客户端发送用户名命令, 等到响应后再发送密码命令, 具体在程序的实现中也会有注释。)

(2) 客户端发送邮件的信封。

(3) 开始发送邮件数据, (包括邮件首部, 正文和结束符号, 注:结束符号要单独占一行, 表示邮件发送结束) 。

(4) 客户端与服务器断开连接。

4.1.3 发送功能的实现代码

相信有了上面的理论解释邮件发送的过程后, 实现邮件发送的功能并不难的, 并且.net类库中SMTPClient类封装了SMTP协议, 使得实现邮件发送功能就不要记住那些具体的命令了, 只需要使用该类中提供的方法来完成邮件的发送 (当然你也可以通过发送命令的方式实现, SMTPClient类的方法也是完成发送命令功能而已的) , 下面是邮件发送功能的核心代码:

4.2 邮件接收功能

4.2.1 POP3协议

前面介绍了邮件的发送, 当然接收者需要登录邮箱来查看收到的邮件了, 此时就必有有一个协议去读取服务器上邮件, POP3就是这样的一个协议。还有两外一种协议也是用来接收邮件的———IMAP协议, 它与POP3协议区别有:

(1) IMAP使用的端口号是143而POP3邮件服务器通过监听110端口来提供POP3服务。

(2) IMAP允许客户端在邮件服务器上建立文件夹来保持邮件, 而不用把邮件下载到本地。而POP3需要把邮件下载到本地。和SMTP协议一样, 客户端要通过POP3协议从POP3服务器上获取邮件, 也需要先与POP3服务器建立TCP连接, 等待服务器向客户端发送确认信息表明连接成功时, 客户端才可以继续发送命令给服务器来获取邮件, 在POP3协议中, 规定的命令也是几十条的, 每条命令由命令和参数两部分组成, 都是以回车换行结束, 并且命令和参数之间由空格分隔, 命令通常也是由3-4个字母组成, 参数最多可以为40个字符的长度, 而服务器的响应信息是由一个状态码和可能附加信息的字符组成, 所有的响应信息也是以回车换行结束的。状态码和其他协议定义的状态码有点不一样, POP3服务器响应的状态码有两种———“+OK” (确定) 和"-ERR" (失败) 。这样客户端可以通过检查响应的状态码所包含的字符来判断服务器是否响应客户端发送的命令, 即响应信息中包含“+OK”表示成功响应, 包含“-ERR”表示服务器未响应。同时在程序的实现中大家可以通过Debug来查看响应消息的组成, 这样可以加深理解。

4.2.2 邮件接收的过程

客户端从服务器接收邮件的过程主要经历3个状态:授权状态、操作状态和更新状态

(1) 授权状态———客户端发送与POP3服务器的TCP连接请求, 服务器接收后发送一个响应确认信息之后, 此时客户端需要发送正确的用户名和密码进行确认, 因为在邮件服务器上有很多用户邮箱, 只有提供正确的用户名和密码才有权限访问自己的邮箱, 就像现实生活中邮箱的钥匙一样的。

发送用户名命令:USER test@s126.com

发送密码命令:PASS****** (这两个命令都在代码中有给出的, 大家可以参考代码来理解邮件的接收过程)

(2) 操作状态———如果客户端提供了正确的用户名和密码, 则授权状态也就通过了, 就相当于打开了在服务器上自己的邮箱, 现在用户就有权限进去下载, 查看和删除邮件等操作, 然后在现实生活中的取邮件和删除邮件都很简单 (只要打开了邮箱门, 用手去拿就可以了) , 然后在网络应用上, 这些操作都需要发送POP3命令给服务器, 服务器接收到命令后再给出响应。操作中常用的命令有:

1) STAT命令———该命令从服务器中获取邮件总数和总字节数, 服务器响应命令返回邮件总数和总字节数

如:

?

客户端发送POP3命令:STAT

服务器响应命令:+OK 2 1340
服务器响应命令。

2) LIST命令———该命令从服务器中获得邮件列表和大小, 服务器响应命令返回列出邮件列表和大小。

如:

?

客户端发送POP3命令:LIST

服务器响应命令:+OK 2 message (1430 octect)

服务器响应命令:1700

服务器响应命令:2730

服务器响应命令:<一个空行>

3) RETR命令———该命令从服务器中获得一个邮件, 格式为RETR<邮件编号>

如:

?

客户端发送POP3命令:RETR 1

服务器响应命令:700 octets

服务器响应命令:<邮件头和内容>

服务器响应命令:<空行>

4) DELETE命令———该命令告诉服务器将邮件标记为删除。 (此时只是逻辑删除)

(3) 更新状态———客户端发送QUIT命令后, 此时就进入更新状态, POP3服务器释放在操作状态中取得的资源, 并将逻辑删除的邮件进行物理删除, 然后关闭与客户端的TCP连接。这样整个邮件处理的过程就结束了。

4.2.3 接收功能的实现代码

有了前面接收邮件过程的介绍, 再参考代码的实现, 相信大家可以更好的理解客户端从POP3服务器中获取邮件的过程, 由于.net类库并没有封装POP3协议的实现类, 要实现邮件的获取可以采用发送命令的方式, 也可以使用Jmail组件, 这个组件其实就是POP3协议的封装类, 既然微软没有做, 其他公司做好后来并简单的实现邮件的接收的一个类库罢了。然后在使用这个组件的过程中出现了好几个问题, 在源码中都做了解释, 大家可以下载源代码后查看。

实现邮件接收的核心代码如下:

4.3 程序运行结果

首先输入邮箱名和密码登录到POP3服务器来获取邮件列表的演示, 如图2所示。

然后在邮件列表中选中一个邮件进行阅读, 然后进行回复邮件的操作演示 (邮件的发送都可以附加附件发送出去) :阅读邮件的界面, 如图3所示。

回复邮件的界面, 如图4所示。

同时点击发送按钮后, 就可以把邮件发送到sina的SMTP服务器上, 再由新浪的SMTP服务器转发到QQ的SMTP服务器, QQ的POP3服务器中QQ的SMTP服务器获取收到的邮件, 当QQ用户输入正确的邮箱名和密码后就可以从QQ的POP3服务器上获取收到的邮件。

点击发送按钮后成功发送邮件的图片, 如图5所示。

5 结语

通过介绍邮件发送和接收的原理, 希望能熟悉简单邮件收发器的功能。

C#开发SQL工具箱 篇2

随着计算机技术的广泛应用, SQL数据库也越来越多地被应用到各行各业中来, 对于计算机专业人士来说, SQL的维护并不神秘, 但对于最终客户而言, 如何维护好数据库, 就不是一件容易的事情了, 这也是开发这个小工具的出发点之一。

日常的教学工作中, 发现很多学生在写程序的时候, 随意性很强, 做事没有规划、想到哪里做到哪里, 结果等回头看看的时候发现自己写的东西其实真的是不好的。因此在这里结合这个小工具的开发过程, 介绍一些开发工作中应注意的事项, 希望能够带给读者朋友一些启发。

软件开发是一个系统工程, 这里不打算仔细讲解软件工程的理论, 只是借用一下软件工程的一些思想来规划这个小项目的开发过程。感兴趣的朋友可以自行查找软件工程的书籍来阅读一下。

按照软件工程的思想, 一个软件开发过程包括这样几个环节:需求提出 (客户提出) 、可行性分析、需求分析、系统设计、开发过程、测试、发布、维护等。前面已经提到了这个工具是应现实的需要而开发的, 这其实就是客观需要的存在, 需要做的就是详细分析软件应该具有的功能模块 (需求分析) , 并且根据需要实现的功能制定合适的开发方案之后再具体的实现之。

2 需求分析

通常对于数据库的维护主要的出发点就是确保数据的安全, 在发生意外的时候能够第一时间恢复数据, 从而保证信息系统的正常运作;同时为了方便维护, 还需要对数据库进行一些日常的处理, 比如清理SQL的日志文件、导入导出数据等。

这样一来, 这个SQL工具箱的功能就基本已经明确了, 即要实现下面几个功能:

(1) 数据库的备份与恢复。

(2) 数据库的日志清理。

(3) 数据库的建立与删除。

(4) 数据库的附加与分离。

(5) 数据库中数据的导入与导出功能。

3 技术准备

开发语言选择目前最新的Visual Studio.Net C#2008。对数据库的处理技术, 考虑到软件的便捷和功能的高效实现, 采用SQLDMO来处理。微软提供的SQL分布式管理对象SQLDMO (SQL Distributed Management Objects) 封装了Microsoft SQL Server数据库中的对象。SQLDMO是Microsoft SQL Server中企业管理器所使用的应用程序接口, 所以它可以执行很多功能, 其中也包括对数据库的备份和恢复。

4 开发过程

打开VS2008, 新建项目, 选择Visual c#项目类型, 之后选择模板窗口中的Windows窗体应用程序, 在名称栏目处录入项目名称“SQL_Tools”, 接下来指定保存路径, 然后单击确定按钮。如图1所示。

SQLDMO是微软随SQL发布的一个应用程序接口, 因此需要在项目中添加到引用中。具体方法是:右键点击项目的“引用”, 然后选“添加引用”, 如图2所示。

之后出现添加引用对话框, 单击COM选项卡, 在组件中找到“SQL Distributed Management Objects”, 选定后单击确定按钮, 即可添加到项目引用中, 如图3所示。

接下来开始应用程序的界面设计了。考虑到软件具有多个功能模块, 各个功能模块之间没有直接的、紧密的联系, 把各个功能模块划分到不同的界面上来, 同时, 由于软件本身并不大, 只是一个小工具, 所以用一个窗体来实现即可。结合这两点考虑, 在一个窗体上放置一个TabControl, 这样就实现了想要的界面模式, 如图4所示。

注意:顶部和左侧各自使用一个Panel控件, 用意在于:顶部Panel控件用于显示数据库连接信息;左侧Panel控件用于显示数据库服务器中的所有数据库列表。因为后续所有模块都是针对特定的数据库来进行的, 这些信息就成为共用的信息, 把它们放在相对独立的位置, 就可以使用户一目了然, 可以有效提高用户体验效果。

在备份与恢复区域内, 用两个groupBox控件来区分两个相对独立的功能模块, 这样就从视觉上把两个功能分开了, 使得用户很容易明白软件的意图。

软件开发过程中, 尽量遵循一定的命名规则来命名程序中用到的各种控件、变量、类、方法, 比如字符型的变量用“s”开头;数值型的用“d”开头;下拉列表框控件用“cb”开头等。具体命名规则朋友们可以查阅一下相关的书籍。规范命名的益处是很明显的, 不再赘述。至于这里的命名, 朋友们可以参看一下代码中的具体实现。

代码实现部分中, 前面已经介绍了要用SQLDMO来实现想要的功能。在SQLDMO中, 有相应的几个公开的方法, 分别是:

为了在程序中能较为方便地应用SQLDMO, 把相关的方法封装到一个数据库操作类中去, 这样会使得程序代码更为简洁, 可读性也极大增强了。

在操作类中, 封装如下几个方法:连接数据库、读取数据库列表、备份数据库方法、恢复数据库方法等等。这里简要介绍数据库的备份和恢复方法, 更多方法朋友们可参看所附的源码。

4.1 数据库备份

4.2 数据库恢复

到这里已经准备好了具体的方法, 只要在界面的备份按钮事件中调用备份方法, 在数据库的恢复按钮事件中调用恢复方法即可。代码如下:

5 结语

至此, 完成了数据库的备份和恢复的开发工作。回顾开发过程, 不难发现尽管软件很小, 但软件开发所需的各个工作环节却都是一一存在且不容忽视的。限于篇幅, 就先到此结束, 后面会继续完成其他功能的开发。

摘要:通过使用C#开发SQL工具箱, 介绍C#开发软件的一些思路与方法, 并通过在开发过程中的一些具体做法, 讲解软件开发中应注意的一些事项, 从而养成良好的开发习惯。

基于C#的语言模型计算工具 篇3

统计语言模型通常使用概率和分布函数来描述词、词组及句子等自然语言基本单位的性质和关系, 它体现了自然语言中存在的基于统计原理的生成和处理规则[1]。上世纪70年代末, J.K.Bake和F.Jelinek首次将隐马尔可夫模型 (Hidden Markov Model:HMM) 应用于语音识别领域[1]。

在此之后, 统计语言模型得到了进一步的发展, 出现了不少新的模型, 逐渐深入渗透到了自然语言处理的各个层面, 并且在很多其他的应用领域都取得了极大的成功:

在机器翻译领域, 1990年, 来自IBM公司的Peter Brown等人提出了统计机器翻译模型。他们使用一种噪声信道模型, 把机器翻译看成是一个信息传输的过程。在模型中, 他们用N-gram统计语言模型描述了目标语言文本出现的概率。通过估计目标语言翻译成源语言的条件概率, 来寻找最优的译文。在此之后, Och等人在IBM模型的基础上, 提出了基于最大熵的统计机器翻译方法。在信息检索领域, 1998年, Pnoet和Corft首次将统计语言模型应用到信息检索中。在手写汉字识别领域, 模板匹配方法是一种基于统计模型的模式识别方法。此外, 还有基于HMM的识别方法。1992年, Srihari等人将统计模型和句法信息结合在一起进行手写汉字识别[1]。

1 统计语言模型

简单地说, 语言模型就是用来计算一个序列概率的模型, 即P (W1, W2, ..., Wk) 。利用语言模型, 可以确定哪个序列的可能性更大, 或者给定若干个成员, 可以预测下一个最可能出现的成员。再举一个机器翻译的例子, 给定一个汉语句子为艾山在公司里看电影, 可以翻译为Ai shan is watching Movie at Company、Ai shan at Company is watching Movie等等, 同样根据语言模型, 我们知道前者的概率大于后者, 所以翻译成前者比较合理。序列S=W1, W2, ..., Wk, 它的概率可以表示为:

由于上式中的参数过多, 因此需要近似的计算方法。常见的算法有n-gram模型方法、决策树、最大熵模型、最大熵马尔科夫模型、条件随机场、神经网络等方法。

1.1 n-gram语言模型

n-gram模型也称为n-1阶马尔科夫模型, 它有一个有限历史假设:当前词的出现概率仅仅与前面n-1个词相关。因此 (1) 式可以近似为:

当n取1、2、3时, n-gram模型分别称为unigram、bigram和trigram语言模型。n-gram模型的参数就是条件概率P (Wi|Wi-n+1, ..., Wi-1) 。假设词表的大小为100, 000, 那么n-gram模型的参数数量为1000, 000n。n越大, 模型越准确, 也越复杂, 需要的计算量越大。最常用的是bigram, 其次是unigram和trigram, n取≥4的情况较少。

1.2 n-gram模型的参数估计

模型的参数估计也称为模型的训练, 一般采用最大似然估计 (Maximum Likelihood Estimation, MLE) 的方法对模型的参数进行估计:

C (X) 表示X在训练语料中出现的次数, 训练语料的规模越大, 参数估计的结果越可靠。但即使训练数据的规模很大, 如若干GB, 还是会有很多语言现象在训练语料中没有出现过, 这就会导致很多参数 (某n元对的概率) 为0。举个例子来说明一下, IBM Brown利用366M英语语料训练trigram, 结果在测试语料中, 有14.7%的trigram和2.2%的bigram在训练中没有出现;根据博士期间所在的实验室统计结果, 利用500万字人民日报训练bigram模型, 用150万字人民日报作为测试语料, 结果有23.12%的bigram没有出现。

这种问题也被称为数据稀疏 (Data Sparseness) , 解决该问题可以通过数据平滑 (Data Smoothing) 来解决。数据平滑是对频率为0的n元对进行估计, 典型的平滑算法有加法平滑、Good-Turing平滑、Katz平滑、插值平滑等。

1.3 SRILM

SRILM是著名的约翰霍普金斯夏季研讨会 (Johns Hopkins Summer Workshop) 的产物, 诞生于1995年, 由SRI实验室的Andreas Stolcke负责开发维护 (http://www.speech.sri.com/projects/srilm/) 。SRILM用来构建和应用统计语言模型, 主要用于机器翻译、语音识别, 统计标注等, 可运行在Windows及UNIX操作系统上。

2 基于C#的维吾尔语语言模型算法实现

本文中, 为了在汉维机器翻译解码器里计算目标句子单词的困惑度, 研究与实现了基于C#的语言模型计算算法。首先使用12万汉维句对中的维吾尔文句子, 利用SRILM工具创建了3元的维吾尔文语言模型文件, 然后使用自己开发的二分查找库生成工具软件 (图1所示) 生成可以用二分查找算法查找N元概率的文件, 然后可以在解码器用该文件计算句子的困惑度。

以下是语言模型计算算法的实现代码:

摘要:由于SRILM语言模型计算工具包需要把全部模型数据载入内存, 有些语言模型为几百兆或几千兆, 对于个人计算机来说, 每一次启动应用程序要载入几百兆的数据不仅耗内存, 也很耗时, SRILM不适合于面向个人计算机的软件。该文中, 为了解决面向个人用户的汉维机器翻译语言模型的计算问题, 在SRILM基础上, 实现了基于C#的即需即载数据的语言模型计算工具, 数据用二分查找进行检索。

关键词:维吾尔语,语言模型,二分查找,C#

参考文献

[1]文娟.统计语言模型的研究与应用[D].北京:北京邮电大学, 2010.

[2]邢永康, 马少平.统计语言模型综述[J].计算机科学, 2003 (9) :22-26.

[3]张敬芝, 高强, 耿桦, 等.统计自然语言处理中的线性插值平滑技术[J].计算机科学, 2007 (34) :223-225.

C#开发邮件工具 篇4

本文主要是介绍一款用C#技术开发《网络串口测试工具》的软件, 该软件是为了满足拼接墙工程实际测试, 应用, 集成过程中一些需求而使用C#技术快速开发出来的软件。这款软件的特点是实用, 简单, 同时应用C#开发软件方便、稳定、高效。

需求综述:

在拼接墙工程中的系统搭建, 软件开发以及工程项目集成的时候都需要各种软件和硬件的应用整合, 例如:矩阵切换器, 视频切换器, 控制终端等等, 因为这些硬件都是系统的一个组成部分, 它们的测试, 应用, 集成十分重要, 只有把各个模块都合理的应用起来, 这样才能保证整个系统的成功。但是, 由于这些软件或者硬件模块都是有网路 (TCP/UDP) 或者串口, 就带了如何快速测试, 应用, 集成。为了测试, 应用, 集成的方便, 因此决定开发这个工程应用软件, 用于提高开发以及测试效率。

C#快速开发的优势:

现在软件开发的工具很多, 有C++, C#, jave等等。由于我们的需求只是测试, 集成用辅助的软件, 目的主要是开发快, 应用简单。因此我选用现在比较流行的C#开发。实际应用中也发现C#快速开发的优势。C#的优势在于很多功能都已经封装好了, 例如:sockets, serialport等等, 这样就不需要你去封装, 直接调用就可以了, 这样就大大加快了开发速度。同时C#在WinForm上的开发的直观简便, 也很容易让你上手开发, 另外, 其字符之间的转换也是其优势之一。

应用场合:

现在很多硬件或者软件都会提供相应的扩展功能, 其对外的接口常用的有网络 (TCP/UDP) 或者串口。一旦工程中需要购买其他厂商的的商品或者自身商品向其他采购商提供对外接口, 那就可以运用该测试软件进行测试。这样就十分容易简单的测试以及判断问题和功能。

测试系统简单框图以及软件界面:

具体功能说明:

主要是两大功能块:网络测试和串口测试。

一, 通过网络接口发送字符串或者十六进制数据, 同时接受对方的反馈。那么你只要在发送内容里面内填入相应的内容, (例如RGB1V1) , 选择发送内容的形式是字符串还是十六进制。同时选中TCP或者UDP, 填写好IP地址和端口, 然后按发送, 然后会自动触发开始接收, 这样如果发送的协议内容, 对方接口有反馈就会在收到内容里面显示内容, 同时, 你可以选择是字符串还是十六制的形式的查看返回的内容。这样就可以根据实际情况来看看这个测试整个网络回路是否正确。

二、通过串口发送字符串或者十六进制数据, 那么你只要在发送内容里面内填入相应的内容, 同时勾选串口, 选择哪个串口 (例如:COM1, COM2等等) , 然后, 输入波特率, 数据位, 奇偶校验, 停止位, 就可以测试对应的串口连接的终端了。同时, 你可以选择是字符串还是十六制的形式的查看返回的内容。这样就可以根据实际情况来看看这个测试整个串口回路是否正确。

主要代码简单说明:

使用串口主要代码:

通过上述的代码和功能, 你可以看到使用C#可以方便简单迅速的开发出满足实际工程需要的软件《网络串口测试工具》, 由于该软件是为了公司特别开发定制的, 在拼接墙工程中为开工程, 集成开发带了很多方便, 是一款实用性很强的工程软件。

摘要:本文主要是介绍一款用C#技术开发《网络串口测试工具》的软件, 该软件是为了满足拼接墙工程实际测试, 应用, 集成过程中一些需求而使用C#技术快速开发出来的软件。这款软件的特点是实用, 简单, 同时应用C#开发软件方便, 稳定, 高效。

关键词:C#,TCP,UDP,串口,工程测试

参考文献

[1]David B.Makofske, Michael J.Donahoo, Kenneth L.Calvert, TCP/IP Sockets in C#-Practical Guide for Programmers, Elsevier Inc.2004

上一篇:角色培养下一篇:级部主任