【问题标题】:How to fix langdetect's instable results如何修复 langdetect 不稳定的结果
【发布时间】:2020-09-01 08:27:47
【问题描述】:

我想使用 langdetect 检测文本中的语言。 根据documentation ,我必须种下种子才能得到稳定的结果。

语言检测算法是不确定的,这意味着如果您尝试在太短或太模糊的文本上运行它,每次运行它可能会得到不同的结果。 要强制执行一致的结果,请在第一种语言检测之前调用以下代码:

如下图,结果好像不行。我错过了什么?

from langdetect import detect, detector_factory, detect_langs

my_string = "Hi, my friend lives next to me. Can you call her? Thibault François. Envoyé depuis mon mobile"

detector_factory.seed = 42

for i in range(5):
    print(detect_langs(my_string), detect(my_string))

结果示例:

[fr:0.7142820855500301, en:0.28571744799229243] en
[fr:0.7142837342663328, en:0.2857140098811736] en
[en:0.571427940246422, fr:0.4285710874902514] fr
[en:0.5714284102904427, fr:0.42857076299207464] fr
[en:0.5714277269187811, fr:0.4285715961184375] fr

【问题讨论】:

    标签: python language-detection


    【解决方案1】:

    如果您使用DetectorFactory(如文档中的建议)而不是detector_factory,它可以工作。

    from langdetect import detect, DetectorFactory, detect_langs
    
    my_string = "Hi, my friend lives next to me. Can you call her? Thibault François. Envoyé depuis mon mobile"
    
    DetectorFactory.seed = 42
    
    for i in range(5):
        print(detect_langs(my_string), detect(my_string))
    

    结果:

    [en:0.5714271973455635, fr:0.42857096898887964] en
    [en:0.5714271973455635, fr:0.42857096898887964] en
    [en:0.5714271973455635, fr:0.42857096898887964] en
    [en:0.5714271973455635, fr:0.42857096898887964] en
    [en:0.5714271973455635, fr:0.42857096898887964] en
    

    【讨论】:

      【解决方案2】:

      Spacy 被这句话弄糊涂了,这是理所当然的。问题在于弄清楚这一点。设置种子会产生稳定但仍可能不一致的东西。考虑对该代码进行以下非常轻微的改动:

      for i in range(5):
          DetectorFactory.seed = 42+i
          print(detect_langs(my_string), detect(my_string))
      

      每次我运行这个,我都会得到

      [en:0.5714271973455635, fr:0.4285709689888797] en
      [fr:0.7142849688010372, en:0.2857145735373333] fr
      [fr:0.7142834322119054, en:0.2857163285762464] fr
      [fr:0.5714278163020392, en:0.4285693437919268] fr
      [fr:0.9999946932803276] fr
      

      因此,如果您一开始的种子是 46 而不是 42,langdetect 会告诉您“我确定这是法语”。这种不一致的行为似乎经常发生在两种语言之间平均分配的文本中。我能想出的最佳策略是:

      1. N 次(N = 5 或 7 或 ...)以某种稳定的方式设置 DetectorFactory.seed,运行 detect_langs() 并记住结果。
      2. 如果 N 种顶级语言不完全相同,则得出 Spacy 混淆的结论,可能是因为多种语言(如这里的情况)或因为文本太短。
      3. 如果语言都相同,请查看中位数分数(或最低分数或...)如果太低,还可以得出 Spacy 混淆的结论。
      4. 接受 Spacy 的结果。

      为了强调 Spacy 的困惑:如果我使用 89 作为种子,detect_langs 返回

      [en:0.7142830387547032, fr:0.2857155716263734]
      

      最后,这个讨论适用于管道的使用。在不设置种子的情况下,如下所示:

          doc = nlp(my_string)
          print(doc._.language["score"])
          print(doc._.language["score"])
      

      可以打印两个不同的分数值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 2015-09-19
        • 2018-03-17
        • 1970-01-01
        • 2014-10-19
        • 2018-06-13
        相关资源
        最近更新 更多