【问题标题】:Count the word but ignore when it has a word with first letter capitalized before计算单词,但当它有一个首字母大写的单词时忽略
【发布时间】:2021-09-16 07:10:00
【问题描述】:

我正在尝试确定“McDonald”一词是否在单元格中。但是,我希望忽略“McDonald”之前的单词有一个像“Kevin McDonald”这样的第一个大写字母的情况。有什么建议可以通过 pandas 数据框中的正则表达式来解决吗?

data = {'text':["Kevin McDonald has bought a burger.", 
                "The best burger in McDonald is cheeze buger."]}

df = pd.DataFrame(data)
long_list = ['McDonald', 'Five Guys']

# matching any of the words
pattern = r'\b{}\b'.format('|'.join(long_list))

df['count'] = df.text.str.count(pattern)
                                           text
0           Kevin McDonald has bought a burger.
1  The best burger in McDonald is cheeze buger.

预期输出:

                                           text  count
0           Kevin McDonald has bought a burger.      0
1  The best burger in McDonald is cheeze buger.      1

【问题讨论】:

  • 您可以找到此特定模式的正则表达式,但如果您想区分人名与其他专有名称,请使用更合适的名称:使用单词/标记列表,或者更好,加载一个命名实体识别器(NER)
  • 您的意思是应用 NER 来删除类似“Kevin McDonald”的细胞?唔。这是一个非常有趣的想法。 @alexis
  • 或多或少。你没有解释你试图做出这种区分的原因,但无论你的目标是什么,在不久的将来你可能需要更多的规则,并且有比整句正则表达式更好的方法......

标签: python regex pandas


【解决方案1】:

你可以试试这个模式:

pattern = r'\b[a-z].*?\b {}'.format('|'.join(long_list))

df['count'] = df.text.str.count(pattern)

【讨论】:

    【解决方案2】:

    IIUC,目标是在前面的单词大写时不匹配。检查之前是否存在非大写单词会消除许多合法的可能性。

    这是一个适用于更多可能性的正则表达式(句子开头,非单词之前):

    regex = '|'.join(fr'(?:\b[^A-Z]\S*\s+|[^\w\s] ?|^){i}' for i in long_list)
    df['count'] = df['text'].str.count(regex)
    

    示例:

                                               text  count
    0           Kevin McDonald has bought a burger.      0
    1  The best burger in McDonald is cheeze buger.      1
    2                       McDonald's restaurants.      1
    3                 Blah. McDonald's restaurants.      1
    
    

    你可以测试和理解正则表达式here

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2020-08-30
      • 1970-01-01
      • 2012-06-11
      • 2016-12-05
      • 2015-11-10
      • 1970-01-01
      • 2011-09-15
      相关资源
      最近更新 更多