- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个脚本,它同时移动两个单词中的字符,比较它们以找到不同的字符对。单词长度相等(除了变音符号问题会引入一个额外的字符),并表示仅相隔一个音素的两个法语单词的国际音标发音。
最终目标是过滤 anki 卡片列表,以便仅包含某些音素对,因为其他音素对太容易识别了。每对单词代表一个 anki 注释。
为此,我需要区分鼻音 ɔ̃、ɛ̃ 和 ɑ̃ 形成其他声音,因为它们只会真正与它们自己混淆。
如所写,代码将重音字符视为字符加 ~,以此类推作为两个字符。因此,如果一个单词的唯一区别是最后一个重音字符和重音字符之间的区别,脚本在最后一个字母上没有发现差异,并且按照所写的那样会找到一个比另一个短的单词(另一个仍然有 ~ 左)和尝试比较一个字符时抛出错误。这本身就是一个完整的“问题”,但如果我能让重音字符作为单个单元读取,那么单词将具有相同的长度,并且它会消失。
我不想像某些人那样用非重音字符代替重音字符进行比较,因为它们是不同的声音。
我已经尝试将 unicode ‘标准化’为‘组合’形式,例如unicodedata.normalize('NFKC', line)
,但它没有改变任何东西。
这是一些输出,包括它刚刚抛出错误的行;打印输出显示代码正在比较的每个单词的单词和字符;该数字是单词中该字符的索引。因此,最后一个字母是脚本“认为”这两个字符的内容,它对 ɛ̃ 和 ɛ 的看法是一样的。当它报告差异时,它也会选择错误的字母对,这对是正确的很重要,因为我与允许对的主列表进行比较。
0 alyʁ alɔʁ a a # this first word is done well
1 alyʁ alɔʁ l l
2 alyʁ alɔʁ y ɔ # it doesn't continue to compare the ʁ because it found the difference
...
0 ɑ̃bisjø ɑ̃bisjɔ̃ ɑ ɑ
1 ɑ̃bisjø ɑ̃bisjɔ̃ ̃ ̃ # the tildes are compared / treated separately
2 ɑ̃bisjø ɑ̃bisjɔ̃ b b
3 ɑ̃bisjø ɑ̃bisjɔ̃ i i
4 ɑ̃bisjø ɑ̃bisjɔ̃ s s
5 ɑ̃bisjø ɑ̃bisjɔ̃ j j
6 ɑ̃bisjø ɑ̃bisjɔ̃ ø ɔ # luckily that wasn't where the difference was, this is
...
0 osi ɛ̃si o ɛ # here it should report (o, ɛ̃), not (o, ɛ)
...
0 bɛ̃ bɔ̃ b b
1 bɛ̃ bɔ̃ ɛ ɔ # an error of this type
...
0 bo ba b b
1 bo ba o a # this is working correctly
...
0 bjɛ bjɛ̃ b b
1 bjɛ bjɛ̃ j j
2 bjɛ bjɛ̃ ɛ ɛ # AND here's the money, it thinks these are the same letter, but it has also run out of characters to compare from the first word, so it throws the error below
Traceback (most recent call last):
File "C:\Users\tchak\OneDrive\Desktop\French.py", line 42, in <module>
letter1 = line[0][index]
IndexError: string index out of range
代码如下:
def lens(word):
return len(word)
# open file, and new file to write to
input_file = "./phonetics_input.txt"
output_file = "./phonetics_output.txt"
set1 = ["e", "ɛ", "œ", "ø", "ə"]
set2 = ["ø", "o", "œ", "ɔ", "ə"]
set3 = ["ə", "i", "y"]
set4 = ["u", "y", "ə"]
set5 = ["ɑ̃", "ɔ̃", "ɛ̃", "ə"]
set6 = ["a", "ə"]
vowelsets = [set1, set2, set3, set4, set5, set6]
with open(input_file, encoding="utf8") as ipf, open(output_file, encoding="utf8") as opf:
# for line in file;
vowelpairs= []
acceptedvowelpairs = []
input_lines = ipf.readlines()
print(len(input_lines))
for line in input_lines:
#find word ipa transctipts
unicodedata.normalize('NFKC', line)
line = line.split("/")
line.sort(key = lens)
line = line[0:2] # the shortest two strings after splitting are the ipa words
index = 0
letter1 = line[0][index]
letter2 = line[1][index]
print(index, line[0], line[1], letter1, letter2)
linelen = max(len(line[0]), len(line[1]))
while letter1 == letter2:
index += 1
letter1 = line[0][index] # throws the error here, technically, after printing the last characters and incrementing the index one more
letter2 = line[1][index]
print(index, line[0], line[1], letter1, letter2)
vowelpairs.append((letter1, letter2))
for i in vowelpairs:
for vowelset in vowelsets:
if set(i).issubset(vowelset):
acceptedvowelpairs.append(i)
print(len(vowelpairs))
print(len(acceptedvowelpairs))
最佳答案
Unicode 规范化对描述的特定字符组合没有帮助,因为摘自 Unicode database UnicodeData.Txt
使用简单的正则表达式 "Latin.*Letter.*with tilde$"
给出 ÃÑÕãñõĨĩŨũṼṽẼẽỸỹ
(没有拉丁字母 Open O
,Open E
或 Alpha
)。因此,您需要按如下方式分别遍历两个比较的字符串(省略了上面 a Minimal, Reproducible Example 的大部分代码):
import unicodedata
def lens(word):
return len(word)
input_lines = ['alyʁ/alɔʁ', 'ɑ̃bisjø/ɑ̃bisjɔ̃ ', 'osi/ɛ̃si', 'bɛ̃ /bɔ̃ ', 'bo/ba', 'bjɛ/bjɛ̃ ']
print(len(input_lines))
for line in input_lines:
print('')
#find word ipa transctipts
line = unicodedata.normalize('NFKC', line.rstrip('\n'))
line = line.split("/")
line.sort(key = lens)
word1, word2 = line[0:2] # the shortest two strings after splitting are the ipa words
index = i1 = i2 = 0
while i1 < len(word1) and i2 < len(word2):
letter1 = word1[i1]
i1 += 1
if i1 < len(word1) and unicodedata.category(word1[i1]) == 'Mn':
letter1 += word1[i1]
i1 += 1
letter2 = word2[i2]
i2 += 1
if i2 < len(word2) and unicodedata.category(word2[i2]) == 'Mn':
letter2 += word2[i2]
i2 += 1
same = chr(0xA0) if letter1 == letter2 else '#'
print(index, same, word1, word2, letter1, letter2)
index += 1
#if same != chr(0xA0):
# break
输出:.\SO\67335977.py
6
0 alyʁ alɔʁ a a
1 alyʁ alɔʁ l l
2 # alyʁ alɔʁ y ɔ
3 alyʁ alɔʁ ʁ ʁ
0 ɑ̃bisjø ɑ̃bisjɔ̃ ɑ̃ ɑ̃
1 ɑ̃bisjø ɑ̃bisjɔ̃ b b
2 ɑ̃bisjø ɑ̃bisjɔ̃ i i
3 ɑ̃bisjø ɑ̃bisjɔ̃ s s
4 ɑ̃bisjø ɑ̃bisjɔ̃ j j
5 # ɑ̃bisjø ɑ̃bisjɔ̃ ø ɔ̃
0 # osi ɛ̃si o ɛ̃
1 osi ɛ̃si s s
2 osi ɛ̃si i i
0 bɛ̃ bɔ̃ b b
1 # bɛ̃ bɔ̃ ɛ̃ ɔ̃
2 bɛ̃ bɔ̃
0 bo ba b b
1 # bo ba o a
0 bjɛ bjɛ̃ b b
1 bjɛ bjɛ̃ j j
2 # bjɛ bjɛ̃ ɛ ɛ̃
注意:变音符号测试为 Unicode 类别 Mn
;您可以针对另一个条件进行测试(例如来自以下列表):
Mn Nonspacing_Mark:
非间距组合标记(零提前宽度)Mc Spacing_Mark :
一个间距组合标记(正向前进宽度)Me Enclosing_Mark :
一个封闭的组合标记M 标记:
Mn |麦克 |我
关于python - 如何将带有变音符号 ɔ̃、ɛ̃ 和 ɑ̃ 的字符与 python 中的无重音符号(从 utf-8 编码的文本文件导入)进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67335977/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
为什么在 C# 中添加两个 char 结果是 int 类型? 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr 变量变为 int 类型。我希望它是
下面的代码可以编译,但 char 类型的行为与 int 类型的行为不同。 特别是 cout ::ikIsX >() ::ikIsX >() ::ikIsX >() using names
我正在寻找一个正则表达式,它可以匹配长度为 1 个或多个字符但不匹配 500 的内容。这将在 Rails 路由文件中使用,特别是用于处理异常。 路线.rb match '/500', to: 'err
对于 C 编程作业,我正在尝试编写几个头文件来检查所谓的“X 编程语言”的语法。我最近才开始,正在编写第一个头文件。这是我编写的代码: #ifndef _DeclarationsChecker_h_
为什么扩展的 ascii 字符(â、é 等)被替换为 字符? 我附上了一张图片...但我正在使用 PHP 从 MySQL 中提取数据,其中一些位置有扩展字符...我使用的是 Arial 字体。 您可以
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
如何将 ANSI 字符 (char) 转换为 Unicode 字符 (wchar_t),反之亦然? 是否有用于此目的的任何跨平台源代码? 最佳答案 是的,在 中你有mbstowcs()和 wcsto
函数 fromCharCode 不适用于国际 ANSI 字符。例如,对于 ID 为 192 到 223 的俄语 ANSI (cp-1251) 字符,它返回特殊字符。如何解决这个问题? 我认为,需要将A
如果不喜欢,我想隐藏 id,但不起作用 SELECT * FROM character, character_actor WHERE character.id NOT LIKE character_a
现在这个程序成功地反转了键盘输入的单词。但是我想在我反转它之前“保存”指针中的单词,所以我可以比较两者,反转的和“原始的”,并检查它们是否是回文。我还没有太多经验,可能会出现比我知道的更多的错误,但我
Memcpy 和 memcmp 函数可以接受指针变量吗? char *p; char* q; memcpy(p,q,10); //will this work? memcmp(p,q,10); //w
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题: 使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成
我有一个奇怪的问题。我需要从 stat 命令打印输出字符串。 我已经编写了获取一些信息的代码。 import glob import os for file in glob.glob('system1
我正在使用 Java 并具有其值如下所示的字符串, String data = "vale-cx"; data = data.replaceAll("\\-", "\\-\\"); 我正在替换其中的“
String urlParameters = "login=test&password=te&ff"; 我有一个String urlParams,& - 是密码的一部分,如何使其转义,从而不被识别为分
大家好,我只想从此字符串中提取第一个字母: String str = "使 徒 行 傳 16:31 ERV-ZH"; 我只想获取这些字符: 使 徒 行 傳 并且不包括 ERV-ZH 仅数
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
所以, 我有一个字符**;它本质上是一个句子,带有指向该句子中每个单词的指针;即 'h''i''\0''w''o''r''l''d''\0''y''a''y''!''\0' 在这种情况下,我希望使用可
这个问题在这里已经有了答案: Using quotation marks inside quotation marks (12 个答案) 关闭 7 年前。 如何打印 " 字符? 我知道打印 % 符号
我是一名优秀的程序员,十分优秀!