使用字典对语料库进行归一化
Normalization on a corpus using a dictionary
我想使用字典对语料库进行词汇归一化。语料库有八千行,词典有几千个词对(非标准:标准)。
我采用了一种讨论的方法 。代码如下所示:
with open("corpus.txt", 'r', encoding='utf8') as main:
words = main.read().split()
lexnorm = {'nonstandard1': 'standard1', 'nonstandard2': 'standard2', 'nonstandard3': 'standard3', and so on}
for x in lexnorm:
for y in words:
if lexnorm[x][0] == y:
y == x[1]
text = ' '.join(lexnorm.get(y, y) for y in words)
print(text)
上面的代码运行良好,但我遇到了一个问题,因为字典中有数千个词对。是否可以通过文本文件表示字典?
最后一个问题,代码的输出文件只有一行。如果它的行数与原始语料库的行数相同,那就太好了。
有人可以帮我解决这个问题吗?我会很感激。
将字典输出为文本文件的一种方法是 JSON
字符串:
import json
lexnorm = {'nonstandard1': 'standard1', 'nonstandard2': 'standard2', 'nonstandard3': 'standard3'} # etc.
with open('lexnorm.txt', 'w') as f:
json.dump(lexnorm, f)
请参阅我对您的原文的评论。我只是在猜测你想做什么:
import json, re
with open('lexnorm.txt') as f:
lexnorm = json.load(f) # read back lexnorm dictionary
with open("corpus.txt", 'r', encoding='utf8') as main, open('new_corpus.txt', 'w') as new_main:
for line in main:
words = re.split(r'[^a-zA-z]+', line)
for word in words:
if word in lexnorm:
line = line.replace(word, lexnorm[word])
new_main.write(line)
以上程序逐行读入corpus.txt
文件,并尝试智能地将行拆分为单词。拆分单个 space 是不够的。考虑以下句子:
'"The fox\'s foot grazed the sleeping dog, waking it."'
单个 space 的标准拆分产生:
['"The', "fox's", 'foot', 'grazed', 'the', 'sleeping', 'dog,', 'waking', 'it."']
您永远无法匹配 The
、fox
、dog
或 it
.
有几种处理方法。我正在拆分一个或多个非字母字符。如果 lexnorm
中的单词由 a-z 以外的字符组成,则可能需要 "tweeked":
re.split(r'[^a-zA-z]+', '"The fox\'s foot grazed the sleeping dog, waking it."')
产量:
['', 'The', 'fox', 's', 'foot', 'grazed', 'the', 'sleeping', 'dog', 'waking', 'it', '']
一旦该行被拆分成单词,每个单词都会在 lexnorm
词典中查找,如果找到,则在原始行中对该单词进行简单替换。最后,该行和对该行所做的任何替换都被写到一个新文件中。然后您可以删除旧文件并重命名新文件。
想想如果先将它们转换为小写,您可能会如何处理匹配的单词。
更新(主要优化)
由于一个文件中很可能有很多重复的词,一个优化是每个唯一的词处理一次,如果文件不是大到无法读入内存,可以这样做:
import json, re
with open('lexnorm.txt') as f:
lexnorm = json.load(f) # read back lexnorm dictionary
with open("corpus.txt", 'r', encoding='utf8') as main:
text = main.read()
word_set = set(re.split(r'[^a-zA-z]+', text))
for word in word_set:
if word in lexnorm:
text = text.replace(word, lexnorm[word])
with open("corpus.txt", 'w', encoding='utf8') as main:
main.write(text)
此处将整个文件读入text
,拆分成单词,然后将单词添加到一个集合word_set
中,保证单词的唯一性。然后在整个文本中查找并替换 word_set
中的每个单词,然后将整个文本重写回原始文件。
我想使用字典对语料库进行词汇归一化。语料库有八千行,词典有几千个词对(非标准:标准)。
我采用了一种讨论的方法
with open("corpus.txt", 'r', encoding='utf8') as main:
words = main.read().split()
lexnorm = {'nonstandard1': 'standard1', 'nonstandard2': 'standard2', 'nonstandard3': 'standard3', and so on}
for x in lexnorm:
for y in words:
if lexnorm[x][0] == y:
y == x[1]
text = ' '.join(lexnorm.get(y, y) for y in words)
print(text)
上面的代码运行良好,但我遇到了一个问题,因为字典中有数千个词对。是否可以通过文本文件表示字典?
最后一个问题,代码的输出文件只有一行。如果它的行数与原始语料库的行数相同,那就太好了。
有人可以帮我解决这个问题吗?我会很感激。
将字典输出为文本文件的一种方法是 JSON
字符串:
import json
lexnorm = {'nonstandard1': 'standard1', 'nonstandard2': 'standard2', 'nonstandard3': 'standard3'} # etc.
with open('lexnorm.txt', 'w') as f:
json.dump(lexnorm, f)
请参阅我对您的原文的评论。我只是在猜测你想做什么:
import json, re
with open('lexnorm.txt') as f:
lexnorm = json.load(f) # read back lexnorm dictionary
with open("corpus.txt", 'r', encoding='utf8') as main, open('new_corpus.txt', 'w') as new_main:
for line in main:
words = re.split(r'[^a-zA-z]+', line)
for word in words:
if word in lexnorm:
line = line.replace(word, lexnorm[word])
new_main.write(line)
以上程序逐行读入corpus.txt
文件,并尝试智能地将行拆分为单词。拆分单个 space 是不够的。考虑以下句子:
'"The fox\'s foot grazed the sleeping dog, waking it."'
单个 space 的标准拆分产生:
['"The', "fox's", 'foot', 'grazed', 'the', 'sleeping', 'dog,', 'waking', 'it."']
您永远无法匹配 The
、fox
、dog
或 it
.
有几种处理方法。我正在拆分一个或多个非字母字符。如果 lexnorm
中的单词由 a-z 以外的字符组成,则可能需要 "tweeked":
re.split(r'[^a-zA-z]+', '"The fox\'s foot grazed the sleeping dog, waking it."')
产量:
['', 'The', 'fox', 's', 'foot', 'grazed', 'the', 'sleeping', 'dog', 'waking', 'it', '']
一旦该行被拆分成单词,每个单词都会在 lexnorm
词典中查找,如果找到,则在原始行中对该单词进行简单替换。最后,该行和对该行所做的任何替换都被写到一个新文件中。然后您可以删除旧文件并重命名新文件。
想想如果先将它们转换为小写,您可能会如何处理匹配的单词。
更新(主要优化)
由于一个文件中很可能有很多重复的词,一个优化是每个唯一的词处理一次,如果文件不是大到无法读入内存,可以这样做:
import json, re
with open('lexnorm.txt') as f:
lexnorm = json.load(f) # read back lexnorm dictionary
with open("corpus.txt", 'r', encoding='utf8') as main:
text = main.read()
word_set = set(re.split(r'[^a-zA-z]+', text))
for word in word_set:
if word in lexnorm:
text = text.replace(word, lexnorm[word])
with open("corpus.txt", 'w', encoding='utf8') as main:
main.write(text)
此处将整个文件读入text
,拆分成单词,然后将单词添加到一个集合word_set
中,保证单词的唯一性。然后在整个文本中查找并替换 word_set
中的每个单词,然后将整个文本重写回原始文件。