从文件中读取文本,然后在标记的文本中重复写入另一个文件

时间:2015-11-12 13:26:27

标签: python regex python-3.x repeat

我是Python和本论坛的初学者,所以请原谅任何模糊的描述或错误。

我在读取/写入文件时遇到问题。我要做的是从文件中读取文本,然后找到多次出现的单词,将它们标记为 repeated_word ,然后将原始文本写入另一个文件,但是在他们周围标有星号的重复单词。

我发现很难理解我将如何比较单词(没有标点符号等),但仍然能够将原始上下文中的单词写入文件。

我被一些人推荐使用正则表达式,但我不知道如何使用它。另一种方法是遍历文本字符串并进行标记化和规范化,通过遍历每个字符进行排序,然后从每个单词中生成某种av对象或元素。

我很感谢能够就如何解决这个问题提出想法的人。主要问题不是如何找到重复的单词,而是如何标记它们然后在它们的上下文中将它们写入文件。对编码的一些帮助将非常感谢,谢谢。

修改 我已经用我迄今为止提出的代码更新了代码。如果您有任何想法“编码错误”,请对其进行评论。

为了解释白名单课程,作业有两个部分,一个是我应该标记单词的地方,一个是关于白名单的,包含“允许重复”的单词,因此不应标记。

我已经阅读了大量有关正则表达式的内容,但我仍然无法理解如何使用它。

3 个答案:

答案 0 :(得分:1)

基本上,你需要做两件事:找出重复的单词,然后将每个单词转换成其他单词(即原始单词周围有一些标记)。由于无法通过整个文件无法知道哪些单词重复,因此您需要进行两次传递。

对于第一遍,您需要做的就是从文本中提取单词并计算每个单词出现的次数。为了确定单词是什么,您可以使用正则表达式。一个好的起点可能是

regex = re.compile(r"[\w']+")

函数re.compile从字符串创建正则表达式。这个正则表达式匹配一个或多个单词字符(\w)或撇号的任何序列,因此它会捕捉收缩而不是标点符号,我认为在很多"正常"英语文本应该包含所有单词。

创建正则表达式对象后,可以使用其finditer方法迭代文本中此正则表达式的所有匹配项。

for word in regex.finditer(text):

您可以使用Counter class计算每个单词出现的次数。 (我把实现留作练习。:-P文档应该非常有用。)

在您计算出每个单词出现次数之后,您将不得不挑选出那些计数为2或更多的单词,并在输入文本中找到一些方法来识别它们。我认为正则表达式也会帮助你。具体来说,您可以通过编译由|加入的单词组成的字符串来创建一个正则表达式对象,该对象将匹配任何选定的单词集。

regex = re.compile('|'.join(words))

其中wordslistset或某些可迭代的。既然你是Python的新手,那就不要太过花哨了(尽管有人可以);只需编写一种方法来浏览Counter或其他任何内容,并创建一个计数为2或更多的所有单词的list,然后按照我向您展示的方式创建正则表达式。

一旦你拥有了它,你可能会受益于sub method,它接受​​一个字符串并用其他一些文本替换其中正则表达式的所有匹配项。在您的情况下,替换文本将是带有星号的原始单词,因此您可以这样做:

new_text = regex.sub(text, r'*\0*')

在正则表达式替换中,\0指的是正则表达式匹配的任何内容。

最后,您可以将new_text写入文件。

答案 1 :(得分:0)

如果您知道文本只包含字母字符,则可能更容易忽略a-z之外的字符,而不是尝试删除所有标点符号。

以下是删除非a-z或空格的所有字符的一种方法:

file = ''.join(c for c in file if 97 <= ord(c) <= 122 or c == ' ')

这是有效的,因为ord()返回给定字符的ASCII代码,而ASCII 97-122代表a-z(小写)。

然后你想把它们分成几个单词,你可以这样做:

words = file.split()

如果将其传递给Counter数据结构,它将计算每个单词的出现次数。

counter = Counter(file.split)

然后counter.items()将包含从单词到出现次数的映射。

答案 2 :(得分:0)

行。我认为这是一项家庭作业,所以我不打算给你一个完整的解决方案。但是,你真的需要做很多事情。

第一种是将输入文件读入内存。然后将其拆分为可能包含在列表中的组件单词(tokenize it),适当清理以删除流浪标点符号。您似乎很顺利,但我建议您查看可用于字符串的split()strip()方法。

您需要考虑您是否希望计数区分大小写,因此您可能希望将列表中的每个单词转换为(例如)小写以保持一致。因此,您可以使用for循环和字符串lower()方法执行此操作,但列表理解可能更好。

然后,您需要浏览单词列表并计算每个单词出现的次数。如果您查看collections.Counter,您会发现这对您来说很重要,或者您需要构建一个字典,其中包含单词作为键和单词的计数。 (您可能还想在这里查看collections.defaultdict课程。)

最后,您需要查看您从文件中读取的文本以及包含多个匹配项的每个单词(即字典或计数器中的计数> 1)将其正确标记。正则表达式旨在完成这类事情。所以我建议您查看re库。

完成后,您只需将结果写入文件,这很简单。

最后,关于您的文件操作(阅读和写作),我建议您考虑将try ... except构造替换为with ... as