代码之家  ›  专栏  ›  技术社区  ›  technomalogical

基于关键字组对文本进行分类?

  •  8
  • technomalogical  · 技术社区  · 16 年前

    1. 客户交易:存款、存款、客户、账户、账户

    并希望应用其中的一些概念,但还没有看到任何非常合适的东西。我认为简单的频率分布是行不通的,因为我正在处理的文本太小(一句话)

    3 回复  |  直到 16 年前
        1
  •  6
  •   poundifdef    16 年前

    基本上,相似性度量是一种数学方法,你可以:

    1. 取两组数据(在你的例子中,单词)
    2. 做一些计算/方程式/算法
    3. 结果是你得到了一些数字,这些数字告诉你这些数据有多“相似”。

    对于相似性度量,这个数字是介于0和1之间的数字,其中“0”表示“完全不匹配”,“1”表示“相同”

    cosine similarity Jaccard index

    这两个指标的作用是,它们取两个向量(你的输入句子和你的“关键字”列表),并给你一个数字。如果你在所有类别中都这样做,你可以对这些数字进行排名,以查看哪个匹配具有最大的相似系数。

    客户交易:存款, 存款、客户、账户

    所以你可以构造一个有5个元素的向量:(1,1,1。1,1)。这意味着,对于“客户交易”关键字,你有5个单词,(这听起来很明显,但)每个单词都出现在你的搜索字符串中。跟我来。

    (实际上,这说明了另一个细微差别:你实际上有“客户”。这相当于“客户”吗?)

    你的句子的向量可能是(1,0,1,1,0)

    所以我们可以说:这些向量相差多少倍?让我们比较一下:

    (1,0,1,1,0)

    Hamming distance

    祝你好运

        2
  •  2
  •   mjv    16 年前

    该问题的主要特征是:

    • 根据定义,没有反馈/校准(尽管建议其中一些可能是合适的)

    这些特征带来了好消息和坏消息:实现应该相对简单,但分类过程的一致准确性可能很难实现。此外,少量的各种数量(可能的类别数量、项目中的最大/平均字数等)应该给我们空间来选择可能占用CPU和/或空间的解决方案(如果需要的话)。

    然而,即使有了这个许可证,我建议从(并保持密切关注)开始

    基本算法

       Parameters = 
         CatKWs = an array/hash of lists of strings.  The list contains the possible
                  keywords, for a given category.
             usage: CatKWs[CustTx] = ('deposits', 'deposit', 'customer' ...)
         NbCats = integer number of pre-defined categories
       Variables:
          CatAccu = an array/hash of numeric values with one entry per each of the
                    possible categories.  usage:  CatAccu[3] = 4 (if array) or 
                     CatAccu['CustTx'] += 1  (hash)
          TotalKwOccurences = counts the total number of keywords matches (counts
           multiple when a word is found in several pre-defined categories)
    
        Pseudo code:  (for categorizing one input item)
           1. for x in 1 to NbCats
                CatAccu[x] = 0    // reset the accumulators
           2. for each word W in Item
                 for each x in 1 to NbCats
                     if W found in CatKWs[x]
                          TotalKwOccurences++
                          CatAccu[x]++
           3. for each x in 1 to NbCats
                 CatAccu[x] = CatAccu[x] / TotalKwOccurences  // calculate rating
           4. Sort CatAccu by value
           5. Return the ordered list of (CategoryID, rating)
                  for all corresponding CatAccu[x] values about a given threshold.
    

    现在,我想到了几个简单的改进:(我会认真考虑前两个,并考虑其他的;决定每一个都与项目的范围、要分类的数据的统计特征和其他因素密切相关……)

    • 我们还可以考虑基于双位图(两个连续的单词)的考虑,因为在自然语言中(需求文档不太自然:-),单词接近度通常是单词本身的一个更强指标。
    • 我们可以在分配给前面(甚至后面,在前瞻逻辑中)项目的类别中添加一点重要性。项目可能会出现在相关系列中,我们可以从这种规律性中受益。

    此外,除了计算评级本身外,我们还应该考虑:

    • 一些用于对算法结果本身进行评级的指标(tbd)
    • 收集与指定类别相关的单词列表并最终对其进行统计的一些逻辑。这可能允许识别代表某一类别且最初未在CatKW中列出的单词。

    简单的方法

        3
  •  0
  •   barbsan Cibi    7 年前

    我也面临着同样的问题,即仅基于关键字创建分类器。我有一个类关键字映射器文件,其中包含类变量和特定类中出现的关键字列表。我带着以下算法来做,它真的很好用。

    # predictor algorithm
    for docs in readContent:
        for x in range(len(docKywrdmppr)):
            catAccum[x]=0
        for i in range(len(docKywrdmppr)):
            for word in removeStopWords(docs):
                if word.casefold() in removeStopWords(docKywrdmppr['Keywords'][i].casefold()):
                    print(word)
                    catAccum[i]=catAccum[i]+counter
        print(catAccum)
        ind=catAccum.index(max(catAccum))
        print(ind)
        predictedDoc.append(docKywrdmppr['Document Type'][ind])