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



我在文本分析的数据清理中遇到问题。现在我已经在我的数据上做了四个正则表达式,但仍然有不需要的词。我想知道是否有办法只选择单词! 我知道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)

如果你真的想使用正则表达式,你可以使用正则表达式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()')

(未测试(

我用一些代码行替换了第一个和第二个正则表达式,并且工作得非常好。

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。而是在停用词文件中添加了它,不是专业的,但有效。

最新更新