我有一个长文本文件(剧本)。我想把这个文本文件变成一个列表(每个单词都是分开的),以便我以后可以搜索它。
我现在的代码是
file = open('screenplay.txt', 'r')
words = list(file.read().split())
print words
我认为这可以将所有单词分成一个列表,但是我在删除单词末尾的逗号和句点等所有额外内容时遇到了麻烦。我还想让大写字母小写(因为我希望能够以小写形式搜索并同时显示大写和小写单词)。任何帮助都会很棒:)
我有一个长文本文件(剧本)。我想把这个文本文件变成一个列表(每个单词都是分开的),以便我以后可以搜索它。
我现在的代码是
file = open('screenplay.txt', 'r')
words = list(file.read().split())
print words
我认为这可以将所有单词分成一个列表,但是我在删除单词末尾的逗号和句点等所有额外内容时遇到了麻烦。我还想让大写字母小写(因为我希望能够以小写形式搜索并同时显示大写和小写单词)。任何帮助都会很棒:)
尝试来自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()
这是正则表达式的工作!
例如:
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
剧本应该足够短,以便一口气读入记忆。如果是这样,您可以使用该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
使用替换方法。
mystring = mystring.replace(",", "")
如果您想要一个更优雅的解决方案,您将使用多次阅读 RegEx 表达式。大多数语言都使用它们,它们对于更复杂的替换等非常有用
您可以使用简单的正则表达式来创建包含所有单词的集合(一个或多个字母字符的序列)
import re
words = set(re.findall("[a-z]+", f.read().lower()))
使用 aset
每个单词将只包含一次。
只是使用findall
将按顺序为您提供所有单词。
你可以尝试这样的事情。可能需要一些关于正则表达式的工作。
import re
text = file.read()
words = map(lambda x: re.sub("[,.!?]", "", x).lower(), text.split())
您可以使用字典来指定不需要的字符,并根据您的选择格式化当前字符串。
replaceChars = {'.':'',',':'', ' ':''}
print reduce(lambda x, y: x.replace(y, replaceChars[y]), replaceChars, "ABC3.2,1,\nCda1,2,3....".lower())
输出:
abc321
cda123
我已经尝试过这段代码,它适用于我的情况:
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)