从python中的字符串中提取英文单词
Posted
技术标签:
【中文标题】从python中的字符串中提取英文单词【英文标题】:extract English words from string in python 【发布时间】: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库,不管你在做什么
【参考方案1】:
你实际上有两个问题。
首先,这个:
line = re.sub("[^A-Za-z]", "", line.strip())
这会从该行中删除所有非字母。这意味着您不再有任何空格可以分割,因此无法将其分成单词。
接下来,即使你没有这样做,你也要这样做:
words = ' '.join(line.split())
这不会给你一个单词列表,它会给你一个字符串,所有这些单词连接在一起。 (基本上,所有运行的空白都转换为单个空格的原始行。)
所以,在下一行,当你这样做时:
for word in words:
您正在遍历一个字符串,这意味着每个 word
都是一个字符。因为这就是字符串:字符的可迭代。
如果你想要每个单词(正如你的变量名所暗示的那样),你已经有了这些,问题是你将它们重新加入到一个字符串中。只是不要这样做:
words = line.split()
for word in words:
或者,如果你想去掉字母和空格之外的东西,使用一个去掉字母和空格之外的所有东西的正则表达式,而不是去掉除字母之外的所有东西,包括空格:
line = re.sub(r"[^A-Za-z\s]", "", line.strip())
words = line.split()
for word in words:
但是,这种模式可能仍然不是您想要的。你真的想把'abc1def'
变成一个字符串'abcdef'
,还是变成两个字符串'abc'
和'def'
?你可能想要这个:
line = re.sub(r"[^A-Za-z]", " ", line.strip())
words = line.split()
for word in words:
……或者只是:
words = re.split(r"[^A-Za-z]", line.strip())
for word in words:
【讨论】:
【参考方案2】:这里有两个问题:
line = re.sub("[^A-Za-z]", "", line.strip())
会删除所有非字符,使得后续阶段很难拆分单词。另一种解决方案是这样的words = re.findall('[A-Za-z]', line)
正如@abarnert 所说,在现有代码中words
是一个字符串,for word in words
将迭代每个字母。要将words
作为单词列表获取,可以关注1。
【讨论】:
以上是关于从python中的字符串中提取英文单词的主要内容,如果未能解决你的问题,请参考以下文章