camxes的Python接口。
项目描述
要安装,您需要一个Java运行时环境,作为您的$PATH上的java命令,Python 2.6+(包括3.1)和python-setuptools(或distribute)。然后您可以使用easy_install或pip从PyPI安装此软件包,或者将其作为您自己的setup.py中的依赖项安装。解析器本身已包含在此软件包中,所以您无需担心这一点。
easy_install camxes
解析Lojban
函数parse()返回一个命名节点解析树。
>>> import camxes >>> print camxes.parse("coi rodo") text `- free +- CMAVO | `- COI | `- u'coi' `- sumti5 +- CMAVO | `- PA | `- u'ro' `- CMAVO `- KOhA `- u'do'
使用属性lojban将树转换回Lojban。
>>> camxes.parse("coi rodo!").lojban u'coi ro do'
这会将叶子节点用空格连接起来,但您可以通过将spaces=True传递给parse()来保留空格和标点符号。
>>> camxes.parse("coi rodo!", spaces=True).lojban u'coi rodo!'
可以通过名称作为属性访问子节点,得到一个这样的节点列表。如果没有带有该名称的子节点,则引发异常。
>>> print camxes.parse("coi rodo").free[0].sumti5[0].CMAVO[1] CMAVO `- KOhA `- u'do'
您还可以不提供名称而按顺序位置访问节点。
>>> print camxes.parse("coi rodo")[0][1] sumti5 +- CMAVO | `- PA | `- u'ro' `- CMAVO `- KOhA `- u'do'
节点遍历其子节点。
>>> list(camxes.parse("coi rodo")[0][1]) [<CMAVO {ro}>, <CMAVO {do}>]
它们还知道自己的名称。
>>> camxes.parse("coi rodo")[0][1].name u'sumti5'
验证语法有效性
parse() 能够通过处理尽可能多的语法正确的输入来解析一些不规则的输入。因此,它不适合检查某些文本的语法是否正确。为此,有一个 isgrammatical() 断言。
>>> camxes.isgrammatical("coi rodo") True >>> camxes.isgrammatical("mupli cu fliba") False >>> print camxes.parse("mupli cu fliba") text `- BRIVLA `- gismu `- u'mupli'
将复合词分解为词缀
decompose() 可以给出复合词的词缀和连字符。
>>> camxes.decompose("genturfa'i") (u'gen', u'tur', u"fa'i")
它会对不是单个、有效复合词的输入进行投诉。
>>> camxes.decompose("camxes") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid compound 'camxes'
仅解析形态
与 parse() 类似,morphology() 函数。
>>> print camxes.morphology("coi") text `- CMAVO `- COI +- c | `- u'c' +- o | `- u'o' `- i `- u'i'
树遍历
使用 find() 方法搜索具有任意数量参数的节点,这些参数将与节点名称进行通配符匹配。此操作将递归地遍历每个分支,直到找到匹配项,但不会搜索匹配节点的子节点。
>>> camxes.parse("coi rodo").find('sumti*') (<sumti5 {ro do}>,)
>>> camxes.parse("coi rodo").find('PA', 'KOhA') (<PA {ro}>, <KOhA {do}>)
在节点上的键访问是查找第一次匹配的快捷方式。
>>> camxes.parse("la camxes genturfa'i fi la lojban")['cmene'] <cmene {camxes}>
leafs 属性是所有叶节点的元组,应该是Unicode词素。
>>> camxes.parse("coi rodo").leafs (u'coi', u'ro', u'do')
branches() 方法找到叶节点与参数匹配的节点的父节点。这允许您搜索一个序列的词素所属的分支。
>>> camxes.parse("lo ninmu cu klama lo tcadu").branches("lo") (<sumti6 {lo ninmu}>, <sumti6 {lo tcadu}>) >>> camxes.parse("lo ninmu cu klama lo tcadu").branches("ninmu") (<sumti6 {lo ninmu}>,) >>> camxes.parse("lo ninmu cu klama lo tcadu").branches("klama", "lo", "tcadu") (<sentence {lo ninmu cu klama lo tcadu}>,)
这些操作的泛化称为 filter(),它接受一个断言函数,该函数决定一个节点是否应被列出。由于 filter() 是一个生成器,所以我们在这里使用 list() 来查看结果。
>>> leafparent = lambda node: not isinstance(node[0], camxes.Node) >>> list(camxes.parse("coi rodo").filter(leafparent)) [<COI {coi}>, <PA {ro}>, <KOhA {do}>]
树转换
您可以将节点递归地转换为一个字符串元组,其中第一个项目是节点的名称,其余的是子节点。这个属性被称为 primitive,如果您正在将解析树序列化到一个更“笨拙”的格式(如JSON)时,这可能很有用。
>>> from pprint import pprint >>> pprint(camxes.parse("coi rodo").primitive) (u'text', (u'free', (u'CMAVO', (u'COI', u'coi')), (u'sumti5', (u'CMAVO', (u'PA', u'ro')), (u'CMAVO', (u'KOhA', u'do')))))
>>> import json >>> print json.dumps(camxes.parse("coi").primitive, indent=2) [ "text", [ "CMAVO", [ "COI", "coi" ] ] ]
primitive 的泛化称为 map(),它接受一个转换函数,该函数接受一个节点。然后递归地将转换映射到所有节点,并返回一个类似 primitive 的嵌套元组。
>>> camxes.parse("coi rodo").map(len) (1, (2, (1, (1, 3)), (2, (1, (1, 2)), (1, (1, 2)))))
项目详情
camxes-0.2.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | f056027fdb3f8aa942dd49ada0b33a2ea6bf285c16ae7e7d7c073f60142012e6 |
|
MD5 | 15173336e9e6048fe72aec540c7744db |
|
BLAKE2b-256 | 6a6c0cfdb2632b82146ac2c44bf4ba11110109e2a8a3d75f8152ca51205fd070 |