如何删除不需要的字符并仅保留带有POS标签的实际单词?

问题描述

使用Python,我已将文本文件数据的大块拆分为多个句子,并将其分成以下列表(“我的列表”)。我需要弄清楚如何仅提取单词令牌及其关联的POS标签包括在句子中)。我的目标是采用如下所示的双字型结构:[['Football','NNP'),('Baltimore','NNP'),('pulled','NNP'),('off',' IN'),('a','IN'),('胜利','NN'),('。','。'))]。我不想看到多余的单词/字符,例如“ I-NP”,“ O”和“:”。但是,可以使用句点(。)和逗号(,)。希望将它们保留在配对列表中。

我的列表:

 ['Football','NNP','I-NP','O','-',':','Baltimore','B-ORG','pulled','off','IN','I-PP','a','victory','NN','.','O']

我想这样看,但不确定如何到达那里:

 [('Football','NNP'),('Baltimore',('pulled',('off','IN'),('a',('victory','NN'),('.','.')]

解决方法

如果您可以描述要保留的键和值使用哪些行,则此问题非常基本。在这里查看数据,看来您想排除输入列表中的项目:

  1. 不仅仅是字母和'。'
  2. 只是字母'O'

在排除不需要的项目之后,字典项目的键和值就是成对的... [K,V,K,V ...]。如果事实证明这并不适合您的所有数据,那么您需要找出正确的选择标准,删除除要创建字典对的行以外的所有行。

以下是使用以上条件为您提供所需代码的代码:

data = ['Football','NNP','I-NP','O','-',':','Baltimore','B-ORG','pulled','off','IN','I-PP','a','victory','NN','.','O']

data = [x for x in data if re.match(r"^[a-zA-Z.]+$",x) and x != 'O']

result = []
for i in range(0,len(data),2):
     result.append({data[i]: data[i+1]})

print(result)

结果:

[{'Football': 'NNP'},{'Baltimore': 'NNP'},{'pulled': 'NNP'},{'off': 'IN'},{'a': 'IN'},{'victory': 'NN'},{'.': '.'}]