我有一个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,它包含三个参数:
另一个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
以及一个可选参数valid_graphemes,它是一个包含所有有效字符的集合,其中还包括一个下划线“”字符。
我希望能够返回一个4元组,它跟在csv文件中的音素图形数据后面。在
我希望它能够返回无效行的数量,其中音素的数量与字形的数量不匹配。或者数据中不存在音素或字母。下划线是有价值的,但不是感叹号之类的东西。最后四行无效。前两个无效,因为长度不匹配,第三个无效,因为它有一个“!”,最后一个无效,因为“SX”不是有效的音素。
每个单词的平均音素数。
我希望最后三个值只基于有效的行。如果一行无效,则最后三个返回输出的计算不应计入比例的平均值。如果最后三个值的分母为零,则返回值应返回到“无”。在
这里有一个例子
>>>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)
我只是不知道该怎么做。任何帮助都将不胜感激。在
有效的音素或有效的图形文件不需要
csv.reader
,因为它们每行只包含一个值。我会将它们读入set
,使用类似于:然后,当您通读CSV文件时,您可以对照使用
^{pr2}$if phoneme in valid_phoneme_set
的集合来检查每个音素。下面是一个非常快速的实现,它可以实现我认为您想要的:不过,这两个平均值应该始终相同,因为每次都要求字母和音素的列表长度相同(或者行无效,所以我们不计算它们)。如果你有其他的逻辑,你想应用于一种项目的计数,而不是另一种,你只需要写一个适当的计算来代替我上面的
len
(例如,sum(grapheme != "_" for grapheme in graphemes)
将把下划线从字形的计数中排除)。在相关问题 更多 >
编程相关推荐