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

Python 检测文本是否为英文(批量),python,nlp,language-detection,Python,Nlp,Language Detection,我正在寻找一种简单的方法来检测文本的简短摘录,几个句子,是否是英语。在我看来,这个问题比试图检测任意语言要容易得多。有没有软件可以做到这一点?我是用python编写的,我更喜欢python库,但其他的东西也可以。我试过谷歌,但后来意识到TOS不允许自动查询。编辑:在这种情况下,这不起作用,因为OP是批量处理文本,这与谷歌的TOS不符 使用谷歌翻译。文档中的Python示例: url = ('https://ajax.googleapis.com/ajax/services/language/de

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

编辑:在这种情况下,这不起作用,因为OP是批量处理文本,这与谷歌的TOS不符

使用谷歌翻译。文档中的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'

我读了一个通过使用

你可以仔细阅读课文,试着找出单词中最常用的三角形。如果使用最多的单词与英语单词中使用最多的单词相匹配,文本可以用英语书写

尝试查看此ruby项目:


尽管不如谷歌自己的好,但我使用ApacheNutchLanguageIdentifier取得了很好的效果,它附带了自己的预训练ngram模型。我在一个包含多种语言的真实世界数据的大型语料库(50GB pdf,大部分为文本)上获得了相当好的结果

它是用Java编写的,但我相信如果你想用Python重新实现它,你可以从中重新阅读ngram配置文件。

Google Translate API,但它需要使用API密钥,你可以免费获取

要检测文本是否为英语,您可以使用我对问题的回答中的函数(使用该API):


我最近为此写了一个解决方案。我的解决方案不是傻瓜式的,而且我不认为它在计算大量文本时是可行的,但在我看来,它在小句子中效果很好

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

  • “让我开始感谢你”
  • “unghsindjfhakjsnfndkuajud”
  • 然后,目标是确定1。可能是英语,而2。事实并非如此。直觉上,我的思维决定这一点的方式是通过在句子中寻找英语单词的单词边界(LET、ME、BEGIN等)。但这在计算上并不简单,因为有重叠的单词(BE、GIN、BEGIN、SAY、SAYING、THANK、THANK等)

    我的方法执行以下操作:

  • {known English words}
    {所有长度文本的所有子字符串}
    的交点
  • 构建一个顶点图,顶点的位置是句子中单词的起始索引,边指向单词末尾后字母的起始位置。例如,
    (0)
    将是
    L
    ,因此“LET”可以用
    (0)->(3)
    表示,其中
    (3)
    M
    ,所以这就是“LET ME”
  • 查找0和
    len(text)
    之间的最大整数
    n
    ,对于该整数,存在从索引0到索引
    n的简单定向路径
  • 将该数字除以文本长度,大致了解文本中有多少百分比是连续的英语单词
  • 请注意,我的代码假定单词之间没有空格。如果你已经有了空间,那么我的方法是愚蠢的,因为我的解决方案的核心是找出空间应该在哪里。(如果您正在阅读本文,并且有空格,那么您可能正在尝试解决一个更复杂的问题。)。另外,为了让我的代码正常工作,您需要一个英文单词列表文件。我从中得到了一个,但是你可以使用任何这样的文件,我想通过这种方式,这种技术也可以扩展到其他语言

    代码如下:

    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%肯定
    letmebeginbysayingthanking
    是英语,8%肯定
    unghsindjfhakjsnfndkuajud
    是英语。听起来不错


    为了将此扩展到更大的文本片段,我的建议是对随机的短子字符串进行二次抽样,并检查它们的“英语性”。希望这有帮助

    可能重复我在这里只要求英语,而不是他们要求任何任意语言的线程。它只适用于英语。@用户查看那里的一些答案,它们可能仍然适用。Google Translate还检测语言,它在检测语言时为您工作。“Google语言检测API必须用于用户生成的语言检测。任何类型的自动或批量查询都是严格禁止的。”。我想这就是为什么提问者也提到了他看到的服务条款,我想他因此想要检测一种没有任何用户输入的语言。@tomlog你可能是对的。我以为他指的是刮GT页面@用户,您能确认您是否正在处理用户生成的字符串吗?我用文本批量查询他们的api,访问被拒绝,并意识到我的问题。我没有使用用户生成的字符串。谢谢@用户:好的,那么这就不行了。我会保留我的答案以供参考(以防其他人出现),但会添加一个便条。无论如何,谢谢!我要说的是,它确实做得很好。当我查看他们的“可靠”标签时,我的筛选列表中没有误报。谢谢!这是一个易于实现的想法,我可以用一小部分测试文本快速测试它,我必须看看它的工作情况!这将需要大量的示例文本。我的一位教授观察到,我的技术可以通过向后而不是向前浏览图表来改进,假设我们通常不看英语。此外,我认为可以使用对分搜索方法进行轻微的改进,以消除不必要的检查-这是否会改善情况,可能取决于输入的英语长度的频率分布。
    In [5]: englishness('LETMEBEGINBYSAYINGTHANKS')
    Out[5]: 0.9583333333333334
    
    In [6]: englishness('UNGHSYINDJFHAKJSNFNDKUAJUD')
    Out[6]: 0.07692307692307693