【问题标题】:Python - Replace abbreviation in textPython - 替换文本中的缩写
【发布时间】:2019-08-15 01:14:21
【问题描述】:

我的数据框有数千行。
它看起来像这样:

import pandas as pd
import numpy as np
text = ['please send us a dm...','…could you please dm me','dm me plz…','i dmed u yesterday…','dm me asap thx', 'i send a dm to u now', 'thx u r so nice dming u now', 'just sent u a dm']
df = pd.DataFrame({"text": text})

          text
0   please send us a dm...
1   …could you please dm me
2   dm me plz…
3   i dmed u yesterday…
4   dm me asap thx
5   i send a dm to u now
6   thx u r so nice dming u now
7   just sent u a dm

我写了一个函数来替换'text'列中的缩写。

def convert(dataframe, column):
    dataframe[column] = dataframe[column].apply(lambda x: x.replace(" dm ", " direct message "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace(" dming ", " direct message "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace(" dmed ", " direct message "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace(" plz ", " please "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace(" thx ", " thanks "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace(" u ", " you "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace(" asap ", " as soon as possible "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace("...", " "))
    dataframe[column] = dataframe[column].apply(lambda x: x.replace("…", " "))   

但是,我的代码无法正常工作,因此它无法完全替换我的数据框中的所有缩写。

convert(df, 'text')

          text
0   please send us a dm
1   could you please direct message me
2   dm me plz
3   i direct message you yesterday
4   dm me as soon as possible thx
5   i send a direct message to you now
6   thx you r so nice direct message you now
7   just sent you a dm

所需的最终输出如下所示:

          text
0   please send us a direct message
1   could you please direct message me
2   direct message me plz
3   i direct message you yesterday
4   direct message me as soon as possible thanks
5   i send a direct message to you now
6   thanks you r so nice direct message you now
7   just sent you a direct message

我不知道为什么我的代码不起作用。

【问题讨论】:

  • 包括 x.replace("dm", "direct message") 和 x.replace("dm", "direct message")
  • 您可能应该使用正则表达式而不是固定字符串。在正则表达式中,使用\b 表示单词边界。

标签: python python-3.x pandas nlp


【解决方案1】:

首先构建一个替换字典:

replacers = {'dm': 'direct message',
 'thx': 'thanks',
 'dming': 'direct messaging',
 'dmed': 'direct messaged',
 'plz': 'please',
 'u': 'you',
 'asap': 'as soon as possible',
 '...': '',
 '. . .': '',
 'r': 'are'}

然后使用 apply 函数将缩写替换为所需的单词。最后将单词合并回一个完整的字符串。

(
    df.text.str.replace('[...…]','')
    .str.split()
    .apply(lambda x: ' '.join([replacers.get(e, e) for e in x]))
)

0                    please send us a direct message
1                 could you please direct message me
2                           direct message me please
3                    i direct messaged you yesterday
4       direct message me as soon as possible thanks
5                 i send a direct message to you now
6    thanks you are so nice direct messaging you now
7                     just sent you a direct message
Name: text, dtype: object

【讨论】:

    【解决方案2】:

    在这里看看如何

    x.replace(" dm ", " direct message ")
    

    你在前后使用“dm”空格

    但在列表中例如:

    text = ['please send us a dm...']
    

    “dm”后面有一个句点,所以它不会代替它

    【讨论】:

      【解决方案3】:

      一种更简洁的方法是使用“替换”字典并循环遍历 df 和替换字典..就像这样:

      replacers = {' dm ':' direct message ', ' thx ':' thanks ',' dming ':' direct messaging ',' dmed ':' direct messaged ',' plz ':' please ',' thx ':' thanks ',' u ':' you ',' asap ':' as soon as possible ','...':'','. . .':'',' dm':' direct message','dm ': 'direct message ',' thx': ' thanks','thx ':'thanks ',' r ':' are ',}
      
      for i,row in df.iterrows():
          for key in replacers.keys():
              df.iloc[i] = row['text'].replace(key,replacers[key]) 
      

      虽然列出替换的所有变体会很痛苦,例如'dm' 'dm' ' dm' 'plz' 'plz...' 等等...

      你可能需要研究一些正则表达式魔法:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 2022-06-30
        • 2018-10-17
        • 2018-09-01
        • 1970-01-01
        • 2021-11-02
        • 2011-02-26
        相关资源
        最近更新 更多