从TAG格式翻译到语料库的Regex

时间:2015-04-20 15:15:10

标签: python regex

我正在使用名为AntConc的语料库语言学工具,在这里你有一个文档,其中每个单词都被标记为词性(名词,形容词等),并且你使用特定的命令来提取匹配。例如,如果我正在寻找一个名词(标记为NN),我会使用*_NN,它会找到文档中的每个名词。

我需要将*_TAG语法翻译成python正则表达式,我不知道该怎么做。例如,我有一个短语:*_PP$ *_NN *_DT *_JJ *_NN(这转换为所有格代词,名词,限定词,形容词,名词;它会以TAG格式找到“她的声音完全重复”之类的东西)。

如何将这样的事情转变为正则表达式?现在,我将采取基本的东西。后来我会担心如何做“或”以及“如果这样那么”等等。

如果您需要有关标签的更多信息,请尝试搜索POS标签CLAWS,它应该为您提供一个列表。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

所以我做了一些研究,发现this PDF file描述了嵌入式标签和非嵌入式标签的概念。您正在寻找嵌入式标签。所以,如果我是正确的,那么输入会是这样的吗?

  

her_PP $ voice_NN an_DT exact_JJ duplicate_NN

只有在更大的文本中你才知道实际的单词,你才知道_XX标签。

在正则表达式中,您必须比*更具体。在*的位置你想要的是一个或多个任何一个单词的字符(字母,但也可能包含连字符?)。这使得这个名词:

[\w-]+_NN

这意味着character class [...] word characters \w和连字符-repeated one or more times +,后跟_NN

对于所有格代词,它有一个$,在正则表达式中有特殊含义,如果你想要字符 $而不是它的特殊含义,你需要使用前面的\来逃避它:

[\w-]+_PP\$

最后,您要考虑单词之间允许哪些字符。可能只是像空格,制表符和输入一样的空格,这将是\s+。也可以“任何不是单词字符的字符”以允许句点,逗号,引号,冒号等。这将是\W+(注意大写{{1} }与小写W)相反。

这相当于这个:

\w

Regular expression visualization

Debuggex Demo

要做“未知数量的未知单词”你会这样做:

[\w-]+_PP\$\W+[\w-]+_NN\W+[\w-]+_DT\W+[\w-]+_JJ\W+[\w-]+_NN

因此匹配单词(?:[\w-]+\W+)*? 的部分和[\w-]+之间的部分被包装到非捕获组\W+中,并且该组被称为0或更多使用(?:...)的次数尽可能少*次,以避免 greediness 。您可以看到 here 并删除或添加X以查看它仍然匹配。