【发布时间】: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