音素和字素

时间:2016-04-28 04:47:01

标签: python csv

我有一个csv文件,如下所示:

    W IY K D EY,w ee k d ay
    T EH K S T,t e x _ t
    Y UW,ewe _
    SH UW T,chu te
    SH UW T,chu te
    SH UW T,chu te !
    SX AH K,s u ck

文件的前半部分是音素,下半部分是逗号之后的字形。音素和字素相互匹配。我想写一个函数 graphemes_phonemes ,它有三个参数:

  1. 初始csv文件 csv_file
  2. 另一个csv文件 valid_phonemes ,其中包含所有有效的音素,如下所示:

    AA
    AE
    AH
    AO
    AW
    AY
    B
    CH
    D
    DH
    EH
    ER
    EY
    F
    G
    HH
    IH
    IY
    JH
    K
    L
    M
    N
    NG
    OW
    OY
    P
    R
    S
    SH
    T
    TH
    UH
    UW
    V
    W
    Y
    Z
    ZH
    
  3. 一个可选参数valid_graphemes,它是一个包含所有有效字素的集合,其中还包含一个下划线“_”字符。

  4. 我希望能够返回一个4元组,它跟随csv文件中的音素 - 字形数据。

    1. 我希望它能够返回无效行数,其中音素数与字素数不匹配。或者数据中不存在音素或字素。下划线确实很重要,但不是感叹号。最后四行无效。前两个是无效的,因为长度不匹配,第三个是无效的,因为它有一个“!”,而最后一个是无效的,因为“SX”不是一个有效的音素。

    2. 每个单词的平均音素数。

    3. 每个字的平均字素数。
    4. 具有一个或多个下划线的字素的比例。
    5. 我希望最后三个值仅基于有效的行。如果行无效,则不应将最后三个返回输出的计算计入比例的平均值。如果最后三个值的分母为零,则返回值应返回None。

      这是一个例子

          >>>graphemes_phonemes("csv_file.csv", valid_phonemes = "valid_p.txt")
          (4, 4.0, 4.666666666666667, 0.6666666666666666)
      

      这是我到目前为止所做的:

          import csv
      
          def phonemes_graphemes(csv_file, valid_phonemes = "valid_p.txt")
      
              csv_read = open(csv_file)
              reader = csv.reader(csv_read)
      
              phonemes_valid = open(valid_phonemes)
              phonemes_read = csv.reader(phonemes_valid)
      

      我只是不确定我应该怎么做。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的有效音素或有效的字形文件不需要View->Freeze Panes,因为它们每行只包含一个值。我将它们读成csv.reader,使用类似的东西:

set

然后,当您通读CSV文件时,可以使用with open(valid_phonemes) as v_ph: valid_phoneme_set = set(line.strip() for line in v_ph) 检查每个音素。这是一个非常快速的实现,可以实现我想要的功能:

if phoneme in valid_phoneme_set

两个平均值应该总是相同,因为每次要求字母和音素列表的长度相同(或者行无效,因此我们不计算它们)。如果你有一些其他的逻辑想要应用于计算一种项而不是另一种,你只需要编写一个适当的计算来代替我上面的valid_row_count = 0 invalid_row_count = 0 phoneme_count = 0 grapheme_count = 0 with open(csv_file, newlines="") as in_file: reader = csv.reader(in_file): for phoneme_string, grapheme_string in reader: phonemes = phoneme_string.split() graphemes = phoneme_string.split() if ((len(phonemes) == len(graphemes) and all(phoneme in valid_phoneme_set for phoneme in phonemes) # add another clause here to check the graphemes against some set, if you want )) # doubled parentheses used to avoid ambiguous indentation valid_row_count += 1 phoneme_count += len(phonemes) grapheme_count += len(graphemes) else: invalid_row_count += 1 phoneme_average = float(phoneme_count) / valid_row_count # float call only needed on Python 2 grapheme_average = float(grapheme_count) / valid_row_count (例如len会从字形数中排除下划线。)