假设我有一个包含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 quality
,air conditioning
等也发生了同样的事情。问题在于词组不包含单个单词。
请注意,集合(字典)中有317个单词,而new_list
包含将近3000个句子。无法在此处显示全部。
这怎么可能?自7-8天以来,我一直在尝试这种做法。
答案 0 :(得分:0)
@Toto的评论确实帮助我解决了这个问题。
我已经使用关键字set
按照单词长度的降序对用过的sorted
进行了排序。
dic = sorted(dic, key=len, reverse=True)