我们可以更改它,以便我们将输入文件作为一个行列表读取
我们可以使用大字符串并将其分解为列表。
我们可以一次一个地检查一行中的每一行。
醇>
为了方便起见,让我们滚动#1。这将需要将openfile(f)更改为以下内容:
def openfile(f):
with open(f,'r') as a:
a = a.readlines() # a will equal 'soc, 32\nsoc, 1\n...' in your example
b = [x.lower() for x in a]
return b
这应该给我们b作为一个行列表,即[' soc,32',' soc,1',...]。因此,当我们将字符串列表传递给stem()时,下一个问题就变成了我们如何处理字符串列表。一种方法如下:
def stem(a):
p = nltk.PorterStemmer()
b = []
for line in a:
split_line = line.split(',') #break it up so we can get access to the word
new_line = str(p.stem(split_line[0])) + ',' + split_line[1] #put it back together
b.append(new_line) #add it to the new list of lines
return b
这绝对是一个非常粗略的解决方案,但是应该充分迭代输入中的所有行,并对它们进行分解。这很粗糙,因为当你放大它时,分裂弦并重新组装它们并不是特别快。但是,如果您对此感到满意,那么剩下的就是遍历新行列表,并将它们写入您的文件。根据我的经验,写入新文件通常更安全,但这应该可以正常工作。
def returnfile(f, a):
with open(f,'w') as d:
for line in a:
d.write(line)
print openfile(f)
print stem(openfile(f))
print returnfile(f, stem(openfile(f)))
当我有以下input.txt时
soc, 32
socs, 1
dogs, 8
我得到以下标准输出:
Please enter a filename: input.txt
['soc, 32\n', 'socs, 1\n', 'dogs, 8\n']
['soc, 32\n', 'soc, 1\n', 'dog, 8\n']
None
input.txt如下所示:
soc, 32
soc, 1
dog, 8
关于将数字与相同单词合并的第二个问题从上面改变了我们的解决方案。根据评论中的建议,您应该看一下使用词典来解决这个问题。而不是将其作为一个大的列表,更好(也可能更pythonic)的方法是迭代输入的每一行,并在处理它们时阻止它们。如果您仍在努力解决这个问题,我会稍微编写一下这方面的代码。