【发布时间】:2014-11-01 04:45:35
【问题描述】:
我有一个文件,每一行都是一个字符串。它可能包含数字、非英文字母和单词、符号(例如 ! 和 *)。我想从每一行中提取英文单词(英文单词用空格分隔)。 我的代码如下,这是我的 map-reduce 作业的 map 函数。但是,根据最终结果,此映射器函数仅生成字母(例如 a、b、c)的频率计数。任何人都可以帮我找到错误吗?谢谢
import sys
import re
for line in sys.stdin:
line = re.sub("[^A-Za-z]", "", line.strip())
line = line.lower()
words = ' '.join(line.split())
for word in words:
print '%s\t%s' % (word, 1)
【问题讨论】:
-
你正在重新加入你的分割线。所以
words会产生一个字符串。 -
您的正则表达式正在删除单词之间的所有空格。像
"[^A-Za-z\\s]"这样的模式将保留空格(但在删除多个非单词项目时可能会出现多个空格) -
monkut 和 Marius,有没有好的解决方案。我不想在我的结果中计算额外的空格,这就是我尝试分割线的原因
-
@Jin:你为什么要加入他们的行列?
for word in line.split():会给你单词,因为你正在迭代一个字符串列表;for word in ' '.join(line.split()):会给你单独的字符,因为你正在迭代一个字符串。 -
你的问题的元数据,你应该调查一个像
nltk这样的NLP库,不管你在做什么