繁体   English   中英

为每个字符串添加特定字符python中的字符串列表

[英]adding specific characters for each string a string list in python

我已经编写了一个脚本,该脚本基本上将句子中的所有字符串分成几部分;

例如;

"geldigim" -> "gel" "di" "g" "i" "m"

尽管可以按上述方式拆分某些字符串,但可以按以下方式拆分其中一些字符串;

"bildi" > "bil" "di"

否则某些句子可能根本无法拆分。

"kos" -> "kos"

它完全由将字符串拆分为多个部分的函数决定。

我想做的是以下几点:

geldigim -> /gel* *di* *g* *i* *m/
bildi -> /bil* *di/
kos -> /kos/

我所做的是

我有一个具有37251512句子的语料库。 我写了以下脚本;

if __name__ == "__main__":
        io = morfessor.MorfessorIO()
        print "Importing corpus ..."
        f = codecs.open("corpus/corpus_tr_en/corpus.tr", encoding="utf-8").readlines()
        print "Importing morphology model ..."
        model = io.read_binary_model_file('seg/tr/model.bin')
        corpus = open('dataset/dataset_tr_en/full_segmented.tr', 'w')
        for a in range(len(f)):
                print str(a) + ' : ' + str(len(f))
                words = f[a].replace('\n', '').split()
                line_str = ''
                for word in words:
                        segmentation = model.viterbi_segment(word)[0]
                        if len(segmentation) == 1:
                                line_str = '/' + segmentation[0] + '/'
                        if len(segmentation) == 2:
                                line_str = '/' + segmentation[0] + '* *' + segmentation[1] + '/'
                        if len(segmentation) > 2:
                                line_str = ''
                                for b in range(len(segmentation)):
                                        if (b == 0):
                                                line_str = line_str + '/' + segmentation[b] + '*'
                                        if (b != 0) and (b != (len(segmentation) - 1)):
                                                line_str = line_str + ' *' + segmentation[b] + '* '
                                        if (b == (len(segmentation) - 1)):
                                                line_str = line_str + ' *' + segmentation[b] + '/'
                        line_str = line_str + ' '
                        corpus.write(line_str.encode('utf-8'))
                corpus.write('\n')

        corpus.close()

该脚本循环遍历每个句子以及一个句子中的每个单词,并使用io.read_binary_model_file函数将其拆分为多个部分。

但这对我来说太贵了,非常慢。

您能给我建议一种可以使过程非常快速的方法吗?

谢谢,

可能会减慢很多速度的是使用多个字符串串联的line_str组合,如果要提高性能,不建议这样做(对于filename = base+".txt"类的东西来说还可以,但对于密集处理则不行。

创建line作为list来代替,而str.join创建最终的字符串只是它写入磁盘。 追加到list要快得多。

正如马克西米利安(Maximilian)刚刚建议的那样,您可以将条件设​​为elif因为它们是互斥的(x2)。 还添加了一些更多的微优化,以增强可读性。

我对您的内部循环应如何的建议:

for word in words:
        segmentation = model.viterbi_segment(word)[0]
        lenseg = len(segmentation)
        if lenseg == 1:
                line = ['/',segmentation[0],'/']
        elif lenseg == 2:
                line = ['/',segmentation[0],'* *',segmentation[1],'/']
        elif lenseg > 2:
                line = []
                for b in range(lenseg):
                        if b == 0:
                                line += ['/',segmentation[0],'*']
                        elif b != (lenseg - 1):
                                line += [' *',segmentation[b],'* ']
                        else:
                                line+= [' *',segmentation[b],'/']
        line.append(" ")
        corpus.write("".join(line).encode('utf-8'))

备择方案:

  • 每次将每个字符串写入输出文件
  • 将数据写入io.StringIO对象,并将其检索以写入输出文件。
  • Jean-FrançoisFabre很好地介绍了字符串优化
  • 另一头大象是使用readlines()处理37,251512个句子。 只需for a in f使用for a in f有关详细说明,请参见此处
  • 根据您的数据中有多少重复项以及model.viterbi_segment函数的性能,使用一set单词而不是一遍又一遍地重复单词可能会有所帮助。
  • 似乎您正在使用python 2.#,在这种情况下,请使用xrange而不是range
  • .replace('\\n', '').split()很慢,因为当您只想删除最后一个换行符时(它不能超过一个),它必须遍历整行。 您可以使用rstrip('\\n') `
  • 您的代码中有一些冗余,例如,每行都必须以/结尾,但您需要将其放在3个地方。
  • 所有这些更改可能很小,但它们会加起来,您的代码也变得更易于阅读

这样的内循环怎么样:

line = '* *'.join(segmentation)
corpus.write(("/%s/ " % line).encode('utf-8'))

然后,由于您可以同时将输入保留在内存中,因此我也将尝试将输出保留在内存中,并一次性将其写出,如下所示:

lines = []
for a in range(len(f)):
    print str(a) + ' : ' + str(len(f))
    words = f[a].replace('\n', '').split()
    for word in words:
        line = '* *'.join(segmentation)
        lines.append("/%s/ " % line)
corpus.write("\n".join(lines).encode('utf-8')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM