我是否正确地将字符串传递给python库?

TIM*_*MEX -1 python unicode encoding nlp

我正在使用一个名为Guess Language的python库:http://pypi.python.org/pypi/guess-language/0.1

"justwords"是一个带有unicode文本的字符串.我把它粘在包里,但它总是返回英文,即使网页是日文的.有谁知道为什么?我没有正确编码吗?

§ç©ºéå
¶ä»æ¡å°±æ²æéç¨®å¾                                é¤ï¼æä»¥ä¾é裡ç¶ç
éäºï¼åæ­¤ç°å¢æ°£æ°¹³åèµ·ä¾åªè½ç®âå¾å¥½âé常好âåå                 ¶æ¯è¦é»é¤ï¼é¨ä¾¿é»çé»ã飲æãä¸ææ²»ç­åä¸å                                     便å®ï¼æ¯æ´è¥ç   äºï¼æ³æ³é裡以å°é»ãæ¯è§ä¾èªªä¹è©²æpremiumï¼åªæ±é¤é»å¥½å就好äºã<br /><br />é¦åç¾ï¼æä»¥å°±é»å宿´ç         æ­£è¦åä¸ä¸å
ä¸ç                           å¥é¤å§ï¼å



justwords = justwords.encode('utf-8')
true_lang =  str(guess_language.guessLanguage(justwords))
print true_lang
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢你的帮助.这是问题的更新.

我试图"猜测"这个语言:http://feeds.feedburner.com/nchild

基本上,在Python中,我得到了htmlSource.然后,我使用BeautifulSoup剥离标签.然后,我将它传递给图书馆以获取语言.如果我不进行编码('utf-8'),则会出现ASCII错误.所以,这是必须的.

soup = BeautifulStoneSoup(htmlSource)
justwords = ''.join(soup.findAll(text=True))
justwords = justwords.encode('utf-8')
true_lang =  str(guess_language.guessLanguage(justwords))
Run Code Online (Sandbox Code Playgroud)

Joh*_*hin 7

查看主页,它会显示""检测超过60种语言;希腊语(el),韩语(ko),日语(ja),中文(zh)以及trigrams目录中列出的所有语言.""

对于这4种语言,它不使用三元语; 它依赖于输入文本中存在的脚本块.看一下源代码:

if "Katakana" in scripts or "Hiragana" in scripts or "Katakana Phonetic Extensions" in scripts:
    return "ja"

if "CJK Unified Ideographs" in scripts or "Bopomofo" in scripts \
        or "Bopomofo Extended" in scripts or "KangXi Radicals" in scripts:
    return "zh"
Run Code Online (Sandbox Code Playgroud)

对于出现Katakana或Hiragana等脚本名称scripts,此类字符必须包含40%或更多的输入文本(在标准化后删除非字母字符等).某些日文文本可能需要小于40%的阈值.但是,如果这是你的文字的问题,我希望它有超过40%的汉字(CJK统一表意文字),因此应该返回"zh"(中文).

经过一些实验后更新,包括插入一个print语句来显示检测到哪些脚本块的百分比:

来自朝日新闻网的一个典型的新闻:

 49.3 Hiragana
  8.7 Katakana
 42.0 CJK Unified Ideographs
result ja
Run Code Online (Sandbox Code Playgroud)

大概是非典型的同上:

 35.9 Hiragana
 49.2 CJK Unified Ideographs
 13.3 Katakana
  1.6 Halfwidth and Fullwidth Forms
result zh
Run Code Online (Sandbox Code Playgroud)

(看起来根据总数(平假名+片假名)内容进行测试可能是个好主意)

通过机器推送原始首页(XML,HTML,所有内容)的结果:

  2.4 Hiragana
  6.1 CJK Unified Ideographs
  0.1 Halfwidth and Fullwidth Forms
  3.7 Katakana
 87.7 Basic Latin
result ca
Run Code Online (Sandbox Code Playgroud)

Basic Latin的高百分比当然是由于加价.我没有调查是什么让它选择"ca"(加泰罗尼亚语)而不是任何其他使用Basic Latin的语言,包括英语.但是,您打印的gobbledegook没有显示包含标记的任何迹象.

更新结束

更新2

这是一个例子(这个链接有 2个标题和接下来的4个段落),其中大约83%的角色是东亚人,其余的是基本拉丁语,但结果是en(英语).

 29.6 Hiragana
 18.5 Katakana
 34.9 CJK Unified Ideographs
 16.9 Basic Latin
result en
Run Code Online (Sandbox Code Playgroud)

基本拉丁字符是由文本中使用组织的英文名称等引起的.日本统治失败,因为片假名和平假名都没有得到40%(他们一起得分为48.1%).由于中日韩统一表意文字的得分低于40%,中国的统治失败了.因此,83.1%的东亚人物被忽略,结果由16.9%的少数人决定.这些" 腐烂的自治市镇 "规则需要一些改革.一般来说,它可以表达为:

如果(仅语言X使用的脚本块总数)> = X特定阈值,则选择语言X.

如上所述,平假名+片假名> = 40%可能会成为日本人的伎俩.韩国人可能也需要类似的规则.

你的gobbledegook实际上确实包含了一些标记的字符(我没有向右侧滚动到足以看到它),但肯定不足以将所有东亚分数压低到40%以下.所以我们还在等着看你的实际输入是什么以及你是从哪里获得的.

更新结束2

为了帮助诊断您的问题,请不要打印gobbledegook; 使用

print repr(justwords)
Run Code Online (Sandbox Code Playgroud)

这样,任何对实际调试感兴趣的人都有一些工作要做.如果您提供了网页的URL,并显示了用于获取unicode的Python代码,这将有所帮助justwords.请编辑您的答案以显示这3条信息.

更新3感谢您的URL.目视检查表明该语言绝大多数是中文.是什么让你觉得它是日本人?

Semithanks提供一些代码.为了避免你的记者必须为你做你的工作,并避免因猜测而产生误解,你应该总是提供(不要求)一个能够重现你的问题的自包含脚本.请注意,你说你有"ASCII错误"(没有确切的错误消息!没有追溯!)如果你没有.encode('utf8') - 我的代码(见下文)没有这个问题.

不,谢谢你没有提供结果print repr(justwords)(即使被问到).检查已创建的中间数据是一种非常基本且非常有效的调试技术.在提出问题之前,您应该始终这样做.有了这些知识,您可以提出更好的问题.

使用此代码:

# coding: ascii
import sys
sys.path.append(r"C:\junk\wotlang\guess-language\guess_language")
import guess_language
URL = "http://feeds.feedburner.com/nchild"
from BeautifulSoup import BeautifulStoneSoup
from pprint import pprint as pp
import urllib2
htmlSource = urllib2.urlopen(URL).read()
soup = BeautifulStoneSoup(htmlSource)
fall = soup.findAll(text=True)
# pp(fall)
justwords = ''.join(fall)
# justwords = justwords.encode('utf-8')
result = guess_language.guessLanguage(justwords)
print "result", result
Run Code Online (Sandbox Code Playgroud)

我得到了这些结果:

 29.0 CJK Unified Ideographs
  0.0 Extended Latin
  0.1 Katakana
 70.9 Basic Latin
result en
Run Code Online (Sandbox Code Playgroud)

请注意,URL内容不是静态的; 大约一个小时后我得到了:

 27.9 CJK Unified Ideographs
  0.0 Extended Latin
  0.1 Katakana
 72.0 Basic Latin
Run Code Online (Sandbox Code Playgroud)

这些统计数据是通过在第361行附近摆弄得到的,guess_language.py因此它的内容如下:

for key, value in run_types.items():
    pct = (value*100.0) / totalCount # line changed so that pct is a float
    print "%5.1f %s" % (pct, key) # line inserted
    if pct >=40:
        relevant_runs.append(key)
Run Code Online (Sandbox Code Playgroud)

统计数据是中文的症状,包含大量的HTML/XML/Javascript内容(参见前面的例子); 通过查看通过取消评论获得的漂亮印刷品的输出来证实这一点pp(fall)- 很多东西如:

<img style="float:left; margin:0 10px 0px 10px;cursor:pointer; cursor:hand
;" width="60px" src="http://2.bp.blogspot.com/_LBJ4udkQZag/Rm6sTn1b7NI/AAAAAAAAA
FA/bYkSJZ3i2bg/s400/hepinge169.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_507518
3283203730642" alt="\u548c\u5e73\u6771\u8def\u4e00\u6bb5169\u865f" title="\u548c
\u5e73\u6771\u8def\u4e00\u6bb5169\u865f"/>\u4eca\u5929\u4e2d\u5348\u8d70\u523
0\u516c\u53f8\u5c0d\u9762\u76847-11\u8cb7\u98f2\u6599\uff0c\u7a81\u7136\u770b\u5
230\u9019\u500b7-11\u602a\u7269\uff01\u770b\u8d77\u4f86\u6bd4\u6a19\u6e96\u62db\
u724c\u6709\u4f5c\u7528\u7684\u53ea\u6709\u4e2d\u9593\u7684\u6307\u793a\u71c8\u8
00c\u5df2\uff0c\u53ef\u537b\u6709\u8d85\u7d1a\u5927\u7684footprint\uff01<br /
><br /><a href="http://4.bp.blogspot.com/_LBJ4udkQZag/Rm6wHH1b7QI/AA
Run Code Online (Sandbox Code Playgroud)

你需要对标记做些什么.步骤:在XML浏览器中查看原始的"htmlSource".XML不兼容吗?你怎么能避免没有翻译<等?哪些元素的文本内容只是因为它是URL或类似的"英语"?美丽的[石头]汤有问题吗?你应该使用Beautiful [Stone] Soup的其他功能吗?你应该使用lxml吗?

我建议进行一些研究,然后再提出一个新的SO问题.

更新结束3