【问题标题】:Translate from TAG format to Regex for Corpus将 TAG 格式转换为语料库的正则表达式
【发布时间】:2015-04-20 15:15:10
【问题描述】:

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

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

如何将这样的事情更改为正则表达式?现在,我将只接受那些基本的东西。稍后我会担心弄清楚如何做“或”和“如果这样,那么这样”等等。

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

非常感谢您的帮助!

【问题讨论】:

  • 发布示例输入以及预期输出。
  • 您好!我不是用 *_PP$ *_NN *_DT *_JJ *_NN = "所有格代词、名词、限定词、形容词、名词;'她的声音完全重复'"吗?你能更清楚你想要什么吗?我对python不太了解。谢谢!
  • @CarrieOtt 不清楚你想要什么。您想使用正则表达式将标签翻译成更易读的形式吗?或者您想构建一个与 POS 标签等效的正则表达式?请添加一些输入和预期输出以供我们理解。
  • 您好!是的,我想构建一个与 POS 标签等效的正则表达式。只是我不知道从哪里开始这样做。很抱歉造成混淆!下面的答案似乎有你要找的输入输出示例。

标签: python regex


【解决方案1】:

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

her_PP$ voice_NN an_DT exact_JJ duplicate_NN

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

在正则表达式中,您必须比* 更具体。您想要代替 * 的是 1 个或多个作为单词一部分的任何字符(字母,但也可能包含连字符?)。这就是名词:

[\w-]+_NN

这表示word characters \w 中的character class [...] 和连字符-repeated one or more times +,后跟_NN

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

[\w-]+_PP\$

最后,您要考虑在单词之间允许使用哪些字符。可能只是空格、制表符和回车之类的空格,即\s+。也可以是 "任何不是单词字符的字符" 以允许使用句点、逗号、引号、冒号等。那将是 \W+(注意大写的 W 是与小写\w相反)。

加起来就是这样:

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

Debuggex Demo

要做到“未知数量的未知单词”,你可以这样做:

(?:[\w-]+\W+)*?

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

【讨论】:

  • 我似乎也想出了如何添加“通配符”。例如,如果我试图让“她 X X X 存在”出现(“她”标记为 PP$,“存在”标记为 VBG),我可以使用 [\w-]+_PP\$\W+[\w -]+_[\w-]\W+[\w-]+_[\w-]\W+[\w-]+_[\w-]\W+[\w-]+_VBG,我想。有没有更简单的方法来做到这一点?如果我不知道两者之间有什么词,但知道那里会有词,我会使用它。再说一次,这只有在实际上中间有三个词的情况下才有效。我还不知道如何告诉它“之间有数量不确定的未知单词”。想法?谢谢!
  • 要做到“未知数量的未知单词”,你可以这样做:(?:[\w-]+\W+)*?。因此,匹配单词[\w-]+ 的部分和介于\W+ 之间的部分被包装到一个非捕获组(?:...) 中,据说该组与* 一起出现0 次或多次,但很少尽可能使用? 避免greediness。您可以看到它 here 并删除或添加 X 以查看它仍然匹配。
  • 是否可以做“未知数量的单词不超过4个单词”?或者我猜你是否已经设置它以避免可能不必要的贪婪。我注意到的另一件事是,如果我使用 [\w-]+_NN|NNS\W+[\w-]+_JJ (JJ 是形容词),它会发现 NN 和 NNS 很好,但它们后面的并不总是 JJ .如果我拿出 |并分别运行它们,它起作用了。那是怎么回事?我做错了“或”表达吗?
  • 如果您查看我的回答中关于repeating 的链接,您可以看到关于有限重复的段落。对于最多四个,您可以使用{0,4} 而不是*(保留? 以解决贪婪问题)。
  • 对于 or 的事情,您想对作为非此即彼选项的字符进行分组,因此 [\w-]+_(?:NN|NNS) 在您的情况下。现在,对于这种特定情况,您可以执行[\w-]+_NNS?,其中? 使最后一个字符S 成为可选的。但是,如果您想要例如 "noun or adjective",那将行不通,因为这些标签是如此不同。为了清楚起见,将坚持分组/交替。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2017-09-02
  • 2011-10-02
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多