【发布时间】:2015-12-07 11:54:26
【问题描述】:
在 Python 2.7 中使用 pandas 我试图计算一个短语(例如,“非常好”)出现在存储在 CSV 文件中的文本片段中的次数。我有多个短语和多段文字。我使用以下代码在第一部分中取得了成功:
for row in df_book.itertuples():
index, text = row
normed = re.sub(r'[^\sa-zA-Z0-9]', '', text).lower().strip()
for row in df_phrase.itertuples():
index, phrase = row
count = sum(1 for x in re.finditer(r"\b%s\b" % (re.escape(phrase)), normed))
file.write("%s," % (count))
但是,如果它前面有不同的短语(例如,“它不是”),我不想计算该短语。因此我使用了一个否定的lookbehind断言:
for row in df_phrase.itertuples():
index, phrase = row
for row in df_negations.itertuples():
index, negation = row
count = sum(1 for x in re.finditer(r"(?<!%s )\b%s\b" % (negation, re.escape(phrase)), normed))
这种方法的问题在于它记录了从 df_negations 数据帧中提取的每个否定的值。因此,如果 finditer 没有找到“它不是‘非常好’”,那么它将记录一个 0。对于每个可能的否定,依此类推。
我真正想要的只是一个短语在没有前面短语的情况下使用的总次数。换句话说,我想计算每次“非常好”出现的时间,但前提是它之前没有在我的否定列表中出现否定(“它不是”)。
另外,我很高兴听到有关加快流程运行的建议。我有 100 多个短语、100 多个否定句和 1 多万条文本。
【问题讨论】:
-
这看起来正合我意。您对我如何将这种方法与单独的 CSV 文件一起使用有什么建议吗?我的所有否定都存储在每一行中?
标签: python regex python-2.7 pandas