【问题标题】:String classification, how to encode character-by-character and train?字符串分类,如何逐字符编码并训练?
【发布时间】:2021-03-16 10:37:56
【问题描述】:

我正在尝试构建一个分类器,以根据这些文件的名称将一些文件分为 150 个类别。以下是我的数据集中的一些文件名示例(约 700k 个文件):

104932489 - urgent - contract validation for xyz limited.msg
treatment - an I l - contract n°4934283 received by partner.pdf
- invoice_8843238_1_europe services_business 8592342sid paris.xls
140159498736656.txt
140159498736843.txt
fsk_000000001090296_sdiselacrusefeyre_2000912.xls
fsk_000000001091293_lidlsnd1753mdeas_2009316.xls

您可以看到文件名实际上可以是任何东西,但是对于相同的类别,总会有一些模式受到尊重。它可以是数字(有时很接近)、特殊字符(空格、-、°),有时是长度等。

因为我有大约 700k 文档,所以逐个提取所有这些模式需要很长时间。另外,我对 100% 的准确率不感兴趣,70% 就足够了。

真正的问题是我不知道如何编码这些数据。我尝试了很多方法:

  • 逐个字符标记并将它们提供给具有嵌入层的 LSTM 模型。但是,我无法实现它并出现尺寸错误。
  • 调整 Word2Vec 以将字符转换为向量。但是,这会自动删除所有标点符号和空格字符,而且我会丢失数字数据。另一个问题是它创建了更多无用的维度:如果大小为 20,我将拥有 20 个维度的数据,但如果我仔细观察,在这 20 个维度中总是有相同的 150 个向量,所以它真的没用。我可以使用二维大小,但我仍然需要数字数据和特殊字符。
  • 从每个路径生成 n-gram,范围为 1-4,然后使用 CountVectorizer 计算频率。我检查并没有丢弃特殊字符,但它给了我大约 400,000 个特征!我正在使用 UMAP (n_components=5, metric='hellinger') 运行降维,但降维运行了 2 小时,然后内核崩溃。

有什么想法吗?

【问题讨论】:

    标签: machine-learning classification nltk data-science embedding


    【解决方案1】:

    我目前也在研究字符级 lstm。它的工作原理与您使用单词时完全相同。您需要一个词汇表,例如 a - z,然后您只需将字母的索引作为其整数表示。例如:

    "bad" -> "b", "a", "d" -> [1, 0, 3]

    现在您可以创建一个嵌入查找表(例如使用 pytorchs nn.Embedding 函数)。您只需为您的词汇的每个索引创建一个随机向量。例如:

    "a" -> 0 > [-0.93, 0.024, -.0.73, ..., -0.12]

    你说你试过这个但遇到尺寸错误?也许给我们看代码!

    或者您可以使用 Gensim 库使用 word2vec 创建非随机嵌入:

    from gensim.models import Word2Vec
    
    # 'total_words' is a list containing every word of your dataset split into its characters
    total_words = [...]
    model = Word2Vec(total_words , min_count=1, size=32)
    model.save(save_model_file)
    
    # lets test it for the character 'a'
    embedder = Word2Vec.load(save_model_file)
    v = embedder["a"]
    
    # v now will be a the embedding vector of a with size 32x1
    

    我希望我能弄清楚如何为字符创建嵌入。 您可以像对待句子分类中的单词一样对待单词分类中的字符。

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 2019-10-24
      • 2018-11-06
      • 2021-08-23
      • 1970-01-01
      • 2013-11-01
      • 2012-08-24
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多