在python中枚举和替换字符串文件中的所有标记

2024-05-19 17:37:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个问题要问你,亲爱的Python爱好者。在

我有一个语料库文件,如下所示:

Ah , this is greasy .
I want to eat kimchee .
Is Chae Yoon 's coordinator in here ?
Excuse me , aren 't you Chae Yoon 's coordinator ? Yes . Me ?
-Chae Yoon is done singing .
This lady right next to me ... everyone knows who she is right ?

我想为每个令牌分配一个特定的号码,并用文件上指定的号码替换它。在

我所说的token的意思是,基本上文件中由' '分隔的每组字符。所以,例如,?是一个令牌,而{}也是一个令牌。在

我有一个语料库文件,涉及超过400万行,如上所述。你能告诉我一个最快的方法吗?在

谢谢


Tags: 文件torightisthis号码me爱好者
3条回答
from collection import defaultdict
from itertools import count
with open(filename) as f:
    with open(output, 'w+') as out:
      c = count()
      d = defaultdict(c.__next__)
      for line in f:
        line = line.split()
        line = ' '.join([d[token] for token in line])
        out.write(line)    

使用defaultdict,我们可以记住我们看到的标记。每次我们看到一个新的令牌,我们就得到下一个数字并将其分配给该令牌。这会将输出写入另一个文件。在

可能有点过头了,但您可以编写自己的分类器:

# Python 3.x
class Classifier(dict):
    def __init__(self, args = None):
        '''args is an iterable of keys (only)'''
        self.n = 1
        super().__init__()
        if args:
            for thing in args:
                self[thing] = self.n
    def __setitem__(self, key, value = None):
##        print('setitem', key)
        if key not in self:
            super().__setitem__(key, self.n)
            self.n += 1
    def setdefault(self, key, default = None):
        increment = key not in self
        n = super().setdefault(key, self.n)
        self.n += int(increment)
##        print('setdefault', n)
        return n
    def update(self, other):
        for k, v in other:
            self.setdefault(k)
    def transpose(self):
        return {v:k for k, v in self.items()}

用法:

^{pr2}$

为了减少写操作的次数,您可以在一个列表中累积行,并以一定的长度使用writelines()。在

如果有足够的内存,可以读入整个文件并将其拆分,然后将其馈送给Classifier。在

取消分类

z = c.transpose()
with open('classified.txt') as f:
    for line in f:
        line = (z[int(n)] for n in line.strip().split())
        print(' '.join(line))

对于python2.7,super()需要参数-将super()替换为super(Classifier, self)。在


如果您主要使用字符串作为令牌编号,那么在类中,当保存时,您应该将self.n转换为字符串,那么您就不必在工作代码中的字符串和int之间来回转换。在


您还可以使用sklearn的^{}。在

如果已经有特定的字典来更改值,则只需映射新值。在

mapping = { '?':1, 'Excuse':2, ...}
for k, v in mapping.iteritems():
    my_string = my_string.replace(k, v)

如果您想创建一个全新的词典:

^{pr2}$

相关问题 更多 >