非英语文本中的单词频率:如何合并单复数形式等?

5 sed shell-script text-processing portability natural-language

我正在根据频率对某些文本文件中的法语单词进行排序,重点是洞察力而不是统计意义。挑战在于在塑造单词标记以进行排序的上下文中保留重音字符并处理元音(,)前面的冠词形式l'd'

文件中最常用词的主题有多种形状(1 | 2 | 3 | 4)。所以我使用GNU实用程序组合了这个函数:

compt1 () {
for i in *.txt; do
    echo "File: $i"
    sed -e 's/ /\
/g' <"$i" | sed -e 's/^[[:alpha:]][[:punct:]]\(.*\)/\1/' | sed -e 's/\(.*\)/\L\1/' | grep -hEo "[[:alnum:]_'-]+" | grep -Fvwf /path_to_stop_words_file | sort | uniq -c | sort -rn 
done
}
Run Code Online (Sandbox Code Playgroud)

...换行换行;修剪一个字符,后跟位于行首的标点符号;然后将所有内容转换为小写;使用这种grep匹配单词组成字符的紧凑结构来创建标记;然后去掉停用词,最后就是通常的排序。该站文件包含单个字符,所以你必须要小心,它是如何使用的部分,但提供了关于如何创建分析的话在不同的语言真的很有趣!

现在,当我将重要单词的频率与grep -c直接在文件上的输出进行比较时,我认为它在一定的误差范围内已经足够接近了。


问题

  • 我如何修改它以将复数的频率与其单数形式合并,即共享一个具有不同 1 个字符后缀的公共前缀的单词?
  • 我正在尝试评估该grep部分是否特别适用OSX 上的内容

1. 我无法提供源数据,但我可以提供文件作为示例。词语HEURE朗方在文本提供一个例子。前者在文本中出现两次,其中一次是“l'heure”,有助于验证命令是否有效。后者以单数和复数形式出现(enfant / enfants),在这里合并会受益。

tch*_*ist 11

您真的无法使用简单的sed脚本来做到这一点。我假设你会想要简化为“引用形式”,将所有的屈折折叠成一个基本形式。

这意味着像protégé、protégés、protégée、protégées这样的形容词都算作同一件事,即基本形容词/分词protégé。同样,动词的所有语调protéger -像门生,protégeons,protégeais,protégeasse,protégeâmes,protégeront,protégeraient等-都会降低到基地动词。

这意味着你需要了解语言的屈折形态。更糟糕的是,您将需要了解语言的实际语法,包括变形和区分同形异义词。

我已经使用 Perl 对至少第一部分做了非常简单的方法。这真的很痛苦。这是我用于为伊比利亚半岛上的城镇生成排序键的代码示例:

       # 第 1 条带头文章
          s/^L'//; #加泰罗尼亚语
          s{ ^
            (?:
        #卡斯蒂利亚
                埃尔
              | 洛斯
              | 拉
              | 拉斯

        #加泰罗尼亚语 
              | 埃尔斯
              | 莱斯         
              | 萨
              | 埃斯

        #加莱戈
              | 哦       
              | 操作系统
              | 一种
              | 作为      
            ) 
            \s+ 
          }{}X;
        # 第二条带内部粒子
          s/\b[dl]'//g; #加泰罗尼亚语
          s{ 
            \b
            (?:
                埃尔| 洛杉矶 | 拉 | 拉斯 | 德 | 德尔 | 是的
              | 埃尔斯| 莱斯 | 我| 萨 | es | 德尔斯 # CA
              | ○ | 操作系统 | | 作为 | 做| 达 | 做 | das # GAL
            )
            \b
        {}gx;

这会剥离物品和颗粒,以便它们不计入分拣目的。但是您将不得不使用所谓的卷曲引号处理像l'autre这样的形式,这实际上是 U+2019 RIGHT SINGLE QUOTATION MARK,撇号的首选形式。我首先将它们标准化为直的s/’/'/g

哦,你将不得不处理编码:MacRoman 与 UTF-8 或 ISO-8859-1 不同——远非如此。

老实说,您可能想要使用类似 Snowball 词干算法的东西,指定法语作为语言。当然,Perl 的Lingua::Stem::Snowball模块知道如何做到这一点。您可以使用此查询来搜索与法语语言学有关的 Perl 模块。

但是词干提取只会带您到此为止。除非您应用形态句法分析,否则您不会真正做好工作——这意味着您必须为句子生成解析并将词性分配给那里的每个元素。

这需要做更多的工作。好消息是有专门的工具可以做到这一点,其中一些确实适用于法语。但这确实影响很大,因为现在您已经涉足自然语言处理和计算语言学领域。这些问题在这里没有很好的答案,但在 Linguistics.SE 上可能会得到更好的回答;我不知道。

  • 感谢您抽出时间来揭示潜在的考虑因素。我从来没有考虑过需要特定语言的形态学专业知识 - 但我马上就明白了,因为我读了波特先生的 [take](http://snowball.tartarus.org/algorithms/french/stemmer.html)法语。特别是在第一个非元音之后有元音的区域;和具有相同结构的第二个区域。我想如果我有所有法国词干的词干文件,那么我可以进行比较,将匹配折叠到词干上。我会花更多的时间来分析你写的东西和它的含义。泰! (2认同)

归档时间:

查看次数:

614 次

最近记录:

6 年,9 月 前