我正在使用名为AntConc的语料库语言学工具,在这里你有一个文档,其中每个单词都被标记为词性(名词,形容词等),并且你使用特定的命令来提取匹配。例如,如果我正在寻找一个名词(标记为NN),我会使用*_NN
,它会找到文档中的每个名词。
我需要将*_TAG
语法翻译成python正则表达式,我不知道该怎么做。例如,我有一个短语:*_PP$ *_NN *_DT *_JJ *_NN
(这转换为所有格代词,名词,限定词,形容词,名词;它会以TAG格式找到“她的声音完全重复”之类的东西)。
如何将这样的事情转变为正则表达式?现在,我将采取基本的东西。后来我会担心如何做“或”以及“如果这样那么”等等。
如果您需要有关标签的更多信息,请尝试搜索POS标签CLAWS,它应该为您提供一个列表。
非常感谢你的帮助!
答案 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
要做“未知数量的未知单词”你会这样做:
[\w-]+_PP\$\W+[\w-]+_NN\W+[\w-]+_DT\W+[\w-]+_JJ\W+[\w-]+_NN
因此匹配单词(?:[\w-]+\W+)*?
的部分和[\w-]+
之间的部分被包装到非捕获组\W+
中,并且该组被称为0或更多使用(?:...)
的次数尽可能少*
次,以避免 greediness 。您可以看到 here 并删除或添加X以查看它仍然匹配。