使用python中的集合替换文本文件中的词/短语时出现问题?

时间:2019-06-21 09:02:50

标签: python regex python-3.x file replace

假设我有一个包含3000个句子的列表(new_list),其中每个句子都用逗号(,)分隔。

示例(一部分):

new_list = ['air purity controller, to detect pollution and letting cold air in', 'air quality in my home by air conditioning', 'air conditioner depending on home', 'household alarm clock for time']

我想通过添加一些特殊字符(在开头和结尾)来替换new_list中的某些单词(单个单词或短语)。我正在借助一套工具来做到这一点。

集合示例:

dict = {'air conditioner', 'air', 'air quality', 'house', 'air conditioning', 'alarm clock'}

集合(dict)的大小为317。我想扫描new_list的每个单词,并在与集合匹配时通过在开始和结束位置附加特殊字符来替换。此外,如果发生匹配并且结果单词是集合中的短语,则另外会在两者之间添加一个特殊字符(_),并在起点和终点处都添加特殊字符。

我尝试过但失败了。请提出我要去哪里的问题(我认为不是,我错了)。 new_list和字典如上所示。

import re, csv, nltk
from nltk.corpus import stopwords
from nltk import regexp_tokenize

with open("raw_data.txt", 'r', encoding = 'utf-8') as f1:
   reader = csv.reader(f1, skipinitialspace=True)
   new_list = next(reader)
   with open('updatd_file.txt', 'w', encoding='utf-8') as f2:
      dic = {'air conditioner', 'air quality', 'air conditioning', 'air', 'house', 'alarm clock'}
      dic = {i : i.replace(' ', '_') for i in dic} 
      pattern = re.compile(r"\b("+"|".join(dic)+r")\b")
      modify_reqs = [pattern.sub(lambda x: "_{}_".format(dic[x.group()]), i) for i in new_list]
      sw = (stopwords.words('english'))
      unfiltered_tokens = [[word for word in regexp_tokenize(word, pattern=r"\s|[\d]|[^\wa-z+]", gaps=True) if word not in sw] for word in modify_reqs]
      f2.write(str(unfiltered_tokens))

我正在执行此程序并将结果写入文件中。当我检查输出文件时,可以看到所需顺序的单词(缺少几个单词),但是有时我看不到它。这种奇怪的行为是怎么回事,我无法理解和探索。

有时候,我能够以正确的顺序(如预期的那样)找到词组'_air_conditioning_',但是下次执行此片段时,我发现的词与'_air_'相同, 'conditioning'(分隔)。其他词组,例如air qualityair conditioning等也发生了同样的事情。问题在于词组不包含单个单词。 请注意,集合(字典)中有317个单词,而new_list包含将近3000个句子。无法在此处显示全部。 这怎么可能?自7-8天以来,我一直在尝试这种做法。

1 个答案:

答案 0 :(得分:0)

@Toto的评论确实帮助我解决了这个问题。

我已经使用关键字set按照单词长度的降序对用过的sorted进行了排序。

dic = sorted(dic, key=len, reverse=True)