自然语言句子生成

#1
大家好,作为本论坛的新人,向诸位请教一个问题。
我的研究需要生成简单句的英语自然语言句子描述。
输入:设定好的单词并带有POS限定,如“lion-NP-subject;zoo-PP-preposition phrase;live-VP-verb;in-prep”.
输出:“lion lives in zoo.”
请问有什么好的方法、工具或者可直接调用的API?
十分感谢。
 

李亮1975重庆

语料库快乐军政委
#2
1个EXE,1个DLL,3个VBS,及其源代码,还有1个样本文件

1个EXE,1个DLL(含有两个API),3个VBS,及其源代码,还有1个样本文件
(欢迎大家玩玩)


首先观察你呈现的“输入”和“输出”的演示,发现:(1)每个词及其标注之后总是以英语分号结尾,但是最后一个没有以英文分号结尾,这里为了把问题简单化,我假设你的输入句子都是以英语分号结束的,包括最后一个单词;(2)你输出的句子竟然自动做了单词顺序的智能化调整,这应该是另一个专门的模块来做的,这里为了把问题简单化,我假设你的输入句子都是无需进行单词顺序的智能化调整的;(3)动词live竟然被智能化地加上了s这个第三人称的一般现在时的语法变形,但是,蹊跷的是,lion和zoo却没有冠词或相应的语法变化,
这应该是另一个专门的模块来做的,为了把问题简单化,我假设你的输入句子都是无需进行各种语法变形或已经进行了语法变形的输入。有了这些假设,那么就是制作一个“语法标注标签的自动脱离器”了。

在以上基础上,我用VBScript做了3个vbs文件,它们都相当于是一个独立的EXE,双击即可运行,VBScript是Windows管理与服务器端网页编程的语言。

【1】语法标志过滤器 自动版.vbs 这个文件,双击运行,它自动读取它所在的当前文件夹的input.txt,它假设input.txt的里面是大量的你指定的那种类型的语法标注的句子,每个句子占一个自然段,下一个句子总是在下一行,中间可以出现“空白自然段”;这个程序运行完毕,并不弹出任何对话框,这是为了更方便被其他程序调用而持续反复安静地运行;在编程情况下,后台检测
wscript.exe是否运行完毕即可知道是否它运行完毕了;

【2】语法标志过滤器 交互版.vbs 这个文件,双击运行,它立即弹出第1个对话框,让你输入“键入或粘贴 input文件的完整路径”,你输入且确定之后,
它就弹出第2个对话框,让你输入“键入或粘贴 output文件的完整路径”,处理完毕它也不提示,你自己查看“任务管理器”的wscript.exe这个程序没有运行了或消失了就说明任务结束了;

【3】语法标志过滤器 参数传递版.vbs
这个文件,双击运行它就弹出运行出错的提示框,因为它应该被你以编程方式或手工方式传递两个参数,第一个参数是“输入文件的完整路径”,第二个参数是“输出文件的完整路径”,你可以在“开始菜单”的“运行”框来手工输入两个参数,也可以新建一个纯文本文件来制作一个DOS批处理文件来传递参数,你甚至可以新建一个“快捷方式”进而点右键而修改它的运行属性来实现传递两个参数;在编程情况下,或手工运行情况下,后台检测或肉眼观察wscript.exe是否运行完毕即可知道是否它运行完毕了;

【4】语法标志过滤器 EXE版.exe
这个文件是用Visual Basic 6.0开发的,双击运行它,就是正常的软件的界面,有一个“执行按钮”,有一个驱动器选择框,有一个文件夹选择框,还有一个文件选择框,通过它们三,选定了某个txt文件之后,点“执行”按钮就自动处理了,输出结果也是这个EXE所在的当前文件夹的output.txt;处理完毕,它会提醒“结果已经保存到当前文件夹的output.txt”;

【5】语法标志过滤器.dll 这是用Visual Basic 6.0开发的标准DLL,能提供两个API函数,这两个函数分别是Function filter_a_sentence(string_tmp)和Sub filter_a_file(Filepath_in, Filepath_out),它俩都属于myfilter这个类,所以你在主流编程语言中可以注册且加载这个DLL,然后声明使用其中的myfilter这个类,把它对象化就能调用这两个函数了,而第2个函数没有返回值,它只是执行;

【6】源代码:语法标志过滤器_EXE版 这个文件夹是
“语法标志过滤器 EXE版.exe”的VB6的源代码和配套的工程文件;

【7】语法标志过滤器.dll 的源代码见“附录一“

以上的VBS文件都可以点右键,选择”编辑“就”查看源代码或修改它“了!这个帖子的6个附件如果不能下载或不方便下载,可以给我来信 492130980@qq.com

附录一 语法标志过滤器.dll 的源代码

Function filter_a_sentence(string_tmp)
' 本模块是处理一个句子
array_a = Split(string_tmp, ";")
string_number = UBound(array_a)
For index = 0 To string_number - 1
string_tmp = array_a(index)
position = InStr(1, string_tmp, "-")
array_a(index) = Left(string_tmp, position - 1)
Next
filter_a_sentence = Join(array_a, " ")
End Function

sub filter_a_file(Filepath_in, Filepath_out)
' 本模块是处理一个文件
set fso1=createobject("scripting.filesystemobject")
set file1=fso1.opentextfile(Filepath_in)
set file2=fso1.createtextfile(Filepath_out)
do
newline=file1.readline
if instr(trim(newline),";")>0 then file2.writeline filter_a_sentence(newline)
loop until file1.atEndOfStream
file1.close
file2.close
set file1=nothing
set file2=nothing
set fso1=nothing
End sub

附录二 语法标志过滤器 自动版.vbs的源代码

filter_a_file ".\input.txt",".\output.txt"

Function filter_a_sentence(string_tmp)
' 本模块是处理一个句子
array_a = Split(string_tmp, ";")
string_number = UBound(array_a)
For index = 0 To string_number - 1
string_tmp = array_a(index)
position = InStr(1, string_tmp, "-")
array_a(index) = Left(string_tmp, position - 1)
Next
filter_a_sentence = Join(array_a, " ")
End Function

sub filter_a_file(Filepath_in, Filepath_out)
' 本模块是处理一个文件
set fso1=createobject("scripting.filesystemobject")
set file1=fso1.opentextfile(Filepath_in)
set file2=fso1.createtextfile(Filepath_out)
do
newline=file1.readline
if instr(trim(newline),";")>0 then file2.writeline filter_a_sentence(newline)
loop until file1.atEndOfStream
file1.close
file2.close
set file1=nothing
set file2=nothing
set fso1=nothing
End sub


附录三 语法标志过滤器 交互版.vbs的源代码

file1path=inputbox("键入或粘贴", "input文件的完整路径", "")
file2path=inputbox("键入或粘贴", "output文件的完整路径", "")
filter_a_file file1path, file2path

Function filter_a_sentence(string_tmp)
' 本模块是处理一个句子
array_a = Split(string_tmp, ";")
string_number = UBound(array_a)
For index = 0 To string_number - 1
string_tmp = array_a(index)
position = InStr(1, string_tmp, "-")
array_a(index) = Left(string_tmp, position - 1)
Next
filter_a_sentence = Join(array_a, " ")
End Function

sub filter_a_file(Filepath_in, Filepath_out)
' 本模块是处理一个文件
set fso1=createobject("scripting.filesystemobject")
set file1=fso1.opentextfile(Filepath_in)
set file2=fso1.createtextfile(Filepath_out)
do
newline=file1.readline
if instr(trim(newline),";")>0 then file2.writeline filter_a_sentence(newline)
loop until file1.atEndOfStream
file1.close
file2.close
set file1=nothing
set file2=nothing
set fso1=nothing
End sub

附录四 语法标志过滤器 参数传递版.vbs的源代码

Set parameters = WScript.Arguments

file1path=parameters(0)
file2path=parameters(1)
filter_a_file file1path, file2path

Function filter_a_sentence(string_tmp)
' 本模块是处理一个句子
array_a = Split(string_tmp, ";")
string_number = UBound(array_a)
For index = 0 To string_number - 1
string_tmp = array_a(index)
position = InStr(1, string_tmp, "-")
array_a(index) = Left(string_tmp, position - 1)
Next
filter_a_sentence = Join(array_a, " ")
End Function

sub filter_a_file(Filepath_in, Filepath_out)
' 本模块是处理一个文件
set fso1=createobject("scripting.filesystemobject")
set file1=fso1.opentextfile(Filepath_in)
set file2=fso1.createtextfile(Filepath_out)
do
newline=file1.readline
if instr(trim(newline),";")>0 then file2.writeline filter_a_sentence(newline)
loop until file1.atEndOfStream
file1.close
file2.close
set file1=nothing
set file2=nothing
set fso1=nothing
End sub


附录五 语法标志过滤器 EXE版.exe的源代码

Function filter_a_sentence(string_tmp)
' 本模块是处理一个句子
array_a = Split(string_tmp, ";")
string_number = UBound(array_a)
For Index = 0 To string_number - 1
string_tmp = array_a(Index)
position = InStr(1, string_tmp, "-")
array_a(Index) = Left(string_tmp, position - 1)
Next
filter_a_sentence = Join(array_a, " ")
End Function

Sub filter_a_file(Filepath_in, Filepath_out)
' 本模块是处理一个文件
Open Filepath_in For Input As #1
Open Filepath_out For Output As #2
Do
Line Input #1, newline
If InStr(Trim(newline), ";") > 0 Then Print #2, filter_a_sentence(newline)
Loop Until EOF(1)
Close #1, #2
End Sub

Private Sub Command1_Click()
If Right(File1.Path, 1) <> "\" Then
filter_a_file File1.Path & "\" & File1.FileName, File1.Path & "\" & "output.txt"
Else
filter_a_file File1.Path & File1.FileName, File1.Path & "output.txt"
End If
MsgBox "结果已经保存到当前文件夹的output.txt!", vbInformation, "处理完毕"
End Sub

Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub

Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub

附录六 样本.txt的内容

lion-NP-subject;live-VP-verb;in-prep;zoo-PP-preposition phrase;
I-pron-subject;love-VP-verb;you-pron-object;
I-pron-subject;love-VP-verb;you-pron-object;very-adv-modifier;much-adv-modifier;



 

附件

顶部