背景
使用Python,我需要得分的存在一个引语,包含约2-7字,一个较长的文本。引文不必精确匹配,但类似的单词应该有相同的顺序。
例如,给定以下长文本
世界上最美丽的事物是看不见或摸不到的,它们是用心去感受的。
下面的引号应该是高(例如,80 /100以上):
我们世界上美丽的事物 世界看不见 他们有一颗心
因为他们不精确,但他们维护秩序。
另一方面,这些引号应该得分为较低的(例如,低于50 / 100):
美丽的心是看不见的 他们是世界上最常见的 这些词甚至没有出现在这篇课文上
因为(前2)完全出现在文本中,但不保留顺序。
问题所在
这一任务不能通过简单地检查文本中每个单词的存在来完成。我不知道哪种算法最适合这个任务。
我试过的
fuzzywuzzy中的大部分函数(partial_token_sort_ratio、token_sort_ratio等)得分较高。partial_ratio确实在早先的条款中得分更高,但是报价
这些词甚至没有出现在这篇课文上
得到52 / 100,这是不合理的高。
我的问题
如上文所述,我如何使用python在较长的文本中计算短引号的存在?
发布于 2018-04-02 20:13:26
我相信你可以通过适应最长增长子序列问题来突破你的障碍。在你的例子中,后缀指的是词的位置,有效地定义“增加”为“出现在最初短语的后面”。你可以通过对出现在引文中的其他单词的轻微奖励来修改它。
例如,给出你的文本
The most beautiful things in the world cannot be seen or touched, they are felt with the heart让我们给这两个引文打分
The beautiful thing in our world
The beautiful heart cannot be felt or seen这些代码将编码到文本的单词位置:
The beautiful thing in our world
1 3 4 5 -1 7
The beautiful heart cannot be felt or seen
1 3 18 8 9 15 11 10第一个词序增加了7个单词中的6个,范围(在文本中)为7个,缺少了一个皮卡尤恩个人代词。第二个词的顺序增加了5个字,“美丽不可见”(取最近的),在10个范围内的8个单词中,三个“回归”(顺序倒置)。
从这里开始,我希望您可以从几个示例中编写自己的评估函数,或者只需选择几个功能定义函数,并将一个简单的模型作为“基本真理”标签提供的分数。我明白了
够让你动了吗?
发布于 2018-04-02 21:05:32
这是一个开放的问题,所以我将尝试添加一些可能有助于使球滚动的想法。它们与你正在尝试的内容重叠,但可能会增加一些洞察力。
您可能需要使用WordNet (NLTK有一个接口)来识别等价类中的单词(例如“感受”~“感觉”和“事物”~“事物”,其中~表示单词等效)。
当你试图获得更好的准确性,你会发现它变得复杂,因为“感觉”可能是一个名词或动词。在名词格中,“感受”不是“感觉”,在动词情况下是“感觉”的过去时态。此外,对于一个短的子字符串,词性标记者更难弄清楚一个单词的哪一部分是词性。在任何情况下,您都应该能够通过WordNet和NLTK (“毡”的WordNet条目)搜索找到等价的单词。
一旦您能够识别目标字符串中的子字符串中的单词,您就可以以几种方式进行操作,其中一些您已经提到了。
我还建议考虑一些类似于最小编辑距离算法的方法来解决问题。您可能希望支持诸如插入单词、删除单词、交换单词和等效的单词替换等操作;并且您希望惩罚诸如单词交换和从更长的引号中缺失的单词。我们的想法是尝试将短引号转换为在更长的引号中匹配为子字符串。
例如:
世界上最美丽的事物是看不见或摸不到的,它们是用心去感受的。
1) "World不能看到“具有编辑距离1,因为您必须在子字符串中添加"be”以匹配目标字符串。
2)“美丽的心不能被感觉或看到”有编辑距离,比如说10.5 (如果你看到一个较小的编辑距离,用那个:)
在这里,我冒昧地分配分数.5来识别不完全相同的单词,并对单词交换处以5的惩罚。我没有因为漏字而受到惩罚。请参阅Damerau-Levenshtein距离,它讨论了可以开始使用的实现的交换。
https://stackoverflow.com/questions/49617980
复制相似问题