标记文本,但将复合连字符的单词放在一起

Tokenize text but keep compund hyphenated words together

我正在尝试使用预处理功能清理文本。我想删除所有非字母字符,例如标点符号和数字,但我想保留使用破折号而不拆分它们的复合词(例如预投标、预施工)。

def preprocess(text):
  #remove punctuation
  text = re.sub('\b[A-Za-z]+(?:-+[A-Za-z]+)+\b', '-', text)
  text = re.sub('[^a-zA-Z]', ' ', text)
  text = text.split()
  text = " ".join(text)
  return text

比如原文:

"Attended pre-tender meetings" 

应该拆分成

['attended', 'pre-tender', 'meeting'] 

而不是

['attended', 'pre', 'tender', 'meeting']

如有任何帮助,我们将不胜感激!

要删除除字母之间的 - 之外的所有 non-alpha 个字符,您可以使用

[\W\d_](?<![^\W\d_]-(?=[^\W\d_]))

仅等效于 ASCII:

[^A-Za-z](?<![A-Za-z]-(?=[A-Za-z]))

参见regex demo详情:

  • [\W\d_] - 任意 non-letter
  • (?<![^\W\d_]-(?=[^\W\d_])) - 如果有一个字母和一个 - 紧接着在左边,并且在 - 之后有任何字母(选中(?=[^\W\d_]) 正面前瞻)。

参见Python demo

import re

def preprocess(text):
  #remove all non-alpha characters but - between letters
  text = re.sub(r'[\W\d_](?<![^\W\d_]-(?=[^\W\d_]))', r' ', text)
  return " ".join(text.split())

print(preprocess("Attended pre-tender, etc meetings."))
# => Attended pre-tender etc meetings

string 模块有常量字符串 punctuationdigits.

但是,连字符被视为标点符号。因此,如果没有 RE 的帮助,你可以这样做:

from string import punctuation, digits

s = 'Attended pre-tender meetings'

t = s.strip(punctuation.replace('-', '')+digits).split()

print(t)

输出:

['Attended', 'pre-tender', 'meetings']