【问题标题】:Why is pre-processing causing me to lose dictionary keys?为什么预处理会导致我丢失字典键?
【发布时间】:2017-04-01 18:28:46
【问题描述】:

有一个非常奇特的问题。 extract 函数接受一个 XML 文件,并使用餐厅评论作为键生成一个字典。在这里,我在将文本用于情感分析时对文本进行了一些基本的预处理:文本被标记,标点符号被删除,并且在重新插入到字典之前它是“未标记的”。

import string
from nltk.tokenize import word_tokenize, RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')

def preprocess(file):
    d = extract(file)
    for text in list(d.keys()):
        tokenized_text = tokenizer.tokenize(text)
        text2 = ''.join([" "+i if not i.startswith("'") and i not in string.punctuation else i for i in tokenized_text]).strip()
        d[text2] = d.pop(text) 
    return d

在 675 条评论中,有 2 条在此功能运行后丢失。这些都是“很棒的服务”。和“美味”。我希望这些会按原样返回,除了句号应该从第一个中删除。

供参考,extract 函数:

from collections import OrderedDict, defaultdict
import xml.etree.ElementTree as ET

def extract(file):

    tree = ET.parse(file)
    root = tree.getroot()

    if file == 'EN_REST_SB1_TEST.xml':
        d = OrderedDict()
        for sentence in root.findall('.//sentence'):
            opinion = sentence.findall('.//Opinion')
            if opinion == []:
                text = sentence.find('text').text
                d[text] = 0

        return d 

如果有人熟悉 SemEval ABSA 任务,您会注意到我以一种有点迂回的方式完成了这项工作,没有使用 XML 中的 id 标签,但我更愿意坚持我的方式完成了。

【问题讨论】:

  • 您将评论用作键,这意味着您将丢失所有重复项。难道这些非常短评论出现了两次?
  • 是的 - 就是这样。现在想起来很明显。最好的选择是什么?
  • 修正您的方法,使其符合您的目标。我只是将它们收集在一个列表中,但我不能肯定地说,因为我不知道您要完成什么,为什么使用值作为键,或者为什么您关心重复项会丢失。也许问一个新问题来解释任务并要求正确的数据结构?

标签: python nltk tokenize sentiment-analysis


【解决方案1】:

您将评论用作键,这意味着您将丢失所有重复项。显然,这些非常简短的评论出现了两次。

我想不出任何理由使用评论作为关键,特别是如果您关心保留重复项。那么为什么不把它们收集到一个列表中呢?

d = []
...
d.append(text)

【讨论】:

  • 已经利用 XML 中的语句 id 属性作为键,我应该从一开始就这样做。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多