我有一个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”不是一个有效的音素。
每个单词的平均音素数。
我希望最后三个值仅基于有效的行。如果行无效,则不应将最后三个返回输出的计算计入比例的平均值。如果最后三个值的分母为零,则返回值应返回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)
我只是不确定我应该怎么做。任何帮助将不胜感激。
答案 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
会从字形数中排除下划线。)