从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中的字符串中提取英文单词的主要内容,如果未能解决你的问题,请参考以下文章

如果字符串包含列表中的单词,则从字符串中提取单词

从数据框字符串列中提取特定单词并存储在 Python 的新列中

python中如何提取单词的首字母

如何从python上的PDF文件中提取单词的多个实例?

如何从重复的字符串中提取单词

从文本文件中提取一行中的第二个单词