检测文本是否为英文(批量)

时间:2011-01-05 14:20:19

标签: python nlp language-detection

我正在寻找一种简单的方法来检测短文摘要,几句话是否是英文。在我看来,这个问题比试图检测任意语言容易得多。有没有可以做到这一点的软件?我正在用python编写,并且更喜欢python库,但其他东西也可以。我试过谷歌,但后来意识到TOS不允许自动查询。

5 个答案:

答案 0 :(得分:11)

我使用Trigrams

阅读了检测英语的方法

您可以查看文本,并尝试检测单词中最常用的三元组。如果最常用的词与英语单词中使用最多的词匹配,则该文本可能用英语写成

尝试查看这个红宝石项目:

https://github.com/feedbackmine/language_detector

答案 1 :(得分:4)

编辑:在这种情况下这不起作用,因为OP正在批量处理违反谷歌服务条款的文本。

使用Google翻译language detect API。来自docs的Python示例:

url = ('https://ajax.googleapis.com/ajax/services/language/detect?' +
       'v=1.0&q=Hola,%20mi%20amigo!&key=INSERT-YOUR-KEY&userip=INSERT-USER-IP')
request = urllib2.Request(url, None, {'Referer': /* Enter the URL of your site here */})
response = urllib2.urlopen(request)
results = simplejson.load(response)
if results['responseData']['language'] == 'en':
    print 'English detected'

答案 2 :(得分:1)

Altough不如谷歌自己好,我使用Apache Nutch LanguageIdentifier得到了很好的结果,它带有自己的预训练ngram模型。我在几种语言的大型(50GB pdf,主要是文本)真实数据语料库中取得了相当不错的成绩。

它是Java版本,但如果你想在Python中重新实现它,我相信你可以重新读取它的ngram配置文件。

答案 3 :(得分:1)

Google翻译API v2 allows automated queries但需要使用您可以在Google APIs console免费获得的API密钥。

要检测文字是否为英文,您可以使用我对问题detect_language_v2()的回答中的Python - can I detect unicode string language code?函数(使用该API):

 if all(lang == 'en' for lang in detect_language_v2(['some text', 'more text'])):
    # all text fragments are in English

答案 4 :(得分:0)

我最近为此写了一个解决方案。我的解决方案不是万无一失的,我不认为它对于大量的文本来说在计算上是可行的,但在我看来,它适用于小句子。

假设您有两个文本字符串:

  1. “LETMEBEGINBYSAYINGTHANKS”
  2. “UNGHSYINDJFHAKJSNFNDKUAJUD”
  3. 然后目标是确定1.可能是英语,而2.则不是。直觉上,我的思维决定这一点的方法是在句子中寻找英语单词的边界(LET,ME,BEGIN等)。但这不是直接的计算,因为有重叠的单词(BE,GIN,BEGIN,SAY,SAYING,THANK,THANKS等)。

    我的方法执行以下操作:

    1. 选择{ known English words }{ all substrings of the text of all lengths }
    2. 的交集
    3. 构造一个顶点图,其位置是句子中单词的起始索引,在单词结束后有字的起始位置。例如,(0)L,因此“LET”可由(0) -> (3)表示,其中(3)M,因此“让我”。
    4. 查找0到n之间的最大整数len(text),其中存在从索引0到索引n的简单有向路径。
    5. 将该数字n除以文字的长度,以大致了解文字的百分比似乎是连续的英文单词。
    6. 请注意,我的代码假定单词之间没有空格,但我想你可以调整它以相当容易地考虑空格。不是因为我的代码工作,你需要一个英文单词列表文件。我从here得到了一个,但你可以使用任何这样的文件,我想这样这种技术也可以扩展到其他语言。

      以下是代码:

      from collections import defaultdict
      
      # This function tests what percent of the string seems to me to be maybe
      # English-language
      # We use an English words list from here: 
      # https://github.com/first20hours/google-10000-english
      def englishness(maybeplaintext):
          maybeplaintext = maybeplaintext.lower()
          f = open('words.txt', 'r')
          words = f.read()
          f.close()
          words = words.lower().split("\n")
          letters = [c for c in maybeplaintext]
          # Now let's iterate over letters and look for some English!
          wordGraph = defaultdict(list)
          lt = len(maybeplaintext)
          for start in range(0, lt):
              st = lt - start
              if st > 1:
                  for length in range(2, st):
                      end = start + length
                      possibleWord = maybeplaintext[start:end]
                      if possibleWord in words:
                          if not start in wordGraph:
                              wordGraph[start] = []
                          wordGraph[start].append(end)
          # Ok, now we have a big graph of words.
          # What is the shortest path from the first letter to the last letter,
          # moving exclusively through the English language?
          # Does any such path exist?
          englishness = 0
          values = set([a for sublist in list(wordGraph.values()) for a in sublist])
          numberVertices = len(set(wordGraph.keys()).union(values))
          for i in range(2, lt):
              if isReachable(numberVertices, wordGraph, i):
                  englishness = i
          return englishness/lt
      
      # Here I use my modified version of the technique from:
      # https://www.geeksforgeeks.org/
      #   find-if-there-is-a-path-between-two-vertices-in-a-given-graph/
      def isReachable(numberVertices, wordGraph, end):
          visited = [0]
          queue = [0]
          while queue:
              n = queue.pop(0)
              if n == end or n > end:
                  return True
              for i in wordGraph[n]:
                  if not i in visited:
                      queue.append(i)
                      visited.append(i)
          return False
      

      对于我给出的最初示例,这里是I/O

      In [5]: englishness('LETMEBEGINBYSAYINGTHANKS')
      Out[5]: 0.9583333333333334
      
      In [6]: englishness('UNGHSYINDJFHAKJSNFNDKUAJUD')
      Out[6]: 0.07692307692307693
      

      那么大约说来,我96%确定LETMEBEGINBYSAYINGTHANKS是英语,8%肯定UNGHSYINDJFHAKJSNFNDKUAJUD是英语。这听起来是对的!

      为了将其扩展到更大的文本,我的建议是对随机短子串进行子采样并检查它们的“英语”。希望这有帮助!