使用正则表达式包含字典中的一组键并将它们匹配到字符串列表中
Using Regex to encompass a group of keys in a dictionary and match them inside of a list of strings
我是 python 中的文本清理新手,但我目前创建了一个包含各种俚语的字典 words/acronyms/contractions,看起来像这样:
fulltext = {'BYOB': 'bring your own beer', 'couldn't': 'could not', 'finna': 'going to'}... etc.
我还有另一个大型文本数据语料库:
uncleaned_text = ['This is finna be crazy', 'I don't know why we couldn't be there', 'I should have known when the event was BYOB that it would be terrible']
为此,我正在尝试 'clean' 通过将与字典键匹配的字符串列表中的那些单词替换为其对应的值。所以,我理想的输出是:
cleaned text = ['This is going to be crazy', 'I don't know why we could not be there', 'I should have known when the event was bring your own beer that it would be terrible']
我知道我应该以某种方式使用 REGEX,我知道我应该使用循环,但我绝对没有接近我认为应该做的事情,因为我得到的错误是内置函数不可迭代...
有什么建议吗?
uncleaned_text中的句子:
对于句子中的单词:
如果 fulltext.keys 中的单词:
word.replace(单词, fulltext.key)
这可能会有帮助:
import re
fulltext = {"BYOB": "bring your own beer", "couldn't": "could not", "finna": "going to"}
uncleaned_text = ["This is finna be crazy", "I don't know why we couldn't be there", "I should have known when the event was BYOB that it would be terrible"]
cleaned_text = []
keys = fulltext.keys()
for text in uncleaned_text:
for key in keys:
if key in text:
cleaned_text.append(re.sub(key,fulltext[key],text))
print("cleaned_text => ",cleaned_text)
但是,由于嵌套的 for 循环,如果您有大量数据,此代码将花费很长时间 运行。
您收到的错误是因为 dictionary.keys
是一个函数而不是列表。因此,要获得所有密钥,您需要使用 fulltext.keys()
而不是 fulltext.keys
。字典 class 的键成员是一个 returns 键列表的函数。检查字典键中是否存在特定单词的更 pythonic 方法是:if key in dictionary
。 in
运算符检查左操作数是否是字典中的键,因此您不必使用 .keys
函数。
对于函数的其余部分,我将执行以下操作:
clean_text = []
for sentence in uncleaned_text:
for word in sentence.split():
if word in fulltext:
sentence = sentence.replace(word, fulltext[word])
clean_text.append(sentence)
我所做的更改说明:
- 您需要将句子拆分成单词。这个句子只是一个长字符串,所以如果你遍历它,你会单独得到句子的每个字符。 .split 方法默认在每个 space 上拆分它。
- replace 方法不会就地更改字符串,因此您必须在其他变量中捕获它。
- 要从字典中获取值,您需要使用键。在这种情况下,Word 是我们的关键,所以我将
fulltext.key
更改为 fulltext[word]
。这将从全文字典中获取与 word
关联的值。
- 添加了一个数组以将更改后的句子附加到。
这将使原始列表 (uncleaned_text
) 保持不变。
我是 python 中的文本清理新手,但我目前创建了一个包含各种俚语的字典 words/acronyms/contractions,看起来像这样:
fulltext = {'BYOB': 'bring your own beer', 'couldn't': 'could not', 'finna': 'going to'}... etc.
我还有另一个大型文本数据语料库:
uncleaned_text = ['This is finna be crazy', 'I don't know why we couldn't be there', 'I should have known when the event was BYOB that it would be terrible']
为此,我正在尝试 'clean' 通过将与字典键匹配的字符串列表中的那些单词替换为其对应的值。所以,我理想的输出是:
cleaned text = ['This is going to be crazy', 'I don't know why we could not be there', 'I should have known when the event was bring your own beer that it would be terrible']
我知道我应该以某种方式使用 REGEX,我知道我应该使用循环,但我绝对没有接近我认为应该做的事情,因为我得到的错误是内置函数不可迭代...
有什么建议吗?
uncleaned_text中的句子: 对于句子中的单词: 如果 fulltext.keys 中的单词: word.replace(单词, fulltext.key)
这可能会有帮助:
import re
fulltext = {"BYOB": "bring your own beer", "couldn't": "could not", "finna": "going to"}
uncleaned_text = ["This is finna be crazy", "I don't know why we couldn't be there", "I should have known when the event was BYOB that it would be terrible"]
cleaned_text = []
keys = fulltext.keys()
for text in uncleaned_text:
for key in keys:
if key in text:
cleaned_text.append(re.sub(key,fulltext[key],text))
print("cleaned_text => ",cleaned_text)
但是,由于嵌套的 for 循环,如果您有大量数据,此代码将花费很长时间 运行。
您收到的错误是因为 dictionary.keys
是一个函数而不是列表。因此,要获得所有密钥,您需要使用 fulltext.keys()
而不是 fulltext.keys
。字典 class 的键成员是一个 returns 键列表的函数。检查字典键中是否存在特定单词的更 pythonic 方法是:if key in dictionary
。 in
运算符检查左操作数是否是字典中的键,因此您不必使用 .keys
函数。
对于函数的其余部分,我将执行以下操作:
clean_text = []
for sentence in uncleaned_text:
for word in sentence.split():
if word in fulltext:
sentence = sentence.replace(word, fulltext[word])
clean_text.append(sentence)
我所做的更改说明:
- 您需要将句子拆分成单词。这个句子只是一个长字符串,所以如果你遍历它,你会单独得到句子的每个字符。 .split 方法默认在每个 space 上拆分它。
- replace 方法不会就地更改字符串,因此您必须在其他变量中捕获它。
- 要从字典中获取值,您需要使用键。在这种情况下,Word 是我们的关键,所以我将
fulltext.key
更改为fulltext[word]
。这将从全文字典中获取与word
关联的值。 - 添加了一个数组以将更改后的句子附加到。
这将使原始列表 (uncleaned_text
) 保持不变。