首页 文章

文本分割:基于字典的单词拆分[关闭]

提问于
浏览
5

背景

将数据库列名拆分为等效的英文文本以生成数据字典 . 英语词典是从公司文档,维基和电子邮件的语料库中创建的 . 字典( lexicon.csv )是包含单词和概率的CSV文件 . 因此,有人写“_1485630”这个词(在电子邮件或维基页面上)的次数越多,"therapistname"分裂为"therapist name"的可能性就越高,而不是其他东西 . (词典可能甚至不包括强奸犯这个词 . )

源代码

数据文件

问题(已更新2011-01-03)

遇到以下问题时:

dependentrelationship::end depend ent dependent relationship
end=0.86
ent=0.001
dependent=0.8
relationship=0.9

存在以下可能的解决方

dependentrelationship::dependent relationship
dependentrelationship::dep end ent relationship
dependentrelationship::depend ent relationship

词典包含具有相对概率的词(基于词频): dependent 0.8end 0.86relationship 0.9depend 0.3ent 0.001 .

消除 dep end ent relationship 的解决方案,因为 dep 不在词典中(即75%的单词使用率),而其他两个解决方案涵盖了词典中100%的单词 . 在剩下的解决方案中, dependent relationship 的概率是0.72而 depend ent relationship 是0.00027 . 因此,我们可以选择 dependent relationship 作为正确的解决方案 .

相关

问题

鉴于:

// The concatenated phrase or database column (e.g., dependentrelationship).
String concat;

// All words (String) in the lexicon within concat, in left-to-right order; and
// the ranked probability of those words (Double). (E.g., {end, 0.97}
// {dependent, 0.86}, {relationship, 0.95}.)
Map.Entry<String, Double> word;

您将如何实现基于词典覆盖率和概率生成最可能解决方案的例程?例如:

for( Map.Entry<String, Double> word : words ) {
  result.append( word.getKey() ).append( ' ' );

  // What goes here?

  System.out.printf( "%s=%f\n", word.getKey(), word.getValue() );
}

谢谢!

3 回答

  • 0

    Peter Norvig在python中写了一些东西 .

    http://norvig.com/ngrams/ngrams.py

    包含一个名为segment的函数 . 它运行一系列单词的朴素贝叶斯概率 . 效果很好 . 可以成为您尝试在Java中完成的基础的良好基础 .

    如果你把它转换成java,我会对看到它的实现感兴趣 .

    谢谢 .

    麦克风

  • 0

    我会稍微改变一下这个问题 . 重要的是“结束”和“依赖”重叠,但在你的单词Map中丢失了 . 如果您要创建一组字图,而不是单个字图,每个字图都表示列名称的可能分段,仅包含非重叠字,您可以根据字的概率计算每个分段的分数和字长 . 分段的分数将是分段中各个单词的分数的平均值 . 单个单词的得分将是单词长度(l)和概率(p)的某种函数,类似于

    score=al + bp
    

    其中a和b是您可以调整以获得正确混音的权重 . 平均每个单词的分数以获得分段的分数,并选择具有最高分数的分段 . 分数函数也不必是线性加权,您可以尝试对数,指数或更高阶的多项式(例如正方形)

  • 1

    你的问题在NLP中是一个非常普遍的问题 - 不要从重新发明轮子开始 - 它将花费你很长时间而不是已经存在的那么好 .

    首先,您应该看看NLP库提供的内容:http://en.wikipedia.org/wiki/Natural_language_processinghttp://en.wikipedia.org/wiki/Category:Natural_language_processing_toolkits . 您的问题很常见,您需要为语料库探索不同的方法 .

    您可以在连字例程下找到您的单词分词 . 两种可能的方法是n-gram(其中(例如)4字符子串的频率用于预测边界)并且尝试显示单词的共同开始或结束 . 其中一些可能有助于拼写错误 .

    但是没有简单的答案 - 找到最适合你的方法 .

相关问题