按字母顺序将字符串分成几段



我想把给定的字符串分成字符串包含的字母段。例如,如果给出以下字符串:

Los eventos automovilísticos comenzaron poco después de la construcción exitosa de los primeros automóviles a gasolina. El veloz zorro marrón saltó sobre el perezoso perro.
Motoring events began soon after the construction of the first successful gasoline-fueled automobiles. The quick brown fox jumped over the lazy dog.
Мотори су почели убрзо након изградње првих успешних аутомобила на бензин.Брза смеђа лисица је прескочила лењог пса.
Автомобилните събития започнаха скоро след конструирането на първите успешни автомобили с бензиново гориво. Бързата кафява лисица прескочи мързеливото куче.
自動車イベントは、最初の成功したガソリン燃料自動車の製造直後に始まりました。 素早い茶色のキツネは怠け者の犬を飛び越えました。
بدأت أحداث السيارات بعد وقت قصير من بناء أول سيارة ناجحة تعمل بالبنزين. قفز الثعلب البني السريع فوق الكلب الكسول.

以上文本包含西班牙文、英文、塞尔维亚文、保加利亚文、日文、阿拉伯文段落(语言顺序遵循段落顺序)。

然后,在应用了一些神奇的函数之后,我希望得到以下输出:

{
"langs": [
{
"alphabet": "latin",
"text": "Los eventos automovilísticos comenzaron poco después de la construcción exitosa de los primeros automóviles a gasolina. El veloz zorro marrón saltó sobre el perezoso perro. Motoring events began soon after the construction of the first successful gasoline-fueled automobiles. The quick brown fox jumped over the lazy dog."
},
{
"alphabet": "cyrillic",
"text": "Мотори су почели убрзо након изградње првих успешних аутомобила на бензин.Брза смеђа лисица је прескочила лењог пса. Автомобилните събития започнаха скоро след конструирането на първите успешни автомобили с бензиново гориво. Бързата кафява лисица прескочи мързеливото куче."
},
{
"alphabet": "japanese",
"text": "自動車イベントは、最初の成功したガソリン燃料自動車の製造直後に始まりました。 素早い茶色のキツネは怠け者の犬を飛び越えました。"
},
{
"alphabet": "arabic",
"text": "بدأت أحداث السيارات بعد وقت قصير من بناء أول سيارة ناجحة تعمل بالبنزين. قفز الثعلب البني السريع فوق الكلب الكسول."
}
]
}

如你所见,有些语言是按其家族字母分组的。例如,西班牙文和英文段落被归类为拉丁文,塞尔维亚文和保加利亚文段落被归类为西里尔文。这是因为很难找到一种特定的语言(因为大多数字母在不同语言之间是共享的)。

理想情况下,我的最终输出应该是这样的:
{
"langs": [
{
"lang": "spanish",
"text": "Los eventos automovilísticos comenzaron poco después de la construcción exitosa de los primeros automóviles a gasolina. El veloz zorro marrón saltó sobre el perezoso perro."
},
{
"lang": "english",
"text": "Motoring events began soon after the construction of the first successful gasoline-fueled automobiles. The quick brown fox jumped over the lazy dog."
},
{
"lang": "serbian",
"text": "Мотори су почели убрзо након изградње првих успешних аутомобила на бензин.Брза смеђа лисица је прескочила лењог пса."
},
{
"lang": "bulgarian",
"text":"Автомобилните събития започнаха скоро след конструирането на първите успешни автомобили с бензиново гориво. Бързата кафява лисица прескочи мързеливото куче."
},
{
"lang": "japanese",
"text": "自動車イベントは、最初の成功したガソリン燃料自動車の製造直後に始まりました。 素早い茶色のキツネは怠け者の犬を飛び越えました。"
},
{
"lang": "arabic",
"text": "بدأت أحداث السيارات بعد وقت قصير من بناء أول سيارة ناجحة تعمل بالبنزين. قفز الثعلب البني السريع فوق الكلب الكسول."
}
]
}

