数字的 Fasttext 模型表示

Fasttext model representations for numbers

我想为数字创建一个快速文本模型。这是一个好方法吗?

用例:

我有一组给定的大约 100.000 个整数发票编号。 我们的 OCR 有时会创建错误的发票编号,例如 1000o00 或 383I338,因此我的想法是使用 fasttext 根据我的 100.000 个整数来预测最近的发票编号。 由于事先知道正确的发票编号,我训练了一个包含所有发票编号的 fastext 模型来创建仅包含发票编号的词嵌入 space。

但是它不起作用,我不知道我的想法是否完全错误?但我假设即使我没有句子,嵌入到向量 space 中也应该有效,因此模型也应该找到 383I338 和 3831338 之间的相似性。

这是我的一些代码:

import pandas as pd
from random import seed
from random import randint
import fasttext
# seed random number generator
seed(9999)
number_of_vnr = 100000
min_vnr = 1111    
max_vnr = 999999999

# generate vnr integers
versicherungsscheinnummern = [randint(min_vnr, max_vnr) for i in range(number_of_vnr)]

# save numbers as csv
df_vnr = pd.DataFrame(versicherungsscheinnummern, columns=['VNR'])
df_vnr['VNR'].dropna().astype(str).to_csv('vnr_str.csv', index=False)

# train model
model = fasttext.train_unsupervised('vnr_str.csv',"cbow", minn=2, maxn=5)  

连space中的数据都找不到

model.get_nearest_neighbors("833803015")
[(0.10374893993139267, '</s>')]

模特没有字

model.words
["'</s>'"]

我怀疑 FastText 是正确的方法。

在自然语言中,单词 roots/prefixes/suffixes(字符 n-gram)可以暗示意义,而大多数发票编号方案只是递增的数字。

每个“###”或“####”都会有相似的频率。 (好吧,出于类似本福德定律的原因,可能会偏向左侧的低位数字。)除非完全相同发票号码在整个过程中经常重复*语料库,以便整个标记及其片段从周围的其他标记中获得类似单词的含义,FastText 的 post-训练最近邻不太可能提供任何关于正确数字的提示。 (为了让它有机会提供帮助,您希望相同的发票编号不仅要重复多次,而且对于很多这样的外观都有类似的 OCR 错误 - 但我强烈怀疑您的语料库只有发票编号在个别文本上。)

真正的目标是更正发票编号,还是只是让它们在经过更有意义的、类似文本的标记训练的模型中不那么嘈杂? (如果是后者,最好丢弃任何看起来像发票号码的东西——有或没有 OCR 故障——或者同样非常罕见,很可能是 OCR scanno。)

也就是说,如果真正的需要是纠正 OCR 错误,那么统计和编辑距离方法可能会有所帮助——只是不像 FastText 这样依赖于语义上下文的方法。您可能会从 Peter Norvig 关于“How to Write a Spelling Corrector”的经典文章中获得有用的想法。