【发布时间】:2019-06-21 09:02:50
【问题描述】:
假设我有一个包含 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 和 dict 如上所示。
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 等其他短语也发生了同样的事情。问题在于短语不是单个单词。
请注意,在集合(dict)中,我有 317 个单词和 new_list 包含近 3000 个句子。不可能在这里全部展示。
这怎么可能?我从 7-8 天开始尝试这个,现在令人沮丧。
【问题讨论】:
-
首先按单词长度降序对字典进行排序。
-
我没有找到你@toto。
-
set和dict不是同一个东西,也不能保证订购。 -
你为什么不提供一个玩具例子和你想要达到的结果?这将简化任何正在阅读您的问题的人的工作。包括你自己。
-
其实大文件是不可能的。我已经用一个小列表交叉检查了相同的内容,并且一切正常(如预期的那样)。我在查询本身中提到了这一点
标签: python regex python-3.x file replace