6

我有一个长文本文件(剧本)。我想把这个文本文件变成一个列表(每个单词都是分开的),以便我以后可以搜索它。

我现在的代码是

file = open('screenplay.txt', 'r')
words = list(file.read().split())
print words

我认为这可以将所有单词分成一个列表,但是我在删除单词末尾的逗号和句点等所有额外内容时遇到了麻烦。我还想让大写字母小写(因为我希望能够以小写形式搜索并同时显示大写和小写单词)。任何帮助都会很棒:)

4

8 回答 8

8

尝试来自https://stackoverflow.com/a/17951315/284795的算法,即。在空白处拆分文本,然后修剪标点符号。这会小心地从单词边缘删除标点符号,而不会损害单词内部的撇号,例如we're.

>>> text
"'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'"

>>> text.split()
["'Oh,", 'you', "can't", 'help', "that,'", 'said', 'the', 'Cat:', "'we're", 'all', 'mad', 'here.', "I'm", 'mad.', "You're", "mad.'"]

>>> [word.strip(string.punctuation) for word in text.split()]
['Oh', 'you', "can't", 'help', 'that', 'said', 'the', 'Cat', "we're", 'all', 'mad', 'here', "I'm", 'mad', "You're", 'mad']

您可能想添加一个.lower()

于 2013-08-08T21:15:33.137 回答
6

这是正则表达式的工作!

例如:

import re
file = open('screenplay.txt', 'r')
# .lower() returns a version with all upper case characters replaced with lower case characters.
text = file.read().lower()
file.close()
# replaces anything that is not a lowercase letter, a space, or an apostrophe with a space:
text = re.sub('[^a-z\ \']+', " ", text)
words = list(text.split())
print words
于 2013-08-08T21:12:58.233 回答
4

剧本应该足够短,以便一口气读入记忆。如果是这样,您可以使用该translate方法删除所有标点。最后,您可以使用以下方法简单地通过空格拆分来生成列表str.split

import string

with open('screenplay.txt', 'rb') as f:
    content = f.read()
    content = content.translate(None, string.punctuation).lower()
    words = content.split()

print words

请注意,这将Mr.Smith变为mrsmith. 如果您希望它成为,['mr', 'smith']那么您可以用空格替换所有标点符号,然后使用str.split

def using_translate(content):
    table = string.maketrans(
        string.punctuation,
        ' '*len(string.punctuation))
    content = content.translate(table).lower()
    words = content.split()
    return words

使用正则表达式模式时可能会遇到的一个问题[a-z]+是它只会匹配 ascii 字符。如果文件有重音字符,则单词会分开。 Gruyère会变成['Gruy','re'].

您可以通过使用re.split拆分标点符号来解决此问题。例如,

def using_re(content):
    words = re.split(r"[ %s\t\n]+" % (string.punctuation,), content.lower())
    return words

但是,使用str.translate更快:

In [72]: %timeit using_re(content)
100000 loops, best of 3: 9.97 us per loop

In [73]: %timeit using_translate(content)
100000 loops, best of 3: 3.05 us per loop
于 2013-08-08T21:03:44.090 回答
1

使用替换方法。

mystring = mystring.replace(",", "")

如果您想要一个更优雅的解决方案,您将使用多次阅读 RegEx 表达式。大多数语言都使用它们,它们对于更复杂的替换等非常有用

于 2013-08-08T21:03:28.953 回答
0

您可以使用简单的正则表达式来创建包含所有单词的集合(一个或多个字母字符的序列)

import re
words = set(re.findall("[a-z]+", f.read().lower()))

使用 aset每个单词将只包含一次。

只是使用findall将按顺序为您提供所有单词。

于 2013-08-08T21:04:58.667 回答
0

你可以尝试这样的事情。可能需要一些关于正则表达式的工作。

import re
text = file.read()
words = map(lambda x: re.sub("[,.!?]", "", x).lower(), text.split())
于 2013-08-08T21:15:39.990 回答
0

您可以使用字典来指定不需要的字符,并根据您的选择格式化当前字符串。

replaceChars = {'.':'',',':'', ' ':''}
print reduce(lambda x, y: x.replace(y, replaceChars[y]), replaceChars, "ABC3.2,1,\nCda1,2,3....".lower())

输出:

abc321
cda123
于 2013-08-08T21:13:02.940 回答
0

我已经尝试过这段代码,它适用于我的情况:

from string import punctuation, whitespace
s=''
with open("path of your file","r") as myfile:
    content=myfile.read().split()  
    for word in content:
        if((word in punctuation) or (word in whitespace)) :
            pass
        else:
            s+=word.lower()
print(s)
    
于 2020-12-20T06:42:58.230 回答