Nlp 在文本预处理中,收缩不能识别单引号和双引号

Nlp 在文本预处理中,收缩不能识别单引号和双引号,nlp,python-3.7,Nlp,Python 3.7,我正在对我的文章进行文本预处理。 在我的预处理代码中,其中一个步骤是收缩,在这里我试图扩展诸如“我有”、“我在”等词。 但我面临一个问题,当我键入示例文本时,收缩起作用,但我不处理文本。 我也知道原因。原因是字体不同。 例如,示例文本: “我来这里是因为需要一位内阁部长。” 下面是相同的文本,但我自己写的: “我来这里是因为需要一位内阁部长。” 如果仔细观察,您可以看到引号(单引号和双引号)中的差异 我如何解决这个问题 下面是我用于收缩的代码 def expand_contractions(ro

我正在对我的文章进行文本预处理。 在我的预处理代码中,其中一个步骤是收缩,在这里我试图扩展诸如“我有”、“我在”等词。 但我面临一个问题,当我键入示例文本时,收缩起作用,但我不处理文本。 我也知道原因。原因是字体不同。 例如,示例文本:

“我来这里是因为需要一位内阁部长。”

下面是相同的文本,但我自己写的:

“我来这里是因为需要一位内阁部长。”

如果仔细观察,您可以看到引号(单引号和双引号)中的差异

我如何解决这个问题

下面是我用于收缩的代码

def expand_contractions(row, contraction_mapping=CONTRACTION_MAP):
    Japan_3 = row['Articles']
    Japan_3 = Japan_3.apply(lambda x: str(x).replace("’", "'"))
    contractions_pattern = re.compile('({})'.format('|'.join(contraction_mapping.keys())),
                                      flags=re.IGNORECASE | re.DOTALL)

    def expand_match(contraction):
        match = contraction.group(0)
        first_char = match[0]
        expanded_contraction = contraction_mapping.get(match) \
            if contraction_mapping.get(match) \
            else contraction_mapping.get(match.lower())
        expanded_contraction = first_char + expanded_contraction[1:]
        return expanded_contraction

    expanded_text = contractions_pattern.sub(expand_match, Japan_3)
    expanded_text = re.sub("'", "", expanded_text)
    return expanded_text


Japan['expanded_text'] = Japan.apply(expand_contractions, axis=1)
更改代码后,我发现以下错误:

AttributeError:(“'str'对象没有属性'apply'”,发生在 索引0')

我不知道如何以一种不那么令人困惑的方式来解释它


提前谢谢

一个解决办法是将所有错误的收缩标记替换为正确的收缩标记。在您的情况下,这可以通过对Dataframe中的Article列应用替换函数来实现:

Japan_3 = Japan_3.apply(lambda x:str(x).replace("’","'"))
我不能测试你的函数,因为我没有你作为参数传递的收缩映射。但我的猜测是,您可以在
Japan\u 3=row['Articles']
之后添加这段代码。然后像正常一样执行其余的收缩。事实上,我会这样调用函数:

expand_contractions(Japan, contraction_mapping=CONTRACTION_MAP)
但是,说实话,我不知道你到底想在代码中做什么来消除宫缩。公平地说,为了扩展缩略语,我只替换文本中的每一个缩略语,但它们的扩展形式。下面是我要做的。虽然我没有测试它,所以它可能不会相应地工作,但我猜它是类似的

CONTRACTION_MAP = {"I'm":"I am"} # contraction definition. This is just an example, please change it here with your contractions
Japan["Article"] = Japan["Article"].apply(lambda x:str(x).replace("’","'")) # replace the wrong quotation mark by the correct one
for contraction in CONTRACTION_MAP:
    Japan["Article"] = Japan["Article"].apply(lambda x:str(x).replace(contraction,CONTRACTION_MAP[contraction])) # in this case I'm just replacing the contraction by the expanded form. I iterate it through all the possible contractions 

将收缩报价转换为单个报价不是更容易吗?您可以运行一个简单的replace命令,将所有引号从一种类型转换为有效的类型,然后执行该类型。例如:string.replace(“'”,“'”),它使我进入我的状态。然后用你的代码把“我是”转换成“我是”。这样行吗?或者你真的需要这两种形式的引号吗?是的,它肯定会起作用。你能告诉我代码行吗?我正在研究pandas,我有一个专栏名“Articles”,所以我写的是:Japan=pd.read_csv(“Japan.csv”)Japan['Articles']=Japan['Articles'].string.replace(“,”)),但它显示了错误:AttributeError:'Series'对象没有属性'string'。我回答了这个问题,请检查我的解决方案是否适合您的目的。我必须将新的代码行放在哪里?在日本之后=第3行[“文章”]?如果我把它放在那里,它就显示出一个错误。我可以用你的代码行编辑我问题中的代码吗?也许你会很容易告诉我?我已经更新了答案中的代码!请检查并告诉我它是否正确或我犯了错误!你正在做的事情有些不清楚。1-在您更新的代码中,当您调用Japan.apply时,我认为这不是调用expand_contractions函数的正确方法。为什么不直接称之为扩张收缩(日本,收缩映射=收缩映射)?2-另一种方法是迭代已有的压缩映射,并将映射应用于字符串。这样行吗?我将更新答案以显示解决问题的不同方法。非常感谢!我用了你的代码,它成功了!再次感谢!我用了你的环!