我有如下txt文件:
word, 23
Words, 2
test, 1
tests, 4
我希望他们看起来像这样:
word, 23
word, 2
test, 1
test, 4
我希望能够在Python中获取一个txt文件,并将复数单词转换为单数单词。这是我的代码:
import nltk
f = raw_input("Please enter a filename: ")
def openfile(f):
with open(f,'r') as a:
a = a.read()
a = a.lower()
return a
def stem(a):
p = nltk.PorterStemmer()
[p.stem(word) for word in a]
return a
def returnfile(f, a):
with open(f,'w') as d:
d = d.write(a)
#d.close()
print openfile(f)
print stem(openfile(f))
print returnfile(f, stem(openfile(f)))
我还尝试了这两个定义,而不是stem
定义:
def singular(a):
for line in a:
line = line[0]
line = str(line)
stemmer = nltk.PorterStemmer()
line = stemmer.stem(line)
return line
def stem(a):
for word in a:
for suffix in ['s']:
if word.endswith(suffix):
return word[:-len(suffix)]
return word
然后,我想取重复的单词(例如test
和test
)并通过将它们旁边的数字相加来合并它们。例如:
word, 25
test, 5
我不知道怎么做。一个解决方案是好的,但不是必要的。
Nodebox英语语言库包含将复数形式转换为单数形式的脚本,反之亦然。结帐教程:https://www.nodebox.net/code/index.php/Linguistics#pluralization
要将复数转换为单复数,只需导入
singular
模块并使用singular()
函数。它处理不同词尾、不规则形式等单词的正确转换如果有复杂的单词要单独使用,我建议您不要使用词干,而是使用适当的python包链接
pattern
:返回:
它不是完美的,但它是我找到的最好的。96%基于文档:http://www.clips.ua.ac.be/pages/pattern-en#pluralization
看起来您对Python很熟悉,但我仍将尝试解释一些步骤。让我们从第一个问题开始。当您使用.read()读入多行文件(在您的例子中是单词,数字csv)时,您将把整个文件体读入一个大字符串。
这是很好的,但是当您想将结果传递给stem()时,它将是一个大字符串,而不是一个单词列表。这意味着,当您使用
for word in a
遍历输入时,您将遍历输入字符串的每个单独字符,并将词干分析器应用于这些单独的字符。这绝对不适合你的目的,我们可以做一些不同的事情。
为了方便起见,让我们用1。这需要将openfile(f)更改为以下内容:
这应该给我们一个b行列表,即[soc,32,'soc,1',…]。所以下一个问题是,当我们将字符串列表传递给stem()时,如何处理它。一种方法是:
这绝对是一个非常粗略的解决方案,但是应该充分地遍历输入中的所有行,并使它们失去吸引力。这很粗糙,因为当你放大时,分裂和重新组合字符串并不是特别快。但是,如果您对此感到满意,那么剩下的就是遍历新行列表,并将它们写入您的文件。以我的经验,写一个新文件通常比较安全,但这应该可以正常工作。
当我有以下input.txt
我得到以下标准:
input.txt如下所示:
第二个关于将数字与相同的单词合并的问题改变了我们的解决方案。根据评论中的建议,你应该看看用字典来解决这个问题。与其把这些都作为一个大列表来做,更好的方法(可能更像是pythonic)是遍历输入的每一行,并在处理它们时将它们词干化。如果你还在想办法的话,我会在一段时间内写下这方面的代码。
相关问题 更多 >
编程相关推荐