英文:
Apache Tika Language detection: Asian languages enhancement
问题
我发现 Apache Tika 在处理亚洲语言(例如日语、中文)时经常会出现混淆,尤其是涉及到一些小段的英文文本。
文本示例:
旧金山出生的巧克力店 Dandelion Chocolate 推出了一款焙茶巧克力热饮混合物。不仅可以作为饮料,还可以加在冰淇淋和饼干上。焙茶热巧克力,150克(约5杯分),售价2160日元,版权所有:Dandelion Chocolate Japan。Dandelion Chocolate 是一家从可可豆到巧克力棒的全过程一体化制造商,坚持 "Bean to Bar" 的先驱者。这款热巧克力混合物是根据顾客 "想在家里喝热巧克力!" 的要求开发的产品。与其他巧克力棒一样,我们注重使用来自多米尼加共和国的单一产地可可豆,其苦甜与果味的平衡让人回味无穷,可以品味到可可豆的原始风味。这款热巧克力混合物与京都河源町的日本茶专门店 "YUGEN" 的焙茶相遇。YUGEN 在宇治及周边地区访问各个茶叶生产者,只精选处理日本茶。焙茶是由春季的新芽制成。通过将茶叶慢慢研磨成粉末,并与热巧克力混合,不仅带来了香脆的口感,还保留了味道、甜味和营养成分,呈现出深厚的风味。您可以在网上商店购买,尽情享受巧克力和焙茶在家中的美味组合。Dandelion Chocolate Factory & Café Kura前东京台东区库前4-14-6 电话:03-5833-7270 营业时间:10:00〜20:00(最后点单时间19:30) 不定休 https://dandelionchocolate.jp ※休业至4月12日。其他店铺详细信息请查阅网站。 ※本文中提及的价格为包含8%减税的价格。【相关文章】 突显产地魅力的 "Bean to Bar" 制造。 栗子×可可豆,发扬 "Bean to Bar" 制造理念的栗蓉。
languageDetector.detect() -> en: 中等可信度 (0.570320)
languageDetector.detectAll() -> ArrayList(size=1) en: 中等可信度 (0.570320)
我正在使用默认的语言检测器实现:OptimaizeLangDetector
代码示例:
LanguageDetector languageDetector = LanguageDetector.getDefaultLanguageDetector().loadModels();
languageDetector.addText(text);
var result = languageDetector.detect().getLanguage();
我发现,将文本分成小片段(n-gramms)后,Tika 在 wordLangProbMap
中搜索匹配项。该映射仅基于所有语言的 114k 个 n-gramms 构建。这导致大多数日语符号(n-gramms)在该映射中找不到匹配项,而所有英语 n-gramms 则能够正确识别。结果是,对于日语或中文文本,Tika 经常将语言识别为法语、德语、英语等。
是否有办法扩展匹配项的列表?
我还在考虑其他替代方案,看它们是否能够更好地表现。以前我使用了 lingua,但在处理大型文本时,性能和资源使用情况都有明显的下降。
<details>
<summary>英文:</summary>
I found out that Apache Tika often gets confused with Asian languages (e.g. Japanese, Chinese) with some small pieces of English.
Text sample:
> サンフランシスコ生まれのチョコレートショップ、ダンデライオン・チョコレートからほうじ茶ブレンドの「ホットチョコレートミックス」が新登場。 ドリンクとしてだけでなく、アイスクリームやお餅にかけてもOK。ほうじ茶ホットチョコレート 150g(約5杯分) ¥2,160 ©Dandelion Chocolate Japan カカオ豆からチョコレートバーになるまでの全工程を一貫して行う「ビーン・トゥー・バー(Bean to Bar)」メーカーの先駆け的存在、ダンデライオン・チョコレート。その人気商品ホットチョコレートミックスは「自宅でホットチョコレートを飲みたい!」という客からの要望を元に開発されたものだ。ほかのチョコレートバー同様、カカオ豆はシングルオリジンにこだわり、ほろ苦さとフルーティーな酸味のバランスがよいドミニカ共和国産を使用。カカオ本来の豊かな風味を味わえる。 このホットチョコレートミックスが新たに出合ったのが、京都・河原町の日本茶専門店「YUGEN」のほうじ茶だ。宇治を中心に各地の生産者を訪れ、厳選された日本茶のみを扱うYUGEN。ほうじ茶も春に収穫された新芽だけで作られる。その茶葉を石臼でじっくりと挽き、パウダー状にしてブレンドすることで、香ばしさだけでなく、旨味、甘み、栄養成分までそのまま溶け込む、深みのある味わいのホットチョコレートが誕生。 オンラインストアでも購入できるので、チョコレートとほうじ茶のおいしいマリアージュを自宅で堪能して。 ダンデライオン・チョコレート ファクトリー&カフェ蔵前 東京都台東区蔵前4-14-6 tel:03-5833-7270 営)10時〜20時(L.O. 19時30分) 不定休 https://dandelionchocolate.jp ※4/12まで休業中。そのほかの店舗詳細情報はウェブサイトで要確認。 ※この記事に記載している価格は、軽減税率8%の税込価格です。 【関連記事】 産地の魅力が際立つ、誘惑の「Bean to Bar」。 マロン×カカオ、ビーン・トゥ・バー発想のモンブラン。
languageDetector.detect() -> en: MEDIUM (0.570320)
languageDetector.detectAll() -> ArrayList(size=1) en: MEDIUM (0.570320)
I'm using default LanguageDetector implementation: OptimaizeLangDetector
Code sample:
LanguageDetector languageDetector = LanguageDetector.getDefaultLanguageDetector().loadModels();
languageDetector.addText(text);
var result = languageDetector.detect().getLanguage();
I figured out that after splitting a text into small pieces (n-gramms) Tika searches for the match in `wordLangProbMap`. It's built only from 114k n-gramms for all languages. That leads to the situation when most of the Japanese symbols (n-gramms) are not found in that map, while all english n-gramms are correctly identified. As a result, for either Japanese or Chinese texts Tika often identifies language as a French, German, English and so on.
Is there any way to extend list over which the matching is done?
I'm also considering other alternatives if they could behave in a better way. Previously I used [lingua][1], but it really shows dramatic performance drop and resources usage on big texts.
[1]: https://github.com/pemistahl/lingua
</details>
专注分享java语言的经验与见解,让所有开发者获益!
评论