我有一个大文本文件(parsed.txt
),其中包含近1.500.000行。每一行都采用以下格式:
foobar foo[Noun]+lAr[A3pl]+[Pnon]+[Nom]
loremipsum lorem[A1sg]+lAr[A3pl]+[Pl]+[Nom]
我在空格后给出第二个字段,并使用此函数获取空格前的第一个字段:
def find_postag(word,postag):
with open('parsed.txt',"r") as zemberek:
for line in zemberek:
if all(i in line for i in (word,postag)):
if line.split(" ")[0].startswith(word) and line.split(" ")[1] == word+postag:
selectedword = line.split(" ")[0]
break
return selectedword
然而,它的工作太慢了。我不知道如何才能让这个过程更快。我的想法是:parsed.txt
文件按字母顺序排列。如果给定word
变量以“z”字母开头,则它不必要地读取近900.000行。如果给定的word
以“z”字母开头,如果从900.000行检查它可能会更快。有没有更好的想法,我该如何实施?
答案 0 :(得分:1)
由于您的输入文件是按字母顺序排列的,您可以创建一个包含每个字母开头的行号的字典,如下所示:
with open('parsed.txt', 'r') as f:
data = [line.strip() for line in f if line.strip()]
index = dict()
for i in range(len(data)):
line = data[i]
first_letter = line[0].lower()
if first_letter not in index:
index[first_letter] = i
您可能希望在开头添加该代码,因此它只会在您开始搜索之前运行一次。这样,当您搜索单词时,您可以让它开始搜索其首字母开头的位置,如下所示:
def find_postag(word, postag):
start = index[word[0].lower()]
for line in data[start:]:
# your code here
if all(i in line for i in (word,postag)):
if line.split(" ")[0].startswith(word) and line.split(" ")[1] == word+postag:
selectedword = line.split(" ")[0]
break
return selectedword