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

标签 python dictionary machine-learning nlp

我正在尝试从一些定义语料库(RCV1数据集标记)的文本文件创建字典。我在正则表达式的帮助下清除了文件中的一些停用词。最初它看起来像这样:https://ibb.co/h3eG5v 。我用以下代码清理了停用词:

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()

然后使用一个小代码块来删除所有空白行。现在文本文件基本上如下所示: https://ibb.co/e7Ww5v

现在的格式是一行包含文档 ID、整数(2286-26150 用于训练数据),然后是多行,其中标记由一个空格分隔,然后 block 重复:

2286

token token token token token token

代币代币代币代币代币

2287

代币代币代币..

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

最佳答案

如果 token 永远不是数字,您可以尝试此代码:

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

您应该使用以下代码解析它:

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)

关于python - 从文件 python 中提取 id 和相应的标记并附加到字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44327376/

相关文章:

python - 重新排列 pandas 数据框中不连续的列顺序

python - Pandas:对各种列执行操作并创建、重命名新列

python - Numpy 通过字典进行广播

java - 如何使用此代码对相同的值进行排序?

python - 如何从 sklearn GridSearchCV 中获取 MSE 和 R2?

python - 使用Open CV删除背景并不精确,并且某些图片无法正确处理

python - 如何在 MultiIndex Groupby 中高效执行乘法

PHP/MYSQL 替换字典数组中键的文本

machine-learning - 不同 epsilon 值对 Q-learning 和 SARSA 的影响

tensorflow - Keras - 自定义损失函数 - 倒角距离