在 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 & 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 的回答,但我的文本中仍然有 &
。而是在停用词文件中添加,不专业但有效。
我在文本分析的数据清理方面遇到问题。现在我已经对我的数据做了四个正则表达式,但仍然有不需要的词。我想知道是否有办法 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 & 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 的回答,但我的文本中仍然有 &
。而是在停用词文件中添加,不专业但有效。