我需要根据语言将文本分成子字符串。为此,我计划使用cld2,它可以将文本分成句子,但根据我的实验,当字符串包含混合字母(即西里尔字母+日语等)的文本时,它做得不好。然而,cld2在使用共享字母表家族的混合语言(即法语+英语等)的文本上做得很好。

这就是为什么,我计划将文本按字母表家族拆分为子字符串,然后对于每个家族,我将应用cld2来预测特定的语言。

另一个重要要求:

  • 混合语言可能不会像上面的例子那样被清楚地分开(我这样做是为了简单起见,并使问题清楚)
  • 我需要能够做到这一点'离线'不连接到第三方服务器,如谷歌等(因为将有大量的数据需要处理)

如果您对上述问题有任何建议,我将不胜感激。提前谢谢。

下面的解决方案利用谷歌翻译。确保使用pip install googletrans==4.0.0-rc1来安装4.0.0候选版本,以避免潜在的问题。在撰写本文时,其他语言检测包,如langdetect和spacy_langdetect,无法区分塞尔维亚语和马其顿语。

请注意,根据我的经验,所有语言检测模块都符合ISO 639-1语言代码,因此输出将使用这些代码。如果您需要实际的语言名称(例如"西班牙语");您必须编写一个简单的循环,使用生成的languageDict进行转换,而不是";es")。我相信这一点,以及创建json风格的输出,除了你的问题的要点之外,所以我选择省略它。

作为旁注,如果您需要根据字母表对各种语言进行分组,这也可以通过使用生成的languageDict的简单循环来完成。将ISO 639-1语言代码按字母分组,然后以编程方式对文本进行相应的分类。

解决方案
from googletrans import Translator
from collections import defaultdict
text = """
Los eventos automovilísticos comenzaron poco después de la construcción exitosa de los primeros automóviles a gasolina. El veloz zorro marrón saltó sobre el perezoso perro.
Motoring events began soon after the construction of the first successful gasoline-fueled automobiles. The quick brown fox jumped over the lazy dog.
Мотори су почели убрзо након изградње првих успешних аутомобила на бензин.Брза смеђа лисица је прескочила лењог пса.
An additional English sentence to see how it handles this.
Автомобилните събития започнаха скоро след конструирането на първите успешни автомобили с бензиново гориво. Бързата кафява лисица прескочи мързеливото куче.
自動車イベントは、最初の成功したガソリン燃料自動車の製造直後に始まりました。 素早い茶色のキツネは怠け者の犬を飛び越えました。
بدأت أحداث السيارات بعد وقت قصير من بناء أول سيارة ناجحة تعمل بالبنزين. قفز الثعلب البني السريع فوق الكلب الكسول.
"""
translator = Translator()  # Instantiate google translator
languageDict = defaultdict(list)  # Create default dictionary to elegantly store results
for line in text.splitlines():  # Iterate over text split by lines
if line != '':  # Ignore blank lines
detectedLang = translator.detect(line).lang  # Detect language
languageDict[detectedLang].append(line)  # Store line under corresponding language key
print(dict(languageDict))

输出
{
'es': ['Los eventos automovilísticos comenzaron poco después de la construcción exitosa de los primeros automóviles a gasolina. El veloz zorro marrón saltó sobre el perezoso perro.'], 
'en': ['Motoring events began soon after the construction of the first successful gasoline-fueled automobiles. The quick brown fox jumped over the lazy dog.', 'An additional English sentence to see how it handles this.'], 
'sr': ['Мотори су почели убрзо након изградње првих успешних аутомобила на бензин.Брза смеђа лисица је прескочила лењог пса.'], 
'bg': ['Автомобилните събития започнаха скоро след конструирането на първите успешни автомобили с бензиново гориво. Бързата кафява лисица прескочи мързеливото куче.'], 
'ja': ['自動車イベントは、最初の成功したガソリン燃料自動車の製造直後に始まりました。 素早い茶色のキツネは怠け者の犬を飛び越えました。'], 
'ar': ['بدأت أحداث السيارات بعد وقت قصير من بناء أول سيارة ناجحة تعمل بالبنزين. قفز الثعلب البني السريع فوق الكلب الكسول.']
}

相关内容

  • 没有找到相关文章

最新更新