【问题标题】:Creation of bigrams in python在 python 中创建二元组
【发布时间】:2015-10-14 10:15:56
【问题描述】:

我有一个从平行语料库中提取的候选双语术语列表,格式如下

Difensori dei diritti umani, libertà di espressione >>> Human rights defenders, freedom of expression

我想要的是用双元组关联两种语言的项目。因此,源语言(意大利语)中的每个多词术语都将与目标语言(英语)中的每个多词术语以二元组关联。所以对于这个例子来说,二元组看起来像这样:

('Difensori dei diritti umani','Human rights defenders')
('Difensori dei diritti umani','freedom of expression')
('libertà di espressione','Human rights defenders')
('libertà di espressione','freedom of expression')

有人可以帮忙吗?

【问题讨论】:

  • 抱歉,这是纯粹的列表项配对还是您必须检查语言?
  • 所以你想要的只是两个句子的克数的笛卡尔积,而不是等价相位的对齐(这是机器翻译领域的问题之一)。
  • 这是一个笛卡尔积和字符串问题,到目前为止你有什么尝试?
  • 当输出显示三元组时,你为什么要求二元组??

标签: python python-2.7 python-3.x nltk


【解决方案1】:

你需要一些争论才能得到你需要的东西。如果您只想要基于翻译的元组,根据您的示例,您可以使用以下函数:

# -*- coding: utf-8 -*-

def zipping(string):
    string = string.replace(', ', ',')   # to take away parasite spaces
    string = string.split(" >>> ")
    trans_tuples = zip(string[0].split(','), string[1].split(','))
    return trans_tuples

str = "Difensori dei diritti umani, libertà di espressione >>> Human rights defenders, freedom of expression"
for bigram in zipping(str):
    print bigram

输出将是:

('Difensori dei diritti umani', 'Human rights defenders')
('libertà di espressione', 'freedom of expression')

如果您需要将一侧的两个术语与另一侧的两个术语相关联(我想出于上下文目的),只需按如下方式调整压缩功能:

# -*- coding: utf-8 -*-

def zipping(string):
    string = string.replace(', ', ',')
    string = string.split(" >>> ")
    trans_tuples = zip(string[0].split(','), string[1].split(','))
    trans_tuples.append((trans_tuples[0][0], trans_tuples[1][1]))  # new line 1
    trans_tuples.append((trans_tuples[1][0], trans_tuples[0][1]))  # new line 2
    return trans_tuples

str = "Difensori dei diritti umani, libertà di espressione >>> Human rights defenders, freedom of expression"
for bigram in zipping(str):
    print bigram

在这种情况下,输出将如下:

('Difensori dei diritti umani', 'Human rights defenders')
('libertà di espressione', 'freedom of expression')
('Difensori dei diritti umani', 'freedom of expression')
('libertà di espressione', 'Human rights defenders')

【讨论】:

    【解决方案2】:

    这就是你要找的吗?

    s = "Difensori dei diritti umani, liberta di espressione >>> Human rights defenders, freedom of expression"
    
    bigrams = []
    trans = s.split(' >>> ')
    for it in trans[0].split(', '):
        for en in trans[1].split(', '):
            bigrams.append((it, en))
            print((it, en))
    

    它产生这个输出:

    ('Difensori dei diritti umani', 'Human rights defenders')  
    ('Difensori dei diritti umani', 'freedom of expression')  
    ('liberta di espressione', 'Human rights defenders')   
    ('liberta di espressione','freedom of expression') 
    

    【讨论】:

      【解决方案3】:

      我的解决方案:

      str = "Difensori dei diritti umani, libertà di espressione >>> Human rights defenders, freedom of expression"
      b = [elem.split(", ") for elem in str.split(" >>> ")]
      bigrams = list(zip(b[0], b[1]))
      bigrams_ = list((zip(reversed(b[0]), b[1])))
      bigrams = bigrams + bigrams_
      for bigram in bigrams:
          print(bigram)
      

      输出:

      ('Difensori dei diritti umani', 'Human rights defenders')
      ('libertà di espressione', 'freedom of expression')
      ('libertà di espressione', 'Human rights defenders')
      ('Difensori dei diritti umani', 'freedom of expression')
      

      【讨论】:

      • 二元组在哪里?
      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2016-01-10
      • 2023-01-28
      • 2018-10-02
      • 2020-08-02
      • 1970-01-01
      • 2014-02-08
      相关资源
      最近更新 更多