- [x] 日语OCR识别错误,[[日语词形相似度算法]] ファ会变成フア,つい会变成っい,アルコール变成アルコ-ル > あんた 何やってんのよ 你在干什么啊 > あなた - [ ] 从相似度的角度来说 あなた 和这个很相似进而来说 な和 ん 应该赋予类似的权重 > はっ酵乳 > 発酵乳 > 新札幌乳業 さわやかのむヨーグルト > 2024-03-27 - [ ] はっ酵乳,这个东西非常难办,不是表外汉字,单纯是书写者的恶趣味,但问题在于这个东西按照自己原来的想法也不太可能解决,只能看有没有关于未收录词预测方面的[[论文]]了。我记得[Mecab](Mecab.md)是有关于这方面的优化,可以读一读是如何做的。 注意到了一个单词ペスト ペースト 这样的单词可能会对[[日语词形相似度算法]]有一定的干扰,本身意思没有任何关系,但自己的算法不会区分二者,但退一步说,自己的目标也不精确预测,也不是纠正不正确的拼写,而是提供可能是辞书形的单词。 - [ ] ほろ酔い ほろ苦い ほの暗い 笑了,[[SudachiDict]] 是把这个作为[[辞书形]]了么 - [ ] べスプラ ベストプラクティス 【best practice】[[外来语]] [[日语词形相似度算法]] 这个其实就非常麻烦了,如果是两个外来词都可以这么干的话 - [ ] ロータリー这个东西好玩在有2个长音符号。 運だめし这个虽然收录了,但问题在于汉字数量和假名的数量居然达到了1:3 的比例做起来可能非常麻烦 > 一駅でアニマる > JR 山手線  > [[2024-12-16]] 最好玩的是辞书形就是【アニマル】,即动物的意思。[[日语词形相似度算法]] [[「コンピュータ」「コンピューター」?カタカナの長音表記の揺らぎ問題の正解を出してみました。 - ふーたらのページ]] 突然想到:计算相似度时,如果是假名的读音可以考虑忽略浊化 重点在自己之前接触的编辑距离算法只适合比较长的文章,日语的单词太短了 - [ ] 统计日语单词的长度,顺便和英语做个比较 - [ ] 自己的算法似乎没有考虑到ペスト ペースト 这样只是单纯长的一样的单词影响,而且这种的区别就是自己之前注意到的长音符号的区别 - [ ] `ルーティング【routing】`和`ルーチン`可以用做 - [ ] 整理下面论文提到的问题 [[『外来語の語形のゆれ(2)』]] [JTF日本語標準スタイルガイド(翻訳用)](JTF日本語標準スタイルガイド(翻訳用).md),关于日语翻译的评判标准,其中也提到了[日语词形相似度算法](日语词形相似度算法.md)关注的问题,可以以这个文件作为标准选取标准型 ## 常用汉字的书写问题 > 程心の時代の商業映画につきものだった==押しつけ==がましさはみじんもなく、物語は長江のようにゆったりと流れて > 押し付け 付不是非常用汉字,但似乎习惯不写汉字,也许是假名就一笔吧233 > 下手でも 楽しく弾くことだけは==心がけ==よ! > 心掛ける [日语词形相似度算法](日语词形相似度算法.md)看来日本人是真的不喜欢写【掛】2333,注意这里的读法不是原来的标准读法 ## 非常用汉字的书写问题 > 「残念なのは、こんな美人が==力ずく==の手段に頼ったことだよ」笑い声の波がさらに大きくなった。 > ちからずく・力尽く [日语词形相似度算法](日语词形相似度算法.md),注意尽字有标记【力▽尽く】 > ラノベにソシャゲに VTuber に==ボコ殴り==な感じで 全然売れなくて > ボコボコ [非辞書](非辞書.md)的v4版本才能解决这样的问题吧,这不是单纯的[日语词形相似度算法](日语词形相似度算法.md)的问题,而是对一个词条的实际意义的拓展,除非在词的意思上进行聚类分析,否则只能构建特殊规则,不过话说话来,拟声拟态词的前2个假名拿出来用的这个用法可以类推的东西么……[MOJi](MOJi.md)的算法应该能解决这个问题 ## 长音标记 > そう思ってるなら==てんちょー==もちゃんとデバッグやって > てんちょう 嗯……这是不是字幕组的错误呢……但严格来说,[非辞書](非辞書.md)的前3代版本都是基于语言学构建规则进行解析的算法的话,[日语词形相似度算法](日语词形相似度算法.md)也应该要解决这个问题才是 [[放送用語委員会●外来語の発音・表記について.pdf]] [[外来語における[ei]の表記のゆれ.pdf]] [[『日本語の正しい表記と用語の辞典 第三版』]] ## 促音 > ==おっつかれさまー== > おつかれさま・お疲れ様 看起来删除特殊的标记方式(促音和长音标记)应该放在最后进行,因为有可能标记符号就是对的东西 > ==たっくさん== > たくさん - [ ] 如果[日语词形相似度算法](日语词形相似度算法.md)是最后一步的话,那可以把っ直接删掉,因为之前进行过查询了 ## 实现 ### Python 实现 飛出す 飛び出す 飛びだす とび出す 飛出す e9a39be587ba111000111000000110011001 飛び出す e9a39b111000111000000110110011e587ba111000111000000110011001 飛びだす e9a39b111000111000000110110011111000111000000110100000111000111000000110011001 とび出す 111000111000000110101000111000111000000110110011e587ba111000111000000110011001 他の単語 e4bb96111000111000000110101110e58d98e8aa9e 可以先在等长范围内查,如果没有的话,再去按照排序后的结果查找,还是没有找到的话,将原字符串取反计算出编号后,再查一次最相似的单词到底是谁,这种方式可以利用二分查找,也不用构建专门的数据集 ```python def convert_bytes(char:str)->str: return char.encode('utf-8') def convert_hex_bytes(utf8_bytes:str)->str: return ''.join(f'{byte:02x}' for byte in utf8_bytes) def convert_binary_bytes(utf8_bytes:str)->str: return ''.join(f'{byte:08b}' for byte in utf8_bytes) def is_japanese_kana(char): # 获取字符的 Unicode 代码点 code_point = ord(char) # 检查是否在平假名或片假名的范围内 if (0x3040 <= code_point <= 0x309F) or (0x30A0 <= code_point <= 0x30FF): return True return False def conert_word(word): word_bytes = "" for char in word: char_bytes = convert_bytes(char) if is_japanese_kana(char): word_bytes += convert_hex_bytes(char_bytes) else: word_bytes += convert_binary_bytes(char_bytes) return word_bytes words = ["飛出す", "飛びだす", "とび出す", "他の単語"] results = {word: conert_word(word) for word in words} stand_word = "飛び出す" import difflib # 定义目标单词和候选列表 word = "飛出す" # 标准形式 # TODO 这里是一个列表233,查起来不会非常慢么2333 possibilities = ["飛び出す", "飛ぶ","飛び立て","飛付く"] # 使用 get_close_matches 查找相似的单词 matches = difflib.get_close_matches(word, possibilities, n=3, cutoff=0.6) print(f"与 '{word}' 最接近的匹配项有: {matches}") import difflib # 要比较的两个字符串 str1 = "飛出す" str2 = "飛び出す" # 创建 SequenceMatcher 对象 matcher = difflib.SequenceMatcher(None, str1, str2) # 获取相似度比例 similarity_ratio = matcher.ratio() print(f"相似度比例: {similarity_ratio:.2f}") ```