我一直在玩自然语言解析树并以各种方式操纵它们.我一直在使用斯坦福大学的Tregex和Tsurgeon工具,但代码很混乱,并不适合我的Python环境(这些工具是Java,不适合调整).我想要一个工具集,当我需要更多功能时,它可以轻松进行黑客攻击.还有其他工具非常适合在树上进行模式匹配,然后操纵那些匹配的分支吗?
例如,我想将以下树作为输入:
(ROOT
(S
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
(VP (VBD used)
(S
(VP (TO to)
(VP (VB be)
(VP (VBN called)
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP Italy)))))))))))
Run Code Online (Sandbox Code Playgroud)
和(这是一个简化的例子):
例如,采取树的这一部分:
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
Run Code Online (Sandbox Code Playgroud)
把它变成这个:
(NP
(NP (NNP Bank) (IN of) (NP (NNP America))))
Run Code Online (Sandbox Code Playgroud)
由于我的输入树是S表达式,我考虑使用Lisp(嵌入到我的Python程序中)但是我已经写了很长时间,我在Lisp中编写了一些重要内容,我不知道从哪里开始.
什么是描述模式的好方法?什么是描述操纵的好方法?什么是思考这个问题的好方法?
嘿伙计们,谢谢你的阅读
我目前正在尝试使用Google风格的计算器.您输入一个字符串,它确定是否可以计算并返回结果.
我从基础开始慢慢开始:+ - / *和括号处理.
我愿意随着时间的推移改进计算器,并且在前一段时间学习了一些关于词法分析的知识,我构建了一个令牌列表和相关的正则表达式模式.
这种工作很容易适用于Lex和Yacc等语言,除了我正在开发一个仅限Javascript的应用程序.
我试图将这个想法转录成Javascript,但我无法弄清楚如何以干净漂亮的方式处理所有内容,尤其是嵌套的括号.
让我们定义一个计算器查询:
// NON TERMINAL EXPRESSIONS //
query -> statement
query -> ? // means end of query
statement -> statement operator statement
statement -> ( statement )
statement -> prefix statement
statement -> number
number -> integer
number -> float
// TERMINAL EXPRESSIONS //
operator -> [+*/%^-]
prefix -> -
integer -> [0-9]+
float -> [0-9]+[.,][0-9]+
Run Code Online (Sandbox Code Playgroud)
词法分析包括验证没有任何东西看起来不像终端表达式之一:运算符,前缀,整数和浮点数.哪个可缩短为一个正则表达式:
(我添加了空格以使其更具可读性)
var calcPat =
/^ (\s*
( ([+/*%^-]) | ([0-9]+) …Run Code Online (Sandbox Code Playgroud) 所以,我对OCaml完全不熟悉,并且在实现我的第一个函数方面进展缓慢.我理解困难的一件事是何时使用模式匹配能力
let foo =
[] -> true
| _ -> false;;
Run Code Online (Sandbox Code Playgroud)
vs使用if else结构
let foo a =
if a = [] then true else false;;
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用?
我有一个恼人的闭源工具,它将特定信息写入其配置文件.如果您尝试在其他文件上使用配置,则会加载旧文件.哎呀...
幸运的是,配置文件是文本,因此我可以对它们进行版本控制,结果发现,如果只是从文件中删除了违规行,则不会造成任何损害.
但是该工具不断将线路放回去.所以每次我想检查配置文件的新版本时,我都必须删除包含该符号的所有行openDirFile.
我即将构建某种bash命令来在每个文件上运行grep -v,将结果存储在临时文件中,然后删除原始文件并重命名临时文件,但我想知道是否有人知道一个很好的清洁解决方案,或者已经编造并调试了类似的调用.
为了额外的功劳,如何在不破坏同一目录中的符号链接的情况下完成这项工作(favourite.rc-> signals.rc)?
复杂的标题,但这是我想要实现的一个简单的例子:
d <- data.frame(v1 = c(1,2,3,4,5,6,7,8),
v2 = c("A","E","C","B","B","C","A","E"))
m <- data.frame(v3 = c("D","E","A","C","D","B"),
v4 = c("d","e","a","c","d","b"))
Run Code Online (Sandbox Code Playgroud)
在价值d$v2应该由值来代替m$v4从值相匹配d$v2的m$v3
生成的数据框d应如下所示:
v1 v4
1 a
2 e
3 c
4 b
5 b
6 c
7 a
8 e
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的东西,我最接近的是: d$v2 <- m$v4[which(m$v3 %in% d$v2)]
我试着再次避免任何for循环!必须是可能的:-)不知怎的......;)
我想同时匹配地图中的特定键,并捕获该地图的其余部分.我希望这样的东西能起作用:
iex(10)> %{"nodeType" => type | rest} = %{"nodeType" => "conditional", "foo" => "bar"}
** (CompileError) iex:10: cannot invoke remote function IEx.Helpers.|/2 inside match
Run Code Online (Sandbox Code Playgroud)
目标是编写一组函数,这些函数在地图的某个字段上进行地图,模式匹配,并对地图的其余部分执行一些转换.
def handle_condition(%{"nodeType" => "condition" | rest}) do
# do something with rest
done
def handle_expression(%{"nodeType" => "expression" | rest}) do
# do something with rest
done
Run Code Online (Sandbox Code Playgroud)
但看起来我需要被调用者单独传递nodeType,除非我遗漏了什么.
我似乎找不到在函数头中的地图键上进行模式匹配的方法.有没有办法做到这一点?我正在尝试做的是根据某个键是否已存在于地图中而运行不同的代码(并且还想避免if/else等)
这就是我的代码
def my_func(key, %{key => _} = map), do: ...
Run Code Online (Sandbox Code Playgroud)
这给了我这个错误
**(CompileError)在映射键匹配内非法使用变量键,映射只能使用^键匹配现有变量
当然我也试过用它 ^
def my_func(key, %{^key => _} = map), do: ...
Run Code Online (Sandbox Code Playgroud)
然后给出
**(CompileError)未绑定变量^键
我在Windows 8.1机器上使用elixir 1.3.1/erlang 19.0 x64.谢谢阅读!
我喜欢pattern-matching在nullable intie 上使用int?:
int t = 42;
object tobj = t;
if (tobj is int? i)
{
System.Console.WriteLine($"It is a nullable int of value {i}");
}
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下语法错误:
'i)'标有红色波浪线.
使用旧运算符时表达式编译is:
int t = 42;
object tobj = t;
if (tobj is int?)
{
System.Console.WriteLine($"It is a nullable int");
}
string t = "fourty two";
object tobj = t;
if (tobj is string s)
{
System.Console.WriteLine($@"It is a …Run Code Online (Sandbox Code Playgroud) 他们似乎没有很好地混合:
abstract class A
case class B (var a: Int)(var b: String) extends A
case class C extends A
Run Code Online (Sandbox Code Playgroud)
以下内容不起作用:
B(1)("1") match {
case B(a)(b) => print("B")
case C() => print("C")
}
Run Code Online (Sandbox Code Playgroud)
问题是模式匹配和curried参数似乎不起作用.有解决办法吗?
我想匹配一些案例类.如果我不知道它们,我想匹配类必须扩展的指定特征.这看起来像
trait Event //root trait
trait Status extends Event //special trait
trait UIEvent extends Event //special trait
case class Results extends Event //concrete case class
case class Query extends Event //concrete case class
case class Running extends Status //concrete case class
case class Finished extends Status //concrete case class
case class Update extends UIEvent //concrete case class
Run Code Online (Sandbox Code Playgroud)
我运行以下测试
val events = List(Results, Query, Running, Finished, Update)
events foreach {
case Results => println("Got a Results")
case Running => println("Got a …Run Code Online (Sandbox Code Playgroud) pattern-matching ×10
case-class ×2
elixir ×2
scala ×2
bash ×1
c# ×1
c#-7.0 ×1
currying ×1
dataframe ×1
grep ×1
if-statement ×1
javascript ×1
lisp ×1
nlp ×1
nullable ×1
ocaml ×1
r ×1
regex ×1
replace ×1
s-expression ×1
sed ×1
stanford-nlp ×1
traits ×1