【发布时间】:2018-07-25 19:01:54
【问题描述】:
这里是 Python 新手:
我有一个如下所示的文本文件:
{'{http://www.omg.org/XMI}id': '18836', 'sofa': '12', 'begin': '27', 'end': '30', 'Character': 'Jonathan'}
{'{http://www.omg.org/XMI}id': '18836', 'sofa': '12', 'begin': '27', 'end': '30', 'Character': 'Jonathan'}
{'{http://www.omg.org/XMI}id': '18828', 'sofa': '12', 'begin': '31', 'end': '37', 'Character': 'Joyce'}
{'{http://www.omg.org/XMI}id': '18828', 'sofa': '12', 'begin': '31', 'end': '37', 'Character': 'Joyce'}
{'{http://www.omg.org/XMI}id': '18918', 'sofa': '12', 'begin': '81', 'end': '95', 'Character': 'Will'}
{'{http://www.omg.org/XMI}id': '19012', 'sofa': '12', 'begin': '155', 'end': '158', 'Character': 'Jonathan'}
{'{http://www.omg.org/XMI}id': '19050', 'sofa': '12', 'begin': '239', 'end': '242', 'Character': 'Nancy'}
{'{http://www.omg.org/XMI}id': '19111', 'sofa': '12', 'begin': '845', 'end': '850', 'Character': 'Steve'}
等等
我希望能够计算独特角色的名称并计算它们的出现次数。如:忽略每一行中的所有内容,直到字符串 'Character': ,因此只考虑字符的名称。
到目前为止,在尝试了许多其他方法(包括 RegEx)之后,我得到了这段代码,但没有得到想要的结果(它打印并计算所有内容):
import re
from collections import Counter
import tkFileDialog
filename = tkFileDialog.askopenfilename()
f = open(filename, "r")
lines = f.readlines()
f.close()
cnt = Counter()
for line in lines:
cnt[line.split("'Character':", 2)] +=1
print cnt
print sum(cnt.values())
最佳输出应该是这样的:
Jonathan: 3
Joyce: 2
Will: 1
Nancy: 1
Steve: 1
任何形式的帮助或提示将不胜感激!
编辑:上面的文本文件是从一个 .xmi 文件生成的,该文件的信息不易阅读。正如我在对以下答案之一的评论中提到的那样:这是我第一次尝试以视觉方式表示想要的组合信息的方法。我不确定是否有更好的方法来表示这些数据,而不是在文本文件中能够使用它。可以为此创建一个新的 .xmi 文件吗?
因此,根据要求,这是我将 .xmi 文件生成到文本文件的代码:
# coding: utf-8
# In[ ]:
import xml.etree.cElementTree as ET
from xml.etree.ElementTree import (Element, ElementTree, SubElement, Comment, tostring)
ET.register_namespace("pos","http:///de/tudarmstadt/ukp/dkpro/core/api/lexmorph/type/pos.ecore")
ET.register_namespace("tcas","http:///uima/tcas.ecore")
ET.register_namespace("xmi","http://www.omg.org/XMI")
ET.register_namespace("cas","http:///uima/cas.ecore")
ET.register_namespace("tweet","http:///de/tudarmstadt/ukp/dkpro/core/api/lexmorph/type/pos/tweet.ecore")
ET.register_namespace("morph","http:///de/tudarmstadt/ukp/dkpro/core/api/lexmorph/type/morph.ecore")
ET.register_namespace("dependency","http:///de/tudarmstadt/ukp/dkpro/core/api/syntax/type/dependency.ecore")
ET.register_namespace("type5","http:///de/tudarmstadt/ukp/dkpro/core/api/semantics/type.ecore")
ET.register_namespace("type6","http:///de/tudarmstadt/ukp/dkpro/core/api/syntax/type.ecore")
ET.register_namespace("type2","http:///de/tudarmstadt/ukp/dkpro/core/api/metadata/type.ecore")
ET.register_namespace("type3","http:///de/tudarmstadt/ukp/dkpro/core/api/ner/type.ecore")
ET.register_namespace("type4","http:///de/tudarmstadt/ukp/dkpro/core/api/segmentation/type.ecore")
ET.register_namespace("type","http:///de/tudarmstadt/ukp/dkpro/core/api/coref/type.ecore")
ET.register_namespace("constituent","http:///de/tudarmstadt/ukp/dkpro/core/api/syntax/type/constituent.ecore")
ET.register_namespace("chunk","http:///de/tudarmstadt/ukp/dkpro/core/api/syntax/type/chunk.ecore")
ET.register_namespace("custom","http:///webanno/custom.ecore")
def sofa(annotation):
f = open(annotation)
tree = ET.ElementTree(file=f)
root = tree.getroot()
node = root.find("{http:///uima/cas.ecore}Sofa") # we remove cas:View
return node.attrib['sofaString']
path ="valhalla.xmi"
with open(path, 'r', encoding="utf-8") as filename:
tree = ET.ElementTree(file=filename)
root = tree.getroot()
ns = {'emospan': 'http:///webanno/custom.ecore',
'id':'http://www.omg.org/XMI',
'relspan': 'http:///webanno/custom.ecore',
'sentence': 'http:///de/tudarmstadt/ukp/dkpro/core/api/segmentation/type.ecore',
'annotator': "http:///de/tudarmstadt/ukp/dkpro/core/api/metadata/type.ecore"}
my_id = '{http://www.omg.org/XMI}id'
top = Element('corpus', encoding="utf-8")
text = sofa(path).replace("\n"," ")
def stimcount():
with open('results.txt', 'w') as f:
for rel_node in root.findall("emospan:CharacterRelation",ns):
if rel_node.attrib['Relation']=="Stimulus":
source = rel_node.attrib['Governor']
target = rel_node.attrib['Dependent']
for span_node in root.findall("emospan:CharacterEmotion",ns):
if span_node.attrib[my_id]==source:
print(span_node.attrib['Emotion'])
if span_node.attrib[my_id]==target:
print(span_node.attrib)
print(span_node.attrib, file=f)
【问题讨论】:
-
您的文本文件似乎是 json 格式。使用 json 包可能会更容易读取键/值对,然后是实际的文本数据。
-
@Karl 它不是 json,因为它使用单引号。
-
您可以做的是使用正则表达式来捕获名称,然后尝试将名称作为键添加到字典中。如果成功,则将值设置为 1。如果失败,则找到具有该名称的键并增加值。
-
@nosklo 我真的不知道 json - 这是唯一的区别吗?那么使用json或者pandas from_json应该是简单的字符替换问题吧?
-
@SpghttCd 这是我在示例数据中可以看到的唯一区别 - 但根据字典内容可能存在其他差异。正确的解决方法是首先生成一个 json!
标签: python regex file count unique