Python 检测文本是否为英文(批量)
我正在寻找一种简单的方法来检测文本的简短摘录,几个句子,是否是英语。在我看来,这个问题比试图检测任意语言要容易得多。有没有软件可以做到这一点?我是用python编写的,我更喜欢python库,但其他的东西也可以。我试过谷歌,但后来意识到TOS不允许自动查询。编辑:在这种情况下,这不起作用,因为OP是批量处理文本,这与谷歌的TOS不符 使用谷歌翻译。文档中的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
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):
我最近为此写了一个解决方案。我的解决方案不是傻瓜式的,而且我不认为它在计算大量文本时是可行的,但在我看来,它在小句子中效果很好 假设您有两个文本字符串:
{known English words}
和{所有长度文本的所有子字符串}
的交点(0)
将是L
,因此“LET”可以用(0)->(3)
表示,其中(3)
是M
,所以这就是“LET ME”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