从python文件中提取id和相应的标记并附加到字典中

从python文件中提取id和相应的标记并附加到字典中,python,dictionary,machine-learning,nlp,Python,Dictionary,Machine Learning,Nlp,我正试图从一些定义语料库(RCV1数据集标记)的文本文件中创建一个字典。在regex的帮助下,我从一些stopwords中清除了该文件。最初看起来是这样的:。我用以下代码清除了stopwords: def cleanFile(): infile = "lyrl2004_tokens_train.dat" outfile = "cleaned_file.dat" delete_list = [".W",'.I '] fin = open(infile) f

我正试图从一些定义语料库(RCV1数据集标记)的文本文件中创建一个字典。在regex的帮助下,我从一些stopwords中清除了该文件。最初看起来是这样的:。我用以下代码清除了stopwords:

def cleanFile():
    infile = "lyrl2004_tokens_train.dat"
    outfile = "cleaned_file.dat"

    delete_list = [".W",'.I ']
    fin = open(infile)
    fout = open(outfile, "w+")

    for line in fin:
        for word in delete_list:
            line = line.replace(word, "")
    fout.write(line)
    fin.close()
    fout.close()
然后使用一个小代码块删除所有空行。现在文本文件基本上如下所示:

因此,现在的格式是一行带文档id的整数(训练数据为2286-26150),然后多行带标记,用一个空格分隔,然后块重复:

2286

令牌令牌令牌

令牌令牌令牌

2287

令牌令牌

我试图完成的是编写一个函数,该函数将读取整个文件,谢天谢地,该文件可以放入内存中,然后在列表中使用文档ID及其对应的标记构造一个字典。它应该如下所示:{'2286':[token,token,token…],'2287':[token,token,token…],}。我没有主意了,因为我找不到一种方法来重复处理两个连续数字之间的文本,因为我搜索的所有内容通常都包含非数字的分隔符。
为了提供信息,我接下来将用这些数据构造一个文本分类器(这就是为什么我需要一个字典)。测试标记与训练标记的格式相同,更高的整数高达800.000

text = '''123
dpqvjp jpo fjiqo iq[woe f
wf q  q[ewfp wqervg
436
oiwbrveojibnpibn eprvnj erv p eprwoij
536
oiberv ih reip rewp wepri pirvnep
erpvj pre
er
erpno poj rgwe epo
'''
dct = {}
current_id = None
for el in text.split():
    if el.isdigit():
        current_id = el
        dct[current_id] = []
    else:
        dct[current_id].append(el)
print(dct)
结果:

{'123': ['dpqvjp', 'jpo', 'fjiqo', 'iq[woe', 'f', 'wf', 'q', 'q[ewfp', 'wqervg'], '536': ['oiberv', 'ih', 'reip', 'rewp', 'wepri', 'pirvnep', 'erpvj', 'pre', 'er', 'erpno', 'poj', 'rgwe', 'epo'], '436': ['oiwbrveojibnpibn', 'eprvnj', 'erv', 'p', 'eprwoij']}
如果令牌中有数字,您可以为您的
id
创建一个模式,例如:

<ID=2647>

因此,您的文档将如下所示:

<ID=123>
dpqvjp jpo fjiqo iq[woe f
wf q  q[ewfp wqervg
<ID=436>
oiwbrveojibnpibn eprvnj erv p eprwoij
<ID=536>
oiberv ih reip rewp wepri pirvnep
erpvj pre
er
erpno poj rgwe epo

dpqvjp jpo fjiqo iq[woe f
wf q q[EWWFP wqervg
oiwbrveojibnpibn eprvnj erv p eprwoij
这是一个很好的例子
erpvj预处理
呃
erpno poj rgwe epo
您应该使用以下代码对其进行解析:

import re
text = '''<ID=123>
dpqvjp jpo fjiqo iq[woe f
wf q  q[ewfp wqervg
<ID=436>
oiwbrveojibnpibn eprvnj erv p eprwoij
<ID=536>
oiberv ih reip rewp wepri pirvnep
erpvj pre
er
erpno poj rgwe epo
'''
dct = {}
current_id = None
for el in text.split():
    match = re.match(r'<ID=(\d+)>', el)
    if match:
        current_id = match.group(1)
        dct[current_id] = []
    else:
        dct[current_id].append(el)
print(dct)
重新导入
文本='''
dpqvjp jpo fjiqo iq[woe f
wf q q[EWWFP wqervg
oiwbrveojibnpibn eprvnj erv p eprwoij
这是一个很好的例子
erpvj预处理
呃
erpno poj rgwe epo
'''
dct={}
当前id=无
对于文本中的el.split():
匹配=重新匹配(r'',el)
如果匹配:
当前_id=match.group(1)
dct[当前_id]=[]
其他:
dct[当前\u id]。追加(el)
打印(dct)

如果令牌不是数字,您可以尝试此代码:

text = '''123
dpqvjp jpo fjiqo iq[woe f
wf q  q[ewfp wqervg
436
oiwbrveojibnpibn eprvnj erv p eprwoij
536
oiberv ih reip rewp wepri pirvnep
erpvj pre
er
erpno poj rgwe epo
'''
dct = {}
current_id = None
for el in text.split():
    if el.isdigit():
        current_id = el
        dct[current_id] = []
    else:
        dct[current_id].append(el)
print(dct)
结果:

{'123': ['dpqvjp', 'jpo', 'fjiqo', 'iq[woe', 'f', 'wf', 'q', 'q[ewfp', 'wqervg'], '536': ['oiberv', 'ih', 'reip', 'rewp', 'wepri', 'pirvnep', 'erpvj', 'pre', 'er', 'erpno', 'poj', 'rgwe', 'epo'], '436': ['oiwbrveojibnpibn', 'eprvnj', 'erv', 'p', 'eprwoij']}
如果令牌中有数字,您可以为您的
id
创建一个模式,例如:

<ID=2647>

因此,您的文档将如下所示:

<ID=123>
dpqvjp jpo fjiqo iq[woe f
wf q  q[ewfp wqervg
<ID=436>
oiwbrveojibnpibn eprvnj erv p eprwoij
<ID=536>
oiberv ih reip rewp wepri pirvnep
erpvj pre
er
erpno poj rgwe epo

dpqvjp jpo fjiqo iq[woe f
wf q q[EWWFP wqervg
oiwbrveojibnpibn eprvnj erv p eprwoij
这是一个很好的例子
erpvj预处理
呃
erpno poj rgwe epo
您应该使用以下代码对其进行解析:

import re
text = '''<ID=123>
dpqvjp jpo fjiqo iq[woe f
wf q  q[ewfp wqervg
<ID=436>
oiwbrveojibnpibn eprvnj erv p eprwoij
<ID=536>
oiberv ih reip rewp wepri pirvnep
erpvj pre
er
erpno poj rgwe epo
'''
dct = {}
current_id = None
for el in text.split():
    match = re.match(r'<ID=(\d+)>', el)
    if match:
        current_id = match.group(1)
        dct[current_id] = []
    else:
        dct[current_id].append(el)
print(dct)
重新导入
文本='''
dpqvjp jpo fjiqo iq[woe f
wf q q[EWWFP wqervg
oiwbrveojibnpibn eprvnj erv p eprwoij
这是一个很好的例子
erpvj预处理
呃
erpno poj rgwe epo
'''
dct={}
当前id=无
对于文本中的el.split():
匹配=重新匹配(r'',el)
如果匹配:
当前_id=match.group(1)
dct[当前_id]=[]
其他:
dct[当前\u id]。追加(el)
打印(dct)

任何标记都可以是数字吗?它们中很少有,我可以完全跳过它们,因为它们没有提供文档主题的任何相关信息。任何标记都可以是数字吗?很少有,我可以完全跳过它们,因为它们没有提供文档主题的任何相关信息。脚本给我KeyError:无。我读取了d从文件到字符串的ata:trainData=myfile.read().replace('\n','')。在尝试打印el后,它似乎读取了“2286recov”(第一个文档的开头及其ID),然后停止执行。改为执行
trainData=myfile.read().replace('\n','')
(带空格).
KeyError:None
只有在您的数据不是以
id
开头时才会出现。这很有效!非常感谢。我可能对包含数字的文档有一些问题,因为它们太少了,我最好手动删除它们,否则我将搜索一种从整数创建id标记的方法。我有一些奇怪的行为。这很有效对于train文档很好,但是对于测试文档,我没有得到长度为200571的dict,我只得到了99933个键。这可能是什么原因?脚本给了我KeyError:None。我使用以下命令将文件中的数据读取到字符串:trainData=myfile.read().replace('\n','')。在尝试打印el后,它看起来是“2286recov”(以其ID开始第一个文档),然后停止执行。请使用空格替换('\n','').
KeyError:None
只有在您的数据不是以
id
开头时才会出现。这很有效!非常感谢。我可能对包含数字的文档有一些问题,因为它们太少了,我最好手动删除它们,否则我将搜索一种从整数创建id标记的方法。我有一些奇怪的行为。这很有效对于火车文件来说没问题,但是对于测试文件,我没有得到长度为200571的dict,我只得到了99933把钥匙。这是什么原因呢?