我正在寻找一种简单的方法来检测短文摘要,几句话是否是英文。在我看来,这个问题比试图检测任意语言容易得多。有没有可以做到这一点的软件?我正在用python编写,并且更喜欢python库,但其他东西也可以。我试过谷歌,但后来意识到TOS不允许自动查询。
答案 0 :(得分:11)
答案 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.可能是英语,而2.则不是。直觉上,我的思维决定这一点的方法是在句子中寻找英语单词的边界(LET,ME,BEGIN等)。但这不是直接的计算,因为有重叠的单词(BE,GIN,BEGIN,SAY,SAYING,THANK,THANKS等)。
我的方法执行以下操作:
{ known English words }
和{ all substrings of the text of all lengths }
。(0)
为L
,因此“LET”可由(0) -> (3)
表示,其中(3)
为M
,因此“让我”。n
之间的最大整数len(text)
,其中存在从索引0到索引n
的简单有向路径。n
除以文字的长度,以大致了解文字的百分比似乎是连续的英文单词。请注意,我的代码假定单词之间没有空格,但我想你可以调整它以相当容易地考虑空格。不是因为我的代码工作,你需要一个英文单词列表文件。我从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
是英语。这听起来是对的!
为了将其扩展到更大的文本,我的建议是对随机短子串进行子采样并检查它们的“英语”。希望这有帮助!