这是我正在处理的 MapReduce 问题的第一部分。我需要一个函数,如果单词的第一个字母以元音开头,则返回 1,否则返回 0。
程序通过管道将文本文件传输到映射器在终端中运行,如下所示:
cat test.txt | python3 mapper.py
这是包含字符串的文本文件的预期输出
its a beautiful life
:
i 1 1 0
t 1 0 0
s 1 0 0
a 1 1 1
b 1 0 0
e 1 0 0
a 1 0 0
u 1 0 0
t 1 0 0
i 1 0 0
f 1 0 0
u 1 0 0
l 1 0 0
l 1 0 0
i 1 0 0
f 1 0 0
e 1 0 1
我成功完成了前两列输出的分配,但我在第三列上遇到了问题。如果单词的第一个字母是元音,它应该产生 1,否则产生 0。
我当前的输出如下:
i 1 1 0
t 1 1 0
s 1 1 0
a 1 1 0
b 1 1 0
e 1 1 0
a 1 1 0
u 1 1 0
t 1 1 0
i 1 1 0
f 1 1 0
u 1 1 0
l 1 1 0
l 1 1 0
i 1 1 0
f 1 1 0
e 1 1 0
这是我到目前为止编写的代码:
import sys
import re
pattern = re.compile("^[a-z]+$") # matches purely alphabetic words
starting_vowels = re.compile("(^[aeiouAEIOU])") # matches starting vowels
ending_vowels = re.compile("[aeiouAEIOU]$") # matches ending vowels
# starting_vowel_match = 0
ending_vowel_match = 0
def first_vowel():
for token in tokens:
if starting_vowels.match(token[0]):
yield '1'
else:
yield '0'
for line in sys.stdin:
line = line.strip() # removes leading and trailing whitespace
tokens = line.split() # splits words into list, needed for part 2
mashed_line = line.replace(" ","")
lower_mashed_line = mashed_line.lower()
for letter in lower_mashed_line:
if pattern.match(letter): # if pattern matches, prints 'word 1'
print('%s 1' % letter, next(first_vowel()), ending_vowel_match)