如何改变词组动词的词序

2024-06-09 04:41:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有POS标记的平行语料库文本文件,我想在这个文件中进行单词重新排序,这样“可分离短语动词粒子”将出现在短语动词的“动词”旁边(“make up a plan”而不是“make a plan up”)。用于统计机器翻译系统中的预处理。以下是POS标记文本文件中的一些示例行:

  1. 你的意思是我们应该把他们踢出去。在
  2. 在你说“你”之前,不要把“你”的“它”拿走。在
  3. 请帮我把这个人弄出来。在
  4. 把它关掉!_. 在

我想把所有的粒子(在例子中:out_RP,off_RP,out_RP,down_RP)移到最接近的前一个动词(即,与粒子结合构成短语动词的动词)的旁边。以下是更改词序后的线条:

  1. 你的意思是我们应该把他们踢出去。在
  2. 不要把你的VB从PRP上取下来,直到你说出来为止。在
  3. 请你帮我把这个人弄出来。在
  4. 把你的VBZ关了!_. 在

到目前为止,我已经尝试使用python和正则表达式通过使用关于芬德尔公司名称:

import re 

file=open('first100k.txt').read()
matchline3='\w*_VB.?\s\w*_DT\s\w*_NN\s\w*_RP'
wordorder1=re.findall(matchline3,file)
print wordorder1

这将找到词序为1的所有短语动词(见下文),但这是我所能找到的,因为我不知道如何移动动词旁边的粒子。有什么想法可以正确地解决这个问题(不一定要使用python和regex)?我希望能够搜索所有短语动词,并按以下词序移动粒子:

(使用的标记取自Penn Treebank标记集(http://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html)(x表示可选字符,以便包括所有动词形式,而*表示通配符)

  1. *_VBx+*\u DT+*\u NN+*\u RP
  2. *_VBx+*\u DT+*\u NNS+*\u RP
  3. *_VBx+*\u DT+*\ujj+*\u NN+*\u RP
  4. *\em>VBx+*\u DT+*.JJ+*\u NNS+*\u RP

  5. *\u VBx+*\u PRP$+*\u NN+*\u RP

  6. *_VBx+*\u PRP$+*\u NNS+*\u卢比
  7. *_VBx+*\u PRP$+*\JJ+*\u NN+*\u RP
  8. *\em>VBx+*\u PRP$+*\u NNS+*\u RP

  9. *\u VBx+*\u NNP+*\u RP

  10. *\u VBx+*\u JJ+*\u NNP+*\u RP

  11. *\u VBx+*\u NNPS+*\u RP

  12. *\u VBx+*\u PRP+*\u RP

提前感谢您的帮助!


Tags: 标记posmakedt粒子动词nnrp
1条回答
网友
1楼 · 发布于 2024-06-09 04:41:15

我不建议在这里使用正则表达式。它绝对不像在空白处拆分后遍历每一行,可能重新排列列表,最后连接起来那样直观。你可以试试这样的方法

reordered_corpus = open('reordered_corpus.txt', 'w')
with open('corpus.txt', 'r') as corpus:
    for phrase in corpus:
        phrase = phrase.split()                 # split on whitespace
        vb_index = rp_index = -1                # variables for the indices
        for i, word_pos in enumerate(phrase):
            pos = word_pos.split('_')[1]        # POS at index 1 splitting on _
            if pos == 'VB' or pos == 'VBZ':     # can add more verb POS tags
                vb_index = i
            elif vb_index >= 0 and pos == 'RP': # or more particle POS tags
                rp_index = i
                break                           # found both so can stop
        if vb_index >= 0 and rp_index >= 0:     # do any rearranging
            phrase = phrase[:vb_index+1] + [phrase[rp_index]] + \
                     phrase[vb_index+1:rp_index] + phrase[rp_index+1:]
        reordered_corpus.write(' '.join(word_pos for word_pos in phrase)+'\n')
reordered_corpus.close()

使用此代码,如果corpus.txt读取

^{pr2}$

运行后,reordered_corpus.txt将是

you_PRP mean_VBP we_PRP should_MD kick_VB out_RP them_PRP ._.
don_VB 't_NNP take_VB off_RP it_PRP until_IN I_PRP say_VBP so_RB ._.
please_VB help_VB out_RP the_DT man_NN ._.
shut_VBZ down_RP it_PRP !_.

相关问题 更多 >