gpt4 book ai didi

python - 从文本文件中解析唯一的单词

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:51 25 4
gpt4 key购买 nike

我正在从事一个项目,从大量文本文件中解析出独特的单词。我已经处理好文件,但我正在尝试改进解析过程。每个文件都有一个特定的文本段,以我在实时系统上使用正则表达式捕获的某些短语结尾。

解析器应该遍历每一行,并根据 3 个标准检查每个单词:

  1. 超过两个字符
  2. 不在预定义字典集 dict_file
  3. 不在单词列表中

结果应该是一个二维数组,每一行都是每个文件的唯一单词列表,在处理每个文件后使用 .writerow(foo) 方法将其写入 CSV 文件。

我的工作代码在下面,但它又慢又笨,我错过了什么?

我的生产系统运行的是 2.5.1,只有默认模块(所以 NLTK 不行),无法升级到 2.7+。

def process(line):
line_strip = line.strip()
return line_strip.translate(punct, string.punctuation)

# Directory walking and initialization here
report_set = set()
with open(fullpath, 'r') as report:
for line in report:
# Strip out the CR/LF and punctuation from the input line
line_check = process(line)
if line_check == "FOOTNOTES":
break
for word in line_check.split():
word_check = word.lower()
if ((word_check not in report_set) and (word_check not in dict_file)
and (len(word) > 2)):
report_set.append(word_check)
report_list = list(report_set)

编辑:根据 steveha 的建议更新了我的代码。

最佳答案

一个问题是 inlist 的测试很慢。您可能应该保留一个 set 来跟踪您看到的单词,因为 inset 的测试非常快。

例子:

report_set = set()
for line in report:
for word in line.split():
if we_want_to_keep_word(word):
report_set.add(word)

完成后: report_list = 列表(report_set)

任何时候你需要强制一个set到一个list中,你都可以。但是如果你只是需要遍历它或者做 in 测试,你可以将它保留为 set; for x in report_set:

是合法的

另一个可能重要也可能无关紧要的问题是,您正在使用 .readlines() 方法一次从文件中删除所有行。对于非常大的文件,最好只使用打开的文件句柄对象作为迭代器,如下所示:

with open("filename", "r") as f:
for line in f:
... # process each line here

一个大问题是我什至不知道这段代码是如何工作的:

while 1:
lines = report.readlines()
if not lines:
break

这将永远循环。第一个语句用 .readlines() 吞掉所有输入行,然后我们再次循环,然后对 .readlines() 的下一次调用有 report已经耗尽,所以调用 .readlines() 返回一个空列表,从而跳出无限循环。但这现在已经丢失了我们刚刚读取的所有行,其余代码必须使用一个空的 lines 变量。这是如何工作的?

因此,摆脱整个 while 1 循环,并将下一个循环更改为 for line in report:

此外,您实际上并不需要保留一个count 变量。您可以随时使用 len(report_set) 来找出 set 中有多少个单词。

此外,对于集合,您实际上不需要检查一个词是否在集合中;您可以随时调用 report_set.add(word),如果它已经在 set 中,则不会再次添加!

此外,您不必按照我的方式来做,但我喜欢制作一个可以完成所有处理的生成器。剥离该行,翻译该行,在空格处拆分,并生成可以使用的单词。我也会强制这些词小写,除非我不知道是否重要的​​是 FOOTNOTES 只在大写中被检测到。

所以,将以上所有内容放在一起,您会得到:

def words(file_object):
for line in file_object:
line = line.strip().translate(None, string.punctuation)
for word in line.split():
yield word

report_set = set()
with open(fullpath, 'r') as report:
for word in words(report):
if word == "FOOTNOTES":
break
word = word.lower()
if len(word) > 2 and word not in dict_file:
report_set.add(word)

print("Words in report_set: %d" % len(report_set))

关于python - 从文本文件中解析唯一的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11111521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com