【发布时间】:2017-04-24 20:00:52
【问题描述】:
寻求有关如何从多个文本文件中挖掘项目以构建字典的建议。
此文本文件:https://pastebin.com/Npcp3HCM
被手动转换成这个需要的数据结构:https://drive.google.com/file/d/0B2AJ7rliSQubV0J2Z0d0eXF3bW8/view
有数千个这样的文本文件,它们可能有不同的部分标题,如以下示例所示:
我从阅读文件开始
from glob import glob
txtPth = '../tr-txt/*.txt'
txtFiles = glob(txtPth)
with open(txtFiles[0],'r') as tf:
allLines = [line.rstrip() for line in tf]
sectionHeading = ['Corporate Participants',
'Conference Call Participiants',
'Presentation',
'Questions and Answers']
for lineNum, line in enumerate(allLines):
if line in sectionHeading:
print(lineNum,allLines[lineNum])
我的想法是寻找节标题所在的行号,并尝试提取这些行号之间的内容,然后去掉像破折号这样的分隔符。那没有用,我陷入了尝试创建此类字典的过程中,以便以后可以对采石项目运行各种自然语言处理算法。
{file-name1:{
{date-time:[string]},
{corporate-name:[string]},
{corporate-participants:[name1,name2,name3]},
{call-participants:[name4,name5]},
{section-headings:{
{heading1:[
{name1:[speechOrderNum, text-content]},
{name2:[speechOrderNum, text-content]},
{name3:[speechOrderNum, text-content]}],
{heading2:[
{name1:[speechOrderNum, text-content]},
{name2:[speechOrderNum, text-content]},
{name3:[speechOrderNum, text-content]},
{name2:[speechOrderNum, text-content]},
{name1:[speechOrderNum, text-content]},
{name4:[speechOrderNum, text-content]}],
{heading3:[text-content]},
{heading4:[text-content]}
}
}
}
挑战在于不同的文件可能有不同的标题和标题数量。但总会有一个名为“演示”的部分,并且很可能有“问答”部分。这些部分标题总是由一串等号分隔。并且不同说话者的内容总是用一串破折号分隔。问答部分的“发言顺序”用方括号中的数字表示。参与者总是在文档的开头用星号表示,他们的名字前面有一个星号,他们的图块总是在下一行。
感谢任何关于如何解析文本文件的建议。理想的帮助是提供有关如何为每个可以写入数据库的文件生成这样一个字典(或其他合适的数据结构)的指导。
谢谢
--编辑--
其中一个文件如下所示:https://pastebin.com/MSvmHb2e
其中“问答”部分被错误标记为“演示文稿”,并且没有其他“问答”部分。
最后的示例文本:https://pastebin.com/jr9WfpV8
【问题讨论】:
-
我不建议您将所有文本数据存储在单个
dict对象中,正如您所提到的,可能需要解析大量文本文件,所以在运行中随着dict对象的大小增加,python 进程将花费更多时间来更新dict对象,并且如果您有一些非常大的文件要处理,可能会出现 OutOfMemory,我敢打赌一些DBMS来存储这种数据。 -
@ZdaR 谢谢你的建议。阅读您的评论后,我决定使用数据库。我目前正在研究 sqlalchemy
-
贴错标签不会那么容易解决。您将必须使用 ML 技术构建一个分类器,将一个部分分类为
Presentation或Question & Answer部分,因为没有保证的线索(使用手工规则进行的模式识别再多也不会正确 100 %) 出现在文本中。 -
感谢 SO 社区的回答和 cmets。我已经将赏金奖励给了使用 python 和正则表达式来处理模式识别的答案。形成状态机的 if 语句级联实现了给定任务,但重新调整或重构使用正则表达式的代码更容易且更通用。
标签: python parsing dictionary nlp