在 Python 中使用正则表达式同时删除 HTML 标签、字符、数字和单字母单词?

Get rid of HTML tags, characters, numbers and single letter words simultaneously with Regex in Python?

我在文本分析的数据清理方面遇到问题。现在我已经对我的数据做了四个正则表达式,但仍然有不需要的词。我想知道是否有办法 select 只是文字! 我知道 Scikit-learn 有这个选项,但我不是在处理英文文本。 这是我为以上各项输入的内容,但我想知道是否还有其他方法可以做到这一点

def clean(data):
    e = re.compile(r"\b[a-zA-Z]\b") #single letters
    data = e.sub('', data)
    r = re.compile(r'<[^<]*?>') # html tags
    data = r.sub('', data)
    p = re.compile(r'[^-\w]') # remove characters like \n
    data = p.sub(' ', data)
    q = re.compile(r'[\d_\.]*') # remove numbers
    return q.sub('', data)

如果您真的想要为此使用 RegEx,您可以使用 RegEx r'<[^>]+>' 来匹配和删除所有标签。

还有一个标准函数可以将&smp;等经典实体转成字符:xml.sax.saxutils.unescape.

这里有一个简单的演示:

from xml.sax.saxutils import unescape
import re

sub_text = re.compile(r'<[^>]+>').sub

html = '<p class="Body">me &amp; you</p>'

text = unescape(sub_text('', html))

print(text)

你得到:“我和你”

然后您可以添加更多规则来过滤您的数据。

另一种方法是使用 lxml 解析您的 HTML 数据,并使用 xpath 函数获取文本

import lxml.html

root = lxml.html.fragment_fromstring(html)
text = root.xpath('string()')

(未测试)

我用几行代码替换了第一个和第二个 Regex,效果更好。

def clean(data):
p = re.compile(r'[^-\w]') # remove characters
data = p.sub(' ', data)
q = re.compile(r'[\d_\.]*') # remove numbers
return q.sub('', data)
for i in text_train:
    for j, t in enumerate(text_train[i]):
        text_train[i][j] = [w for w in clean(t).split() if len(w)>1]

上面的代码对文本进行了标记,并且只接受超过一个字母的单词。 对于另一个问题,我尝试了@laurent_laporte 的回答,但我的文本中仍然有 &amp。而是在停用词文件中添加,不专业但有效